#ifndef __REGEX_HPP__ #define __REGEX_HPP__ 1 #include #include using namespace std; class RegEx { public: virtual string basic() const = 0; virtual int maxlen() const = 0; virtual ~RegEx(); }; class Slovo : public RegEx { public: Slovo(char c) :_c(c) {} string basic() const; int maxlen() const; private: char _c; }; class BinOp : public RegEx { public: BinOp(RegEx* l, RegEx* d) :_levi(l), _desni(d) {} ~BinOp(); private: BinOp(const BinOp& b); BinOp& operator=(const BinOp &b); protected: RegEx *_levi, *_desni; }; class UnOp : public RegEx { public: UnOp(RegEx* l) :_arg(l) {} ~UnOp(); private: UnOp(const UnOp& b); UnOp& operator=(const UnOp &b); protected: RegEx *_arg; }; class Disjunkcija : public BinOp { public: Disjunkcija(RegEx *l, RegEx *d) :BinOp(l, d) {} string basic() const; int maxlen() const; }; class Konkatenacija : public BinOp { public: Konkatenacija(RegEx *l, RegEx *d) :BinOp(l, d) {} string basic() const; int maxlen() const; }; class Klini : public UnOp { public: Klini(RegEx *l) :UnOp(l) {} string basic() const; int maxlen() const; }; class Plus : public UnOp { public: Plus(RegEx *l) :UnOp(l) {} string basic() const; int maxlen() const; }; class Klasa : public RegEx { public: Klasa(vector v) :_v(v) {} string basic() const; private: vector _v; int maxlen() const; }; class Upitnik : public UnOp { public: Upitnik(RegEx *l) :UnOp(l) {} string basic() const; int maxlen() const; }; class VisestrukoPojavljivanje : public UnOp { public: VisestrukoPojavljivanje(RegEx *l, int i) :UnOp(l), _i(i) {} string basic() const; int maxlen() const; private: int _i; }; #endif