#ifndef CXX_CODEGEN_HH #define CXX_CODEGEN_HH #include "visitor.hh" #include namespace codegen { class CXXCodeGen : public ast::Visitor{ protected: std::ostream &_hh_os; std::ostream &_cc_os; const char *_method_name; public: CXXCodeGen(std::ostream &hh_os, std::ostream &cc_os, const char *method_name = "fill_table") : _hh_os(hh_os), _cc_os(cc_os), _method_name(method_name) {} ~CXXCodeGen() {} void print_parameters (std::ostream &os); void print_globals (std::ostream &os); void print_locals (std::ostream &os); void emit_matrix_index (ast::Update &update); void emit_matrix_index (ast::MatrixExpr &matrix_expr); virtual void visit (ast::BinRelLT <); virtual void visit (ast::BinRelLTE <e); virtual void visit (ast::BinRelGT >); virtual void visit (ast::BinRelGTE >e); virtual void visit (ast::BinRelEQ &eq); virtual void visit (ast::BinRelNEQ &neq); virtual void visit (ast::RExpr &rexpr); virtual void visit (ast::Range &range); virtual void visit (ast::Values &values); virtual void visit (ast::SimpleFun &simple_fun); virtual void visit (ast::IDExpr &id_expr); virtual void visit (ast::IntegerExpr &integer_expr); virtual void visit (ast::MatrixExpr &matrix_expr); virtual void visit (ast::FunCallExpr &fun_call_expr); virtual void visit (ast::BinOpExpr &binop_expr); virtual void visit (ast::NEGExpr &neg_expr); virtual void visit (ast::RelBExpr &bexpr); virtual void visit (ast::ANDBExpr &bexpr); virtual void visit (ast::ORBExpr &bexpr); virtual void visit (ast::NOTBExpr &bexpr); virtual void visit (ast::TrueExpr &bexpr); virtual void visit (ast::Update &update); virtual void visit (ast::DProg &dprog); }; void cxx_emit_code (ast::DProg *dprog, const char *output_name); }; #endif // CXX_CODEGEN_HH