773 assert(States.empty());
776 stateForNFAState(N->States.front());
777 while (!UnfinishedStates.empty()) {
778 CurrentState = UnfinishedStates.back().first;
779 auto StartFinal = UnfinishedStates.back().second;
780 bool Start = StartFinal.first;
781 bool Final = StartFinal.second;
782 UnfinishedStates.pop_back();
784 State *DS = stateForNFAStates(CurrentState, Start, Final);
785 if (FinishedStates.find(DS->ID()) != FinishedStates.end())
787 FinishedStates.insert(DS->ID());
791 unordered_set<Transition*> FinishedTransitions;
793 for (
auto SI=CurrentState.begin(), SE=CurrentState.end() ; SI!=SE ; ++SI) {
795 State *NState = N->States[I];
798 for (
auto TI=NState->begin(), TE=NState->end() ; TI!=TE ; ++TI) {
801 assert(T->IsRealisable());
802 if (FinishedTransitions.count(T) != 0)
continue;
804 collectFrontier(Destinations, &T->Destination(), Start, Final);
805 FinishedTransitions.insert(T);
808 for (++DTI ; DTI!=TE ; ++DTI) {
809 if ((*DTI)->EquivalentTo(*T)) {
810 assert(FinishedTransitions.count(*DTI) == 0);
811 FinishedTransitions.insert(*DTI);
812 collectFrontier(Destinations, &(*DTI)->Destination(), Start, Final);
816 for (++DSI ; DSI!=SE ; ++DSI)
817 for (Transition *DT : *N->States[*DSI]) {
818 if (DT->EquivalentTo(*T)) {
819 assert(FinishedTransitions.count(DT) == 0);
820 FinishedTransitions.insert(DT);
821 collectFrontier(Destinations, &DT->Destination(), Start, Final);
825 State *Dest = stateForNFAStates(Destinations, Start, Final);
833 DFA *D =
new DFA(N->ID(),
834 const_cast<AutomatonDescription&
>(N->getAssertion()),
835 N->Use(), N->Name(), States, TEquivClasses);
837 debugs(
"tesla.automata.dfa")
838 <<
"DFA conversion results:\n"
839 <<
"> NFA: " << N->String() <<
"\n"
840 <<
"> DFA: " << D->String() <<
"\n"
841 <<
">> DFA state map:\n"
843 <<
">> DFA transition equivalence classes:\n"