From fcff4c28fb453a63bc2fa8b39fb76ef38eda18ff Mon Sep 17 00:00:00 2001 From: Jan Vesely <janvesely@janvesely.net> Date: Sat, 18 Jan 2014 16:14:12 +0100 Subject: [PATCH] small changes in vpa determinization to clarify it --- adeterminize.vpa/src/VPADeterminizer.cpp | 38 +++++++++++++++--------- adeterminize.vpa/src/VPADeterminizer.h | 1 + 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/adeterminize.vpa/src/VPADeterminizer.cpp b/adeterminize.vpa/src/VPADeterminizer.cpp index 62c916db74..8227d968fa 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 1ddcfcbfce..fee14797e9 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; -- GitLab