#ifndef __AST_HPP__ #define __AST_HPP__ 1 #include #include using namespace std; class SynTree { public: virtual void compile() const = 0; virtual ~SynTree(); }; class Constant : public SynTree { public: Constant(int i) :_i(i) {} void compile() const; private: int _i; }; class Variable : public SynTree { public: Variable(string s) :_s(s) {} void compile() const; string getName() const { return _s; } private: string _s; }; class InnerTree : public SynTree { public: InnerTree(vector v) :_v(v) {} InnerTree(SynTree *s); InnerTree(SynTree *s1, SynTree *s2); InnerTree(SynTree *s1, SynTree *s2, SynTree *s3); ~InnerTree(); private: InnerTree(const InnerTree& i); InnerTree& operator=(const InnerTree& i); protected: vector _v; }; class Add : public InnerTree { public: Add(SynTree *s1, SynTree *s2) :InnerTree(s1, s2) {} void compile() const; }; class Sub : public InnerTree { public: Sub(SynTree *s1, SynTree *s2) :InnerTree(s1, s2) {} void compile() const; }; class Mul : public InnerTree { public: Mul(SynTree *s1, SynTree *s2) :InnerTree(s1, s2) {} void compile() const; }; class Div : public InnerTree { public: Div(SynTree *s1, SynTree *s2) :InnerTree(s1, s2) {} void compile() const; }; class Lt : public InnerTree { public: Lt(SynTree *s1, SynTree *s2) :InnerTree(s1, s2) {} void compile() const; }; class Gt : public InnerTree { public: Gt(SynTree *s1, SynTree *s2) :InnerTree(s1, s2) {} void compile() const; }; class Assign : public InnerTree { public: Assign(SynTree *s1, SynTree *s2) :InnerTree(s1, s2) {} void compile() const; }; class Print : public InnerTree { public: Print(SynTree *s) :InnerTree(s) {} void compile() const; }; class Block : public InnerTree { public: Block(vector v) :InnerTree(v) {} void compile() const; }; class While : public InnerTree { public: While(SynTree *s1, SynTree *s2) :InnerTree(s1, s2) {} void compile() const; }; class Empty : public SynTree { void compile() const; }; #endif