#ifndef __IZRAZ_HPP__ #define __IZRAZ_HPP__ 1 #include #include using namespace std; class Izraz { public: virtual int vrednost() const = 0; virtual Izraz* kopija() const = 0; virtual void ispisi() const = 0; virtual ~Izraz() { } }; class Konstanta : public Izraz { public: Konstanta(int v) :_vr(v) {} int vrednost() const; Izraz* kopija() const; void ispisi() const; private: int _vr; }; class BinOp : public Izraz { public: BinOp(Izraz *i1, Izraz *i2) :_levi(i1->kopija()), _desni(i2->kopija()) {} BinOp(const BinOp& x); ~BinOp(); BinOp& operator=(const BinOp& x); protected: Izraz *_levi, *_desni; }; class Zbir : public BinOp { public: Zbir(Izraz *i1, Izraz *i2) :BinOp(i1, i2) {} Izraz* kopija() const; int vrednost() const; void ispisi() const; }; class Razlika : public BinOp { public: Razlika(Izraz *i1, Izraz *i2) :BinOp(i1, i2) {} Izraz* kopija() const; int vrednost() const; void ispisi() const; }; class Proizvod : public BinOp { public: Proizvod(Izraz *i1, Izraz *i2) :BinOp(i1, i2) {} Izraz* kopija() const; int vrednost() const; void ispisi() const; }; class Kolicnik : public BinOp { public: Kolicnik(Izraz *i1, Izraz *i2) :BinOp(i1, i2) {} Izraz* kopija() const; int vrednost() const; void ispisi() const; }; class Mod : public BinOp { public: Mod(Izraz *i1, Izraz *i2) :BinOp(i1, i2) {} Izraz* kopija() const; int vrednost() const; void ispisi() const; }; class Vece : public BinOp { public: Vece(Izraz *i1, Izraz *i2) :BinOp(i1, i2) {} Izraz* kopija() const; int vrednost() const; void ispisi() const; }; class Manje : public BinOp { public: Manje(Izraz *i1, Izraz *i2) :BinOp(i1, i2) {} Izraz* kopija() const; int vrednost() const; void ispisi() const; }; class Promenljiva : public Izraz { public: Promenljiva(string s) :_ime(s) {} Izraz* kopija() const; int vrednost() const; void ispisi() const; private: string _ime; }; #endif