bool RegEx::star() { FSA_TABLE A; if(!pop(A)) return false; State* pStart = Services::memory->alloc<State>(); new (pStart) State(++m_nNextStateID); State* pEnd = Services::memory->alloc<State>(); new (pEnd) State(++m_nNextStateID); pStart->addTransition(0,pEnd); pStart->addTransition(0,A[0]); A.back()->addTransition(0,pEnd); A.back()->addTransition(0,A[0]); A.push_back(pEnd); A.push_front(pStart); m_OperandStack.push(A); return true; }
void test_DFA2() { vector<char> all_inputs; FSA_TABLE NFATable; vector<string> patterns; all_inputs.push_back('a'); all_inputs.push_back('b'); for (int i = 0; i < 9; i++) NFATable.push_back(new FA_State(i)); NFATable[2]->acceptingState = true; NFATable[6]->acceptingState = true; NFATable[8]->acceptingState = true; NFATable[0]->AddTransition(EPSILON, NFATable[1]); NFATable[1]->AddTransition('a', NFATable[2]); NFATable[0]->AddTransition(EPSILON, NFATable[3]); NFATable[3]->AddTransition('a', NFATable[4]); NFATable[4]->AddTransition('b', NFATable[5]); NFATable[5]->AddTransition('b', NFATable[6]); NFATable[0]->AddTransition(EPSILON, NFATable[7]); NFATable[7]->AddTransition('a', NFATable[7]); NFATable[7]->AddTransition('b', NFATable[8]); NFATable[8]->AddTransition('b', NFATable[8]); DFA_Builder* DFA = new DFA_Builder(NFATable, patterns, all_inputs); cout << " Conversion Function " << endl; DFA->NFA_to_DFA(); }
void RegEx::push(char c){ State* s0 = Services::memory->alloc<State>(); new (s0) State(++m_nNextStateID); State* s1 = Services::memory->alloc<State>(); new (s1) State(++m_nNextStateID); s0->addTransition(c,s1); FSA_TABLE NFATable; NFATable.push_back(s0); NFATable.push_back(s1); m_OperandStack.push(NFATable); m_InputSet.insert(c); }
void CAG_RegEx::Push(char chInput) { // Create 2 new states on the heap CAG_State *s0 = new CAG_State(++m_nNextStateID); CAG_State *s1 = new CAG_State(++m_nNextStateID); // Add the transition from s0->s1 on input character s0->AddTransition(chInput, s1); // Create a NFA from these 2 states FSA_TABLE NFATable; NFATable.push_back(s0); NFATable.push_back(s1); // push it onto the operand stack m_OperandStack.push(NFATable); cout<<__FILE__<<__LINE__<<endl; vector<FSA_TABLE> tmp; while(!m_OperandStack.empty()) { tmp.push_back(m_OperandStack.top()); m_OperandStack.pop(); } vector<FSA_TABLE>::iterator it = tmp.begin(); for(; it != tmp.end(); it++) { m_OperandStack.push(*it); deque<CAG_State*>::iterator jt = (*it).begin(); for(; jt != (*it).end(); jt++) { cout<<(**jt).getID()<<" "; } cout<<"\n\n"<<endl; } // Add this character to the input character set m_InputSet.insert(chInput); //TRACE("PUSH %s\n", CString(chInput)); }
void CAG_RegEx::Push(char chInput) { // Create 2 new states on the heap CAG_State *s0 = new CAG_State(++m_nNextStateID); CAG_State *s1 = new CAG_State(++m_nNextStateID); // Add the transition from s0->s1 on input character s0->AddTransition(chInput, s1); // Create a NFA from these 2 states FSA_TABLE NFATable; NFATable.push_back(s0); NFATable.push_back(s1); // push it onto the operand stack m_OperandStack.push(NFATable); // Add this character to the input character set m_InputSet.insert(chInput); TRACE("PUSH %s\n", CString(chInput)); }