bool CAG_RegEx::CreateNFA(string strRegEx) { // Parse regular expresion using similar // method to evaluate arithmetic expressions // But first we will detect concatenation and // insert char(8) at the position where // concatenation needs to occur strRegEx = ConcatExpand(strRegEx); cout<<strRegEx<<" : length "<<strRegEx.size()<<endl; for(int i=0; i<strRegEx.size(); ++i) { // get the charcter char c = strRegEx[i]; if(IsInput(c)) Push(c); else if(m_OperatorStack.empty()) m_OperatorStack.push(c); else if(IsLeftParanthesis(c)) m_OperatorStack.push(c); else if(IsRightParanthesis(c)) { // Evaluate everyting in paranthesis while(!IsLeftParanthesis(m_OperatorStack.top())) if(!Eval()) return false; // Remove left paranthesis after the evaluation m_OperatorStack.pop(); } else { while(!m_OperatorStack.empty() && Presedence(c, m_OperatorStack.top())) if(!Eval()) return false; m_OperatorStack.push(c); } } // Evaluate the rest of operators while(!m_OperatorStack.empty()) if(!Eval()) return false; // Pop the result from the stack if(!Pop(m_NFATable)) return false; // Last NFA state is always accepting state m_NFATable[m_NFATable.size()-1]->m_bAcceptingState = true; return true; }
string CAG_RegEx::ConcatExpand(string strRegEx) { string strRes; for(int i=0; i<strRegEx.size()-1; ++i) { char cLeft = strRegEx[i]; char cRight = strRegEx[i+1]; strRes += cLeft; if((IsInput(cLeft)) || (IsRightParanthesis(cLeft)) || (cLeft == '*')) if((IsInput(cRight)) || (IsLeftParanthesis(cRight))) strRes += char(8); } strRes += strRegEx[strRegEx.size()-1]; return strRes; }