#ifndef __SYN_TREE_HPP__ #define __SYN_TREE_HPP__ 1 #include #include using namespace std; class SynTree { public: virtual void compile() const = 0; virtual ~SynTree(); }; class Constant : public SynTree { public: Constant(int v) :_v(v) {} void compile() const; private: int _v; }; class Variable : public SynTree { public: Variable(string s) :_s(s) {} void compile() const; string getName() const; private: string _s; }; class InnerTree : public SynTree { public: InnerTree(SynTree* a); InnerTree(SynTree* a, SynTree* b); InnerTree(SynTree* a, SynTree* b, SynTree* c); InnerTree(vector v); ~InnerTree(); private: InnerTree(const InnerTree& i); InnerTree& operator=(const InnerTree& i); protected: vector _nodes; }; class Add : public InnerTree { public: Add(SynTree* a, SynTree* b) :InnerTree(a, b) {} void compile() const; }; class Sub : public InnerTree { public: Sub(SynTree* a, SynTree* b) :InnerTree(a, b) {} void compile() const; }; class Mul : public InnerTree { public: Mul(SynTree* a, SynTree* b) :InnerTree(a, b) {} void compile() const; }; class Div : public InnerTree { public: Div(SynTree* a, SynTree* b) :InnerTree(a, b) {} void compile() const; }; class Print : public InnerTree { public: Print(SynTree* a) :InnerTree(a) {} void compile() const; }; class Assign : public InnerTree { public: Assign(SynTree* a, SynTree* b) :InnerTree(a, b) {} void compile() const; }; class Seq : public InnerTree { public: Seq(vector v) :InnerTree(v) {} void compile() const; }; #endif