Skip to content
Snippets Groups Projects
Commit 28cbfc9d authored by Jan Vesely's avatar Jan Vesely
Browse files

add precomputing of pop and push symbols

parent dd66de43
No related branches found
No related tags found
No related merge requests found
......@@ -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);
......
......@@ -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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment