#ifndef __AST_HPP__ #define __AST_HPP__ 1 #include #include using namespace std; class ExprAST { public: virtual ~ExprAST(); }; class NumberExprAST : public ExprAST { public: NumberExprAST(int v) :Val(v) {} private: int Val; }; class VariableExprAST : public ExprAST { public: VariableExprAST(string s) :Name(s) {} string getName() const; private: string Name; }; class InnerExprAST : public ExprAST { public: InnerExprAST(ExprAST* a); InnerExprAST(ExprAST* a, ExprAST* b); InnerExprAST(ExprAST* a, ExprAST* b, ExprAST* c); InnerExprAST(vector a); ~InnerExprAST(); protected: vector _nodes; private: InnerExprAST(const InnerExprAST& i); InnerExprAST& operator=(const InnerExprAST& i); }; class AddExprAST : public InnerExprAST { public: AddExprAST(ExprAST* a, ExprAST* b) :InnerExprAST(a, b) {} }; class SubExprAST : public InnerExprAST { public: SubExprAST(ExprAST* a, ExprAST* b) :InnerExprAST(a, b) {} }; class MulExprAST : public InnerExprAST { public: MulExprAST(ExprAST* a, ExprAST* b) :InnerExprAST(a, b) {} }; class DivExprAST : public InnerExprAST { public: DivExprAST(ExprAST* a, ExprAST* b) :InnerExprAST(a, b) {} }; class CallExprAST : public InnerExprAST { public: CallExprAST(string callee, vector v) :InnerExprAST(v), Callee(callee) {} private: string Callee; }; #endif