struct State { int c; //256=epsilon, 257=accept State * next; //used only when c is epsilon, but could be null State * alt; bool visited; State(int c, State * next=0, State * alt=0) { this->c=c; this->next=next; this->alt=alt; visited=false; } bool isAccept()const { return c==257; } bool isSplit()const { return c==256; } }; struct NFA { State * in; State * out; NFA(State * in, State * out) { this->in=in; this->out=out; } }; NFA sym(int c) { State * s=new State(c); return NFA(s, s); } NFA dot(NFA nfa1, NFA nfa2) { nfa1.out->next=nfa2.in; return NFA(nfa1.in, nfa2.out); } NFA bar(NFA nfa1, NFA nfa2) { State * s=new State(256, nfa1.in, nfa2.in); State * t=new State(256); nfa1.out->next=nfa2.out->next=t; return NFA(s, t); } NFA que(NFA nfa) { State * t=new State(256); State * s=new State(256, nfa.in, t); nfa.out->next=t; return NFA(s, t); } NFA star(NFA nfa) { State * s=new State(256, 0, nfa.in); nfa.out->next=s; return NFA(s, s); } NFA plus(NFA nfa) { State * s=new State(256, 0, nfa.in); nfa.out->next=s; return NFA(nfa.in, s); } NFA accept(NFA nfa) { State * s=new State(257); nfa.out->next=s; return NFA(nfa.in, s); } void freeNFA(State * s) { if (!s || s->visited) return; s->visited=true; freeNFA(s->next); freeNFA(s->alt); delete s; } void freeNFA(NFA nfa) { freeNFA(nfa.in); } #include using std::vector; void in2post(const char * s, char * t) { vector v; //empty stack int count=0; while (*s!='\0') { if (*s=='|') { while (!v.empty() && v[v.size()-1]!='(') { t[count]=v[v.size()-1]; v.pop_back(); count++; } v.push_back(*s); } else if (*s=='.') { while(!v.empty() && v[v.size()-1]!='|' && v[v.size()-1]!='(') { t[count]=v[v.size()-1]; v.pop_back(); count++; } v.push_back(*s); } else if (*s=='*' || *s=='+' || *s=='?') v.push_back(*s); else if (*s=='(') v.push_back(*s); else if (*s==')') { while (v[v.size()-1]!='(') { t[count]=v[v.size()-1]; v.pop_back(); count++; } v.pop_back(); } else { t[count]=*s; count++; } s++; } while (!v.empty()) { t[count]=v[v.size()-1]; v.pop_back(); count++; } t[count]='\0'; }