#ifndef AST_PRINT_HH #define AST_PRINT_HH #include "ast.hh" namespace AbSyn { class Printer : public Visitor { ostream & os; public: virtual void symbol(Symbol * sym) { os << "("; sym::path_t const path = sym->get_path(); for (sym::path_t::const_iterator i = sym->get_path().begin(); i != path.end(); ++i) { os << *i << "."; } os << sym->get_sym() << ")"; } virtual void binding(BindingTerm * t) { os << "("; if (t->get_exported()) { os << "export "; } t->get_pat().accept(*this); os << " = "; t->get_val().accept(*this); os << ")"; } virtual void pair(PairTerm * t) { os << "("; t->get_left().accept(*this); os << ", "; t->get_right().accept(*this); os << ")"; } virtual void app(AppTerm * t) { os << "("; t->get_fun().accept(*this); os << " "; t->get_arg().accept(*this); os << ")"; } virtual void seq(SeqTerm * t) { for (SeqTerm::iterator it = t->begin(); it != t->end(); ++it) { it->accept(*this); os << ";"; } } virtual void form(Form * f) { os << "{"; f->get_preamble().accept(*this); for (Cases::generator g = f->cases_gen(); g.last_case(); g.next_case()) { os << "case"; g.current_pattern().accept(*this); for (g.first_guard(); g.last_guard(); g.next_guard()) { os << "|"; g.current_guard().accept(*this); os << ":"; g.current_expr().accept(*this); } } for (Cases::generator g = f->catches_gen(); g.last_case(); g.next_case()) { os << "catch"; g.current_pattern().accept(*this); for (g.first_guard(); g.last_guard(); g.next_guard()) { os << "|"; g.current_guard().accept(*this); os << ":"; g.current_expr().accept(*this); } } os << "finally"; f->get_finally().accept(*this); os << "}"; } virtual void skip(SkipTerm *) { os << "<>"; } virtual void op(OpAppTerm * t) { os << "("; t->get_op().accept(*this); t->get_larg().accept(*this); t->get_rarg().accept(*this); os << ")"; } virtual void opdirective(OperatorDirective *) { os << "<>"; } virtual void usedirective(UseDirective *) { os << "<>"; } }; } #endif /* AST_PRINT_HH */