#ifndef __AST_HPP__ #define __AST_HPP__ 1 #include #include using namespace std; class SynTree { public: virtual void compile() const = 0; virtual ~SynTree() { } }; class Number : public SynTree { public: Number(int num) :_num(num) {} void compile() const; private: int _num; }; class Variable : public SynTree { public: Variable(string name) :_name(name) {} void compile() const; private: string _name; }; class InnerSynTree : public SynTree { public: InnerSynTree(vector v) :_v(v) {} InnerSynTree(SynTree *t); InnerSynTree(SynTree *l, SynTree *r); ~InnerSynTree(); private: InnerSynTree(const InnerSynTree&); InnerSynTree& operator=(const InnerSynTree&); protected: vector _v; }; class Add : public InnerSynTree { public: Add(SynTree *l, SynTree *r) :InnerSynTree(l, r) {} void compile() const; }; class Sub : public InnerSynTree { public: Sub(SynTree *l, SynTree *r) :InnerSynTree(l, r) {} void compile() const; }; class Mul : public InnerSynTree { public: Mul(SynTree *l, SynTree *r) :InnerSynTree(l, r) {} void compile() const; }; class Div : public InnerSynTree { public: Div(SynTree *l, SynTree *r) :InnerSynTree(l, r) {} void compile() const; }; class Lt : public InnerSynTree { public: Lt(SynTree *l, SynTree *r) :InnerSynTree(l, r) {} void compile() const; }; class Gt : public InnerSynTree { public: Gt(SynTree *l, SynTree *r) :InnerSynTree(l, r) {} void compile() const; }; class Assign : public InnerSynTree { public: Assign(string id, SynTree *t) :InnerSynTree(t), _id(id) {} void compile() const; private: string _id; }; class Print : public InnerSynTree { public: Print(SynTree* t) :InnerSynTree(t) {} void compile() const; }; class Block : public InnerSynTree { public: Block(vector v) :InnerSynTree(v) {} void compile() const; }; class While : public InnerSynTree { public: While(SynTree *c, SynTree *b) :InnerSynTree(c, b) {} void compile() const; }; class Empty : public SynTree { public: void compile() const; }; #endif