diff --git a/adeterminize/src/idpda/IdpdaDeterminizer.cpp b/adeterminize/src/idpda/IdpdaDeterminizer.cpp index a5cc5a6437eb846f49337fb0b6d2a78fd49975f9..69ba83f523af55b14905d28b37a773fa4a30558a 100644 --- a/adeterminize/src/idpda/IdpdaDeterminizer.cpp +++ b/adeterminize/src/idpda/IdpdaDeterminizer.cpp @@ -9,6 +9,21 @@ void IdpdaDeterminizer::initDeterminization() Utils::copyInputAlphabet(*this->nidpda, *this->didpda); Utils::copyStackAlphabet(*this->nidpda, *this->didpda); this->states.clear(); + this->findPopAndPushSymbols(); +} + + +void IdpdaDeterminizer::findPopAndPushSymbols() +{ + for (const auto& symbol: this->nidpda->getInputAlphabet()) { + for (const auto& transition: this->nidpda->getTransitions()) { + if (transition.getInput() == symbol) { + this->popSymbols[symbol] = transition.getPop(); + this->pushSymbols[symbol] = transition.getPush(); + break; + } + } + } } @@ -18,15 +33,12 @@ const State& IdpdaDeterminizer::getOrCreateState(const set<State>& originalState } -set<State> IdpdaDeterminizer::findToStates(const set<State>& nidpdaStates, const Symbol& input, list<Symbol>* stackPop, - list<Symbol>* stackPush) +set<State> IdpdaDeterminizer::findToStates(const set<State>& nidpdaStates, const Symbol& input) { set<State> targetStates; for (const auto& state : nidpdaStates) { for (const auto& transition : this->nidpda->getTransitions()) { if (transition.getFrom() == state && transition.getInput() == input) { - *stackPop = transition.getPop(); - *stackPush = transition.getPush(); targetStates.insert(transition.getTo()); } } @@ -68,10 +80,9 @@ Automaton* IdpdaDeterminizer::determinize() } for (const auto& input : this->nidpda->getInputAlphabet()) { - list<Symbol> stackPop; - list<Symbol> stackPush; - const set<State>& nidpdaToStates = this->findToStates(unmarkedStateData->originalStates, input, - &stackPop, &stackPush); + list<Symbol> stackPop = this->popSymbols[input]; + list<Symbol> stackPush = this->pushSymbols[input]; + const set<State>& nidpdaToStates = this->findToStates(unmarkedStateData->originalStates, input); if (nidpdaToStates.size() > 0) { const State& targetState = this->getOrCreateState(nidpdaToStates); TransitionPDA transition(unmarkedStateData->state, input, targetState, stackPop, stackPush); diff --git a/adeterminize/src/idpda/IdpdaDeterminizer.h b/adeterminize/src/idpda/IdpdaDeterminizer.h index de7a0c1a4d11edab5af7b07f334f1b8d0c444b79..f4ac7d499b7ebae7ae7c8f681ecbb5cdbc54c02d 100644 --- a/adeterminize/src/idpda/IdpdaDeterminizer.h +++ b/adeterminize/src/idpda/IdpdaDeterminizer.h @@ -29,11 +29,13 @@ class IdpdaDeterminizer : public Determinizer PDA* nidpda; PDA* didpda; map<string, StateData> states; + map<Symbol, list<Symbol>> popSymbols; + map<Symbol, list<Symbol>> pushSymbols; void initDeterminization(); + void findPopAndPushSymbols(); const State& getOrCreateState(const set<State>& originalStates); - set<State> findToStates(const set<State>& nidpdaStates, const Symbol& input, list<Symbol>* stackPop, - list<Symbol>* stackPush); + set<State> findToStates(const set<State>& nidpdaStates, const Symbol& input); public: IdpdaDeterminizer(PDA* automaton);