コード例 #1
0
ファイル: set.c プロジェクト: natanelia/if2110ment
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]);
    }
}
コード例 #2
0
ファイル: set.c プロジェクト: natanelia/if2110ment
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]);
    }
}
コード例 #3
0
// 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);
	}
}