#ifndef __REGEX_HPP__ #define __REGEX_HPP__ 1 #include #include using namespace std; class RegEx { public: virtual void basic() const = 0; virtual ~RegEx() {} virtual int maxlen() const = 0; virtual string minstr() const = 0; }; class Slovo : public RegEx { public: Slovo(char c) :_c(c) {} void basic() const; int maxlen() const; string minstr() const; private: char _c; }; class BinOp : public RegEx { public: BinOp(RegEx *levi, RegEx *desni) :_levi(levi), _desni(desni) {} ~BinOp(); private: BinOp(const BinOp&); BinOp& operator=(const BinOp&); protected: RegEx *_levi; RegEx *_desni; }; class Konkatenacija : public BinOp { public: Konkatenacija(RegEx* levi, RegEx *desni) :BinOp(levi, desni) {} void basic() const; int maxlen() const; string minstr() const; }; class Disjunkcija : public BinOp { public: Disjunkcija(RegEx* levi, RegEx *desni) :BinOp(levi, desni) {} void basic() const; int maxlen() const; string minstr() const; }; class UnOp : public RegEx { public: UnOp(RegEx *r) :_r(r) {} ~UnOp(); private: UnOp(const UnOp&); UnOp& operator=(const UnOp&); protected: RegEx *_r; }; class Klini : public UnOp { public: Klini(RegEx *r) :UnOp(r) {} void basic() const; int maxlen() const; string minstr() const; }; class Plus : public UnOp { public: Plus(RegEx *r) :UnOp(r) {} void basic() const; int maxlen() const; string minstr() const; }; class Upitnik : public UnOp { public: Upitnik(RegEx *r) :UnOp(r) {} void basic() const; int maxlen() const; string minstr() const; }; class KarakterskaKlasa : public RegEx { public: KarakterskaKlasa(vector v) :_v(v) {} void basic() const; int maxlen() const; string minstr() const; private: vector _v; }; class Definicija : public RegEx { public: Definicija(char ime) :_ime(ime) {} void basic() const; int maxlen() const; string minstr() const; private: char _ime; }; class VisestrukoPojavljivanje : public UnOp { public: VisestrukoPojavljivanje(RegEx *r, int num) :UnOp(r), _num(num) {} void basic() const; int maxlen() const; string minstr() const; private: int _num; }; #endif