void UnionSet(Set S1, Set S2, Set *S3) { int i; CopySet(S1,&*S3); for (i=1;i<=SetNbElmt(S2);i++) { InsertSet(&*S3,S2.T[i]); } }
void SetDifference (Set S1, Set S2, Set *S3) { int i; CopySet(S1,&*S3); for (i=1;i<=SetNbElmt(S2);i++) { if (IsSetMember(*S3,S2.T[i])) DeleteSet(&*S3,S2.T[i]); } }
// Subset Construction for converting a Nondeterministic Finite Automaton (NFA) to a Deterministic Finite Automaton (DFA) // algorithm from book Compilers Principles and Tools: by Alfred V.Aho, Ravi Sethi and Jeffrey D. Ullman void dDeterministicFiniteAutonata::CreateDeterministicFiniteAutomaton (const dNonDeterministicFiniteAutonata& nfa) { if (nfa.IsValid()) { dTree<int, int> symbolsList; dList<dAutomataState*> stateArray; nfa.GetStartState()->GetStateArray(stateArray); for (dList<dAutomataState*>::dListNode* node = stateArray.GetFirst(); node; node = node->GetNext()) { dAutomataState* const state = node->GetInfo(); for (dList<dAutomataState::dTransition>::dListNode* transitionNode = state->m_transtions.GetFirst(); transitionNode; transitionNode = transitionNode->GetNext()) { dAutomataState::dTransition& transition = transitionNode->GetInfo(); dAutomataState::dCharacter ch (transition.GetCharater()); if (ch.m_symbol) { symbolsList.Insert(ch.m_symbol, ch.m_symbol); } } } dTree<dAutomataState*,dAutomataState*> NFAmap; dTree<dAutomataState*,dAutomataState*> subSet; int stateID = 0; NFAmap.Insert(nfa.GetStartState(), nfa.GetStartState()); dAutomataState* stackPool[2048]; EmptyTransitionClosure (NFAmap, subSet); // dAutomataState* const startState = new dAutomataState(subSet, stateID ++); dAutomataState* const startState = CreateTargetState(subSet, stateID ++); dList<dAutomataState*> newStatesList; int stack = 1; stackPool[0] = startState; newStatesList.Append(startState); while (stack) { stack --; dAutomataState* const state = stackPool[stack]; dTree<int, int>::Iterator iter (symbolsList); for (iter.Begin(); iter; iter ++) { int ch = iter.GetNode()->GetInfo(); dTree<dAutomataState*,dAutomataState*> moveSet; MoveSymbol (ch, state, moveSet); if (moveSet.GetCount()) { dTree<dAutomataState*,dAutomataState*> subSet; EmptyTransitionClosure (moveSet, subSet); dAutomataState* foundState = NULL; for (dList<dAutomataState*>::dListNode* node = newStatesList.GetFirst(); node; node = node->GetNext()) { dAutomataState* const state = node->GetInfo(); dAssert (state); if (CompareSets(state->m_myNFANullStates, subSet)) { foundState = state; break; } } if (foundState) { state->m_transtions.Append(dAutomataState::dTransition(ch, foundState)); } else { dAutomataState* const targetState = CreateTargetState(subSet, stateID ++); stackPool[stack] = targetState; stack ++; dAssert (stack < sizeof (stackPool)/sizeof (stackPool[0])); newStatesList.Append(targetState); state->m_transtions.Append(dAutomataState::dTransition(ch, targetState)); } } } } m_startState = startState; CopySet (nfa); } }