#ifndef __SYN_TREE_HPP__ #define __SYN_TREE_HPP__ 1 #include #include #include #include using namespace std; class SynTree { public: virtual int interpret(map &p) const = 0; virtual ~SynTree(); }; class Constant : public SynTree { public: Constant(int v) :_v(v) {} int interpret(map &p) const; private: int _v; }; class Variable : public SynTree { public: Variable(string s) :_s(s) {} int interpret(map &p) 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 a); ~InnerTree(); protected: vector _nodes; private: InnerTree(const InnerTree& i); InnerTree& operator=(const InnerTree& i); }; class Add : public InnerTree { public: Add(SynTree* a, SynTree* b) :InnerTree(a, b) {} int interpret(map &p) const; }; class Sub : public InnerTree { public: Sub(SynTree* a, SynTree* b) :InnerTree(a, b) {} int interpret(map &p) const; }; class Mul : public InnerTree { public: Mul(SynTree* a, SynTree* b) :InnerTree(a, b) {} int interpret(map &p) const; }; class Div : public InnerTree { public: Div(SynTree* a, SynTree* b) :InnerTree(a, b) {} int interpret(map &p) const; }; class Greater : public InnerTree { public: Greater(SynTree* a, SynTree* b) :InnerTree(a, b) {} int interpret(map &p) const; }; class Less : public InnerTree { public: Less(SynTree* a, SynTree* b) :InnerTree(a, b) {} int interpret(map &p) const; }; class Eq : public InnerTree { public: Eq(SynTree* a, SynTree* b) :InnerTree(a, b) {} int interpret(map &p) const; }; class Assign : public InnerTree { public: Assign(SynTree* a, SynTree* b) :InnerTree(a, b) {} int interpret(map &p) const; }; class Print : public InnerTree { public: Print(SynTree* a) :InnerTree(a) {} int interpret(map &p) const; }; class Seq : public InnerTree { public: Seq(vector v) :InnerTree(v) {} int interpret(map &p) const; }; class PozivFje : public InnerTree { public: PozivFje(string name, vector s) :InnerTree(s), _name(name) {} int interpret(map &p) const; private: string _name; }; class Upitnik : public InnerTree { public: Upitnik(SynTree *a, SynTree *b, SynTree *c) :InnerTree(a, b, c) {} int interpret(map &p) const; }; class Fja { public: Fja(string res, vector args, SynTree *code) :_res(res), _args(args), _code(code) {} int pozovi(vector a); ~Fja(); private: string _res; vector _args; SynTree *_code; }; #endif