/* Remove states that have no path to them from the start state. Recursively * traverses the graph marking states that have paths into them. Then removes * all states that did not get marked. */ void FsmAp::removeUnreachableStates() { /* Misfit accounting should be off and there should be no states on the * misfit list. */ assert( !misfitAccounting && misfitList.length() == 0 ); /* Mark all the states that can be reached * through the existing set of entry points. */ markReachableFromHere( startState ); for ( EntryMap::Iter en = entryPoints; en.lte(); en++ ) markReachableFromHere( en->value ); /* Delete all states that are not marked * and unmark the ones that are marked. */ StateAp *state = stateList.head; while ( state ) { StateAp *next = state->next; if ( state->stateBits & SB_ISMARKED ) state->stateBits &= ~ SB_ISMARKED; else { detachState( state ); stateList.detach( state ); delete state; } state = next; } }
void BackendGen::makeEntryPoints() { /* List of entry points other than start state. */ if ( fsm->entryPoints.length() > 0 || pd->lmRequiresErrorState ) { if ( pd->lmRequiresErrorState ) cgd->setForcedErrorState(); for ( EntryMap::Iter en = fsm->entryPoints; en.lte(); en++ ) { /* Get the name instantiation from nameIndex. */ NameInst *nameInst = pd->nameIndex[en->key]; std::string name; makeNameInst( name, nameInst ); StateAp *state = en->value; cgd->addEntryPoint( strdup(name.c_str()), state->alg.stateNum ); } } }
void XMLCodeGen::writeEntryPoints() { /* List of entry points other than start state. */ if ( fsm->entryPoints.length() > 0 || pd->lmRequiresErrorState ) { out << " <entry_points"; if ( pd->lmRequiresErrorState ) out << " error=\"t\""; out << ">\n"; for ( EntryMap::Iter en = fsm->entryPoints; en.lte(); en++ ) { /* Get the name instantiation from nameIndex. */ NameInst *nameInst = pd->nameIndex[en->key]; StateAp *state = en->value; out << " <entry name=\""; writeNameInst( nameInst ); out << "\">" << state->alg.stateNum << "</entry>\n"; } out << " </entry_points>\n"; } }