#include "regex.hpp" #include using namespace std; BinOp::~BinOp() { delete _levi; delete _desni; } UnOp::~UnOp() { delete _r; } void Slovo::basic() const { cout << _c; } void Konkatenacija::basic() const { cout << "("; _levi->basic(); cout << ")("; _desni->basic(); cout << ")"; } void Disjunkcija::basic() const { cout << "("; _levi->basic(); cout << ")|("; _desni->basic(); cout << ")"; } void Klini::basic() const { cout << "("; _r->basic(); cout << ")*"; } void Plus::basic() const { cout << "("; _r->basic(); cout << ")("; _r->basic(); cout << ")*"; } void Upitnik::basic() const { cout << "("; _r->basic(); cout << ")|eps"; } void KarakterskaKlasa::basic() const { for (unsigned i = 0; i < _v.size(); i++) { cout << _v[i]; if (i != _v.size() - 1) cout << "|"; } } #include extern map definicije; void Definicija::basic() const { map::iterator tmp = definicije.find(_ime); if (tmp == definicije.end()) throw "Ne postoji ta definicija"; tmp->second->basic(); } void VisestrukoPojavljivanje::basic() const { for (int i = 0; i < _num; i++) { cout << "("; _r->basic(); cout << ")"; } } int Slovo::maxlen() const { return 1; } int Konkatenacija::maxlen() const { int l = _levi->maxlen(); int d = _desni->maxlen(); if (l < 0 || d < 0) return -1; return l + d; } int Disjunkcija::maxlen() const { int l = _levi->maxlen(); int d = _desni->maxlen(); if (l < 0 || d < 0) return -1; return l > d ? l : d; } int Klini::maxlen() const { return -1; } int Plus::maxlen() const { return -1; } int Upitnik::maxlen() const { return _r->maxlen(); } int KarakterskaKlasa::maxlen() const { return 1; } int Definicija::maxlen() const { map::iterator tmp = definicije.find(_ime); if (tmp == definicije.end()) throw "Ne postoji ta definicija"; return tmp->second->maxlen(); } int VisestrukoPojavljivanje::maxlen() const { return _r->maxlen() * _num; } string Slovo::minstr() const { return string(1, _c); } string Konkatenacija::minstr() const { return _levi->minstr() + _desni->minstr(); } string Disjunkcija::minstr() const { string l = _levi->minstr(); string d = _desni->minstr(); if (l.size() > d.size()) return d; return l; } string Klini::minstr() const { return ""; } string Plus::minstr() const { return _r->minstr(); } string Upitnik::minstr() const { return ""; } string KarakterskaKlasa::minstr() const { return string(1, _v[0]); } string Definicija::minstr() const { map::iterator tmp = definicije.find(_ime); if (tmp == definicije.end()) throw "Ne postoji ta definicija"; return tmp->second->minstr(); } string VisestrukoPojavljivanje::minstr() const { string s = _r->minstr(); string tmp; for (int i = 0; i < _num; i++) tmp += s; return tmp; }