#include "pretty_printer.hh" using namespace ast; #include using namespace std; void PrettyPrinter::visit(BinRelLT &) { _os << " < "; } void PrettyPrinter::visit(BinRelLTE &) { _os << " <= "; } void PrettyPrinter::visit(BinRelGT &) { _os << " > "; } void PrettyPrinter::visit(BinRelGTE &) { _os << " >= "; } void PrettyPrinter::visit(BinRelEQ &) { _os << " = "; } void PrettyPrinter::visit(BinRelNEQ &) { _os << " != "; } void PrettyPrinter::visit(RExpr &rexpr) { rexpr.begin()->accept(*this); rexpr.begin_br()->accept(*this); _os << rexpr.index(); rexpr.end_br()->accept(*this); rexpr.end()->accept(*this); } void PrettyPrinter::visit(WhereExpr &where_expr) { where_expr.fun()->accept(*this); _os << " where "; const list *rexpr_list = where_expr.rexpr_list(); list::const_iterator i = rexpr_list->begin(); (*i)->accept(*this); for (++i; i != rexpr_list->end(); ++i) { _os << " and "; (*i)->accept(*this); } } void PrettyPrinter::visit(WhenExpr &when_expr) { when_expr.fun()->accept(*this); _os << " when "; when_expr.bexpr()->accept(*this); } void PrettyPrinter::visit(Range &range) { _os << range.id() << '{'; range.where_expr()->accept(*this); _os << '}'; } void PrettyPrinter::visit(Values &values) { _os << values.id() << '{'; const list *when_expr_list = values.when_expr_list(); list::const_iterator i = when_expr_list->begin(); (*i)->accept(*this); for (++i; i != when_expr_list->end(); ++i) { _os << ','; (*i)->accept(*this); } _os << '}'; } void PrettyPrinter::visit(SimpleFun &simple_fun) { simple_fun.expr()->accept(*this); } void PrettyPrinter::visit(IDExpr &id_expr) { _os << id_expr.id(); } void PrettyPrinter::visit(IntegerExpr &integer_expr) { _os << integer_expr.integer(); } void PrettyPrinter::visit(MatrixExpr &matrix_expr) { _os << matrix_expr.id() << '['; const list *expr_list = matrix_expr.expr_list(); list::const_iterator i = expr_list->begin(); (*i)->accept(*this); for (++i; i != expr_list->end(); ++i) { _os << ','; (*i)->accept(*this); } _os << ']'; } void PrettyPrinter::visit(FunCallExpr &matrix_expr) { _os << matrix_expr.id() << '('; const list *expr_list = matrix_expr.expr_list(); list::const_iterator i; bool first = true; for (i = expr_list->begin(); i != expr_list->end(); ++i) { if (!first) _os << ','; first = false; (*i)->accept(*this); } _os << ')'; } void PrettyPrinter::visit(BinOpExpr &binop_expr) { _os << '('; binop_expr.left()->accept(*this); _os << ' ' << binop_expr.binop() << ' '; binop_expr.right()->accept(*this); _os << ')'; } void PrettyPrinter::visit(NEGExpr &nexpr) { _os << '-'; nexpr.expr()->accept(*this); } void PrettyPrinter::visit(RelBExpr &bexpr) { _os << '('; bexpr.left()->accept(*this); bexpr.rel()->accept(*this); bexpr.right()->accept(*this); _os << ')'; } void PrettyPrinter::visit(ANDBExpr &bexpr) { _os << '('; bexpr.left()->accept(*this); _os << " and "; bexpr.right()->accept(*this); _os << ')'; } void PrettyPrinter::visit(ORBExpr &bexpr) { _os << '('; bexpr.left()->accept(*this); _os << " or "; bexpr.right()->accept(*this); _os << ')'; } void PrettyPrinter::visit(NOTBExpr &bexpr) { _os << '!'; bexpr.bexpr()->accept(*this); } void PrettyPrinter::visit(TrueExpr &bexpr) { _os << "true"; } void PrettyPrinter::visit(Update &update) { _os << update.type() << ' ' << update.name() << '['; const list *indices = update.indices(); list::const_iterator i = indices->begin(); _os << *i; for (++i; i != indices->end(); ++i) _os << ',' << *i; _os << "] = "; update.fun()->accept(*this); } void PrettyPrinter::visit(ValDeclaration &val_decl) { _os << "val " << val_decl.name() << " : " << val_decl.type() << ' '; } void PrettyPrinter::visit(FunDeclaration &fun_decl) { _os << "fun " << fun_decl.name() << '('; const char *sep = ""; list::const_iterator i; const list *par_types = fun_decl.parameter_types(); for (i = par_types->begin(); i != par_types->end(); ++i) { _os << sep << *i; sep = ", "; } _os << ')' << " : " << fun_decl.return_type() << ' '; } void PrettyPrinter::visit(MatrixDeclaration &matrix_decl) { _os << "matrix " << matrix_decl.name() << '['; list *dims = matrix_decl.dim_list(); list::const_iterator i; const char *sep = ""; for (i = dims->begin(); i != dims->end(); ++i) { _os << sep; (*i)->accept(*this); sep = ", "; } _os << ']' << " : " << matrix_decl.type() << ' '; } void PrettyPrinter::visit(DProg &dprog) { bool in_end_p = false; const list *globals = dprog.globals(); if (globals->begin() != globals->end()) { _os << "globals "; list::const_iterator g_itr; for (g_itr = globals->begin(); g_itr != globals->end(); ++g_itr) (*g_itr)->accept(*this); in_end_p = true; } const list *parameters = dprog.parameters(); if (parameters->begin() != parameters->end()) { _os << "parameters "; list::const_iterator p_itr; for (p_itr = parameters->begin(); p_itr != parameters->end(); ++p_itr) (*p_itr)->accept(*this); in_end_p = true; } const list *locals = dprog.locals(); if (locals->begin() != locals->end()) { _os << "locals "; list::const_iterator l_itr; for (l_itr = locals->begin(); l_itr != locals->end(); ++l_itr) (*l_itr)->accept(*this); in_end_p = true; } if (in_end_p) _os << "in "; const list *update_list = dprog.update_list(); list::const_iterator u_itr = update_list->begin(); (*u_itr)->accept(*this); for (u_itr++ ; u_itr != update_list->end(); ++u_itr) { _os << ' '; (*u_itr)->accept(*this); } _os << " where "; const list *rexpr_list = dprog.rexpr_list(); list::const_iterator re_itr = rexpr_list->begin(); (*re_itr)->accept(*this); for (++re_itr; re_itr != rexpr_list->end(); ++re_itr) { _os << " and "; (*re_itr)->accept(*this); } if (in_end_p) _os << " end"; _os << endl; }