diff --git a/adeterminize.vpa/src/VPADeterminizer.cpp b/adeterminize.vpa/src/VPADeterminizer.cpp index 62c916db74edde4aca65cb5ee806262516cac227..8227d968fa1f77d09a9aee8975841dafc4760d56 100644 --- a/adeterminize.vpa/src/VPADeterminizer.cpp +++ b/adeterminize.vpa/src/VPADeterminizer.cpp @@ -147,6 +147,21 @@ void VPADeterminizer::buildStackAlphabet() { } +VPADeterminizer::StateData* VPADeterminizer::getUnmarkedState() { + StateData* unmarkedStateData = NULL; + for (map<string, StateData>::iterator stateIter = this->states.begin(); + stateIter != this->states.end(); + stateIter++) { + if (!stateIter->second.isMarked) { + unmarkedStateData = &stateIter->second; + unmarkedStateData->isMarked = true; + return unmarkedStateData; + } + } + return NULL; +} + + VPADeterminizer::VPADeterminizer(PDA* automaton) { this->nondeterministicVPA = automaton; } @@ -168,16 +183,7 @@ PDA* VPADeterminizer::determinize() { set<TransitionPDA> transitions = this->nondeterministicVPA->getTransitions(); while (true) { - StateData* unmarkedStateData = NULL; - for (map<string, StateData>::iterator stateIter = this->states.begin(); - stateIter != this->states.end(); - stateIter++) { - if (!stateIter->second.isMarked) { - unmarkedStateData = &stateIter->second; - unmarkedStateData->isMarked = true; - break; - } - } + StateData* unmarkedStateData = this->getUnmarkedState(); if (unmarkedStateData == NULL) { break; } @@ -214,8 +220,9 @@ PDA* VPADeterminizer::determinize() { } } } + const State& fromState = unmarkedStateData->state; const State& toState = this->getOrCreateState(sPrimed, rPrimed); - const TransitionPDA transition(unmarkedStateData->state, *internalSymbol, toState); + const TransitionPDA transition(fromState, *internalSymbol, toState); this->deterministicVPA->addTransition(transition); } @@ -236,11 +243,12 @@ PDA* VPADeterminizer::determinize() { } } SComponent& s = unmarkedStateData->s; + const State& fromState = unmarkedStateData->state; const State& toState = this->getOrCreateState(this->getSComponentWithStatesIdentity(), rPrimed); string stackSymbolName = this->buildStackSymbolName(s, r, *callSymbol); list<Symbol> pop; list<Symbol> push(1, Symbol(stackSymbolName)); - const TransitionPDA transition(unmarkedStateData->state, *callSymbol, toState, pop, push); + const TransitionPDA transition(fromState, *callSymbol, toState, pop, push); this->deterministicVPA->addTransition(transition); } @@ -281,10 +289,11 @@ PDA* VPADeterminizer::determinize() { } } } + const State& fromState = unmarkedStateData->state; const State& toState = this->getOrCreateState(sPrimed, rPrimed); list<Symbol> pop(1, BOTTOM_OF_STACK_SYMBOL); list<Symbol> push; - const TransitionPDA transition(unmarkedStateData->state, *returnSymbol, toState, pop, push); + const TransitionPDA transition(fromState, *returnSymbol, toState, pop, push); this->deterministicVPA->addTransition(transition); // Otherwise @@ -351,11 +360,12 @@ PDA* VPADeterminizer::determinize() { } } + const State& fromState = unmarkedStateData->state; const State& toState = this->getOrCreateState(sDoublePrimed, rDoublePrimed); string stackSymbolName = this->buildStackSymbolName(sPrimed, rPrimed, *callSymbol); list<Symbol> pop(1, Symbol(stackSymbolName)); list<Symbol> push; - const TransitionPDA transition(unmarkedStateData->state, *returnSymbol, toState, pop, push); + const TransitionPDA transition(fromState, *returnSymbol, toState, pop, push); this->deterministicVPA->addTransition(transition); } } diff --git a/adeterminize.vpa/src/VPADeterminizer.h b/adeterminize.vpa/src/VPADeterminizer.h index 1ddcfcbfce2e8be69a87364c9b75d0cc4f696fc3..fee14797e9acd326538b588cbe1e87cd87d2b6e6 100644 --- a/adeterminize.vpa/src/VPADeterminizer.h +++ b/adeterminize.vpa/src/VPADeterminizer.h @@ -93,6 +93,7 @@ protected: void divideInputAlphabet(); string buildStackSymbolName(const SComponent& s, const RComponent& r, const Symbol& input); void buildStackAlphabet(); + StateData* getUnmarkedState(); public: static const Symbol BOTTOM_OF_STACK_SYMBOL;