#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: double Val; }; class VariableExprAST : public ExprAST { public: VariableExprAST(string s) :Name(s) {} 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 name, vector s) :InnerExprAST(s), Callee(name) {} private: string Callee; }; #endif