#ifndef __IZRAZ_HPP__
#define __IZRAZ_HPP__ 1

class Izraz {
public:
  virtual int vrednost() const = 0;
  virtual Izraz* kopija() const = 0;
  virtual ~Izraz() {

  }
};

class Konstanta : public Izraz {
public:
  Konstanta(int v)
    :_vr(v)
  {}
  int vrednost() const;
  Izraz* kopija() 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;
};

class Razlika : public BinOp {
public:
  Razlika(Izraz *i1, Izraz *i2)
    :BinOp(i1, i2)
  {}
  Izraz* kopija() const;
  int vrednost() const;
};

class Proizvod : public BinOp {
public:
  Proizvod(Izraz *i1, Izraz *i2)
    :BinOp(i1, i2)
  {}
  Izraz* kopija() const;
  int vrednost() const;
};

class Kolicnik : public BinOp {
public:
  Kolicnik(Izraz *i1, Izraz *i2)
    :BinOp(i1, i2)
  {}
  Izraz* kopija() const;
  int vrednost() const;
};

class Mod : public BinOp {
public:
  Mod(Izraz *i1, Izraz *i2)
    :BinOp(i1, i2)
  {}
  Izraz* kopija() const;
  int vrednost() const;
};


#endif
