Ejemplo n.º 1
0
static void TestCreateSet(void)
	// A routine to test the set creation and deletion code. 
	// It compares the newly created set against a set called 
	// "DefaultLocationForMoreSCFTest" to ensure that the set 
	// created by MoreSCF matches a set created by the control 
	// panel.
{
	OSStatus 		err;
	OSStatus 		err2;
	CFStringRef		newSetID;
	CFStringRef		templateSetID;
	
	newSetID = NULL;
	templateSetID = NULL;

	err = MoreSCFindSetByUserVisibleNameAndCopyID(CFSTR(kDefaultLocationName), &templateSetID);
	if (err != noErr || templateSetID == NULL) {
		fprintf(stderr, "*** TestCreateSet requires that you create a default set named '%s' using the Network preferences panel.\n", kDefaultLocationName);
		err = -1;
	}
	if (err == noErr) {
		err = MoreSCNewSet(CFSTR("Frog"), &newSetID);
	}
	if (err == noErr) {
		if (!gRunQuiet) {
			fprintf(stderr, "New set ID is ");
			CFShow(newSetID);
		}
		
		err = CompareSets(newSetID, templateSetID);

		err2 = MoreSCDeleteSet(newSetID);
		if (err == noErr) {
			err = err2;
		}
	}
	
	CFQRelease(newSetID);
	CFQRelease(templateSetID);

	PrintTestResult(err, NULL);
}
// 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);
	}
}