#include "ast.hh" #include "visitor.hh" using namespace ast; #include #include int yyparse(); ast::DProg *dprog = 0; // most of the ast testing is done with the pprint test and the // analysis tests, here we just check the traversal (in a *very* // simple manner). class Counter : public Visitor { int _count; public: Counter() : _count(0) { }; int count() const { return _count; } virtual void visit (RExpr &rexpr) { _count++; } virtual void visit (WhenExpr &when_expr) { _count++; } virtual void visit (WhereExpr &where_expr) { _count++; } virtual void visit (Range &range) { _count++; } virtual void visit (Values &values) { _count++; } virtual void visit (SimpleFun &simple_fun) { _count++; } virtual void visit (IDExpr &id_expr) { _count++; } virtual void visit (IntegerExpr &integer_expr) { _count++; } virtual void visit (MatrixExpr &matrix_expr) { _count++; } virtual void visit (FunCallExpr &fun_call_expr) { _count++; } virtual void visit (BinOpExpr &binop_expr) { _count++; } virtual void visit (NEGExpr &neg_expr) { _count++; } virtual void visit (RelBExpr &bexpr) { _count++; } virtual void visit (ANDBExpr &bexpr) { _count++; } virtual void visit (ORBExpr &bexpr) { _count++; } virtual void visit (NOTBExpr &bexpr) { _count++; } virtual void visit (TrueExpr &bexpr) { _count++; } virtual void visit (Update &update) { _count++; } virtual void visit (ValDeclaration &val_decl) { _count++; } virtual void visit (FunDeclaration &fun_decl) { _count++; } virtual void visit (MatrixDeclaration &matrix_decl) { _count++; } virtual void visit (DProg &dprog) { _count++; } }; int main (int argc, char *argv[]) { FILE *f; /* FIXME: I really want some "real" option parsing here... */ /* re-open 'stdin' and 'stdout' if these are given on the command * line */ if (argv[1] != NULL) { f = freopen(argv[1], "r", stdin); if (f == NULL) { std::cerr << "Couldn't open input file `" << argv[1] << "'\n"; exit(1); } } yyparse(); if (!dprog) return 2; // parse error! Counter c; dprog->accept_top_down(c); std::cout << "counted " << c.count() << " ast-nodes\n"; return 0; }