#ifndef __AST_HPP__ #define __AST_HPP__ 1 #include #include using namespace std; class ExprAST { public: virtual ~ExprAST(); virtual void codegen() const = 0; }; class NumberExprAST : public ExprAST { public: NumberExprAST(double d) :_d(d) {} void codegen() const; private: double _d; }; class VariableExprAST : public ExprAST { public: VariableExprAST(string v) :_v(v) {} void codegen() const; private: string _v; }; class InnerExprAST : public ExprAST { public: InnerExprAST(ExprAST* e1); InnerExprAST(ExprAST* e1, ExprAST* e2); InnerExprAST(ExprAST* e1, ExprAST* e2, ExprAST* e3); InnerExprAST(vector v) :_v(v) {} ~InnerExprAST(); private: InnerExprAST(const InnerExprAST&); InnerExprAST& operator=(const InnerExprAST&); protected: vector _v; }; class AddExprAST : public InnerExprAST { public: AddExprAST(ExprAST* e1, ExprAST* e2) :InnerExprAST(e1, e2) {} void codegen() const; }; class SubExprAST : public InnerExprAST { public: SubExprAST(ExprAST* e1, ExprAST* e2) :InnerExprAST(e1, e2) {} void codegen() const; }; class MulExprAST : public InnerExprAST { public: MulExprAST(ExprAST* e1, ExprAST* e2) :InnerExprAST(e1, e2) {} void codegen() const; }; class DivExprAST : public InnerExprAST { public: DivExprAST(ExprAST* e1, ExprAST* e2) :InnerExprAST(e1, e2) {} void codegen() const; }; class CallExprAST : public InnerExprAST { public: CallExprAST(string f, vector v) : InnerExprAST(v), _f(f) {} void codegen() const; private: string _f; }; class PrototypeAST { public: PrototypeAST(string f, vector args) :_f(f), _args(args) {} void codegen() const; private: string _f; vector _args; }; class FunctionAST { public: FunctionAST(const PrototypeAST &p, ExprAST *e) :_proto(p), _e(e) {} ~FunctionAST(); void codegen() const; private: FunctionAST(const FunctionAST&); FunctionAST& operator=(const FunctionAST&); PrototypeAST _proto; ExprAST *_e; }; #endif