#ifndef __IZRAZI_HPP__
#define __IZRAZI_HPP__ 1

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

  }
};

class Konstanta : public Izraz {
public:
  Konstanta(int v)
    :_v(v)
  {}
  int vrednost() const;
private:
  int _v;
};

class BinOp : public Izraz {
public:
  BinOp(Izraz* levi, Izraz* desni)
    :_levi(levi), _desni(desni)
  { }
  ~BinOp();
private:
  BinOp(const BinOp& z);
  BinOp& operator=(const BinOp& z);
protected:
  Izraz* _levi;
  Izraz* _desni;
};

class Zbir : public BinOp {
public:
  Zbir(Izraz* levi, Izraz* desni)
    :BinOp(levi, desni)
  { }
  int vrednost() const;
};

class Razlika : public BinOp {
public:
  Razlika(Izraz* levi, Izraz* desni)
    :BinOp(levi, desni)
  { }
  int vrednost() const;
};

class Proizvod : public BinOp {
public:
  Proizvod(Izraz* levi, Izraz* desni)
    :BinOp(levi, desni)
  { }
  int vrednost() const;
};

class Kolicnik : public BinOp {
public:
  Kolicnik(Izraz* levi, Izraz* desni)
    :BinOp(levi, desni)
  { }
  int vrednost() const;
};

class Mod : public BinOp {
public:
  Mod(Izraz* levi, Izraz* desni)
    :BinOp(levi, desni)
  { }
  int vrednost() const;
};

#endif

