diff --git a/alib2algo/src/grammar/parsing/SLR1ParseTable.cpp b/alib2algo/src/grammar/parsing/SLR1ParseTable.cpp index 0b3025d18bab07596196d4098a204f6a6d92c4d8..fd16f200e7f849cb760960351e41d64341fe5673 100644 --- a/alib2algo/src/grammar/parsing/SLR1ParseTable.cpp +++ b/alib2algo/src/grammar/parsing/SLR1ParseTable.cpp @@ -67,6 +67,23 @@ LRActionTable SLR1ParseTable::getActionTable ( grammar::CFG originalGrammar ) { return actionTable; } +LRGotoTable SLR1ParseTable::getGotoTable ( grammar::CFG originalGrammar ) { + LRGotoTable gotoTable; + grammar::CFG augmentedGrammar = LRParser::getAugmentedGrammar ( originalGrammar ); + automaton::DFA parsingAutomaton = LR0Parser::getAutomaton ( originalGrammar ); + for ( const automaton::State & state : parsingAutomaton.getStates ( ) ) { + std::map < std::pair < automaton::State, alphabet::Symbol >, automaton::State > transitionsFromCurrentState = parsingAutomaton.getTransitionsFromState ( state ); + for ( const alphabet::Symbol & nonterminal : augmentedGrammar.getNonterminalAlphabet ( ) ) { + std::map < std::pair<automaton::State, alphabet::Symbol >, automaton::State >::iterator transitionIterator = transitionsFromCurrentState.find ( { state, nonterminal } ); + if ( transitionIterator != transitionsFromCurrentState.end ( ) ) { + gotoTable.insert ( { { state, nonterminal }, transitionIterator->second } ); + } + } + } + + return gotoTable; +} + } /* namespace parsing */ } /* namespace grammar */ diff --git a/alib2algo/src/grammar/parsing/SLR1ParseTable.h b/alib2algo/src/grammar/parsing/SLR1ParseTable.h index 3f4c6a4b5a8c5d5843939c7f434e588db16f0e05..34cfabd1a68d48afb56493a8582d2892a4761706 100644 --- a/alib2algo/src/grammar/parsing/SLR1ParseTable.h +++ b/alib2algo/src/grammar/parsing/SLR1ParseTable.h @@ -22,6 +22,8 @@ class SLR1ParseTable { public: static LRActionTable getActionTable ( grammar::CFG originalGrammar ); + + static LRGotoTable getGotoTable ( grammar::CFG originalGrammar ); }; } /* namespace parsing */