diff --git a/alib2algo/src/grammar/parsing/LR0Parser.cpp b/alib2algo/src/grammar/parsing/LR0Parser.cpp index c5c12b116a3f6e320e26b50cc4cf7e556cff7dbb..0f8ea0632697eae1a77bda847048affe07fd3f08 100644 --- a/alib2algo/src/grammar/parsing/LR0Parser.cpp +++ b/alib2algo/src/grammar/parsing/LR0Parser.cpp @@ -48,6 +48,27 @@ LR0Items LR0Parser::getClosure ( LR0Items items, grammar::CFG originalGrammar ) return items; } +LR0Items LR0Parser::getNextStateItems ( LR0Items items, alphabet::Symbol symbol, grammar::CFG originalGrammar ) { + LR0Items transitionItems; + for ( const LR0Items::value_type & symbolItems : items ) { + alphabet::Symbol leftHandSide = symbolItems.first; + for ( const std::pair < unsigned, std::vector < alphabet::Symbol > > & item : symbolItems.second) { + unsigned position = item.first; + std::vector < alphabet::Symbol > rightHandSide = item.second; + + if ( position == rightHandSide.size ( ) ) { + continue; + } + + if ( rightHandSide[position] == symbol ) { + transitionItems[leftHandSide].insert ( { position + 1, rightHandSide } ); + } + } + } + + return getClosure ( transitionItems, originalGrammar ); +} + automaton::DFA LR0Parser::getAutomaton ( grammar::CFG originalGrammar ) { grammar::CFG augmentedGrammar = LRParser::getAugmentedGrammar ( originalGrammar ); alphabet::Symbol initialSymbol = augmentedGrammar.getInitialSymbol ( ); @@ -70,7 +91,7 @@ automaton::DFA LR0Parser::getAutomaton ( grammar::CFG originalGrammar ) { itemsToProcess.pop ( ); for ( const alphabet::Symbol & symbol : lr0Automaton.getInputAlphabet ( ) ) { - LR0Items nextStateItems = LRParser::getNextStateItems ( currentLabel.getItems ( ), symbol, augmentedGrammar ); + LR0Items nextStateItems = getNextStateItems ( currentLabel.getItems ( ), symbol, augmentedGrammar ); if ( !nextStateItems.empty ( ) ) { label::LR0ItemsLabel nextStateLabel ( nextStateItems ); diff --git a/alib2algo/src/grammar/parsing/LR0Parser.h b/alib2algo/src/grammar/parsing/LR0Parser.h index cf06cf4b96a4492a653375610e3c64c2b1452e6b..e98fa8a66e27011c4cab3c945c768ea7111b75bf 100644 --- a/alib2algo/src/grammar/parsing/LR0Parser.h +++ b/alib2algo/src/grammar/parsing/LR0Parser.h @@ -20,6 +20,8 @@ class LR0Parser { public: static LR0Items getClosure ( LR0Items items, grammar::CFG originalGrammar ); + static LR0Items getNextStateItems ( LR0Items items, alphabet::Symbol symbol, grammar::CFG originalGrammar ); + static automaton::DFA getAutomaton ( grammar::CFG originalGrammar ); }; diff --git a/alib2algo/src/grammar/parsing/LRParser.cpp b/alib2algo/src/grammar/parsing/LRParser.cpp index 2c3d42b07e400b661328ba8ce55b1eaba4373672..f96a5fe785befcd1a8b4fef8158255d9f185fa1d 100644 --- a/alib2algo/src/grammar/parsing/LRParser.cpp +++ b/alib2algo/src/grammar/parsing/LRParser.cpp @@ -7,8 +7,6 @@ #include "LRParser.h" -#include "LR0Parser.h" - #include <stack> namespace grammar { @@ -36,27 +34,6 @@ grammar::CFG LRParser::getAugmentedGrammar ( grammar::CFG originalGrammar ) { return originalGrammar; } -LR0Items LRParser::getNextStateItems ( LR0Items items, alphabet::Symbol symbol, grammar::CFG originalGrammar ) { - LR0Items transitionItems; - for ( const LR0Items::value_type & symbolItems : items ) { - alphabet::Symbol leftHandSide = symbolItems.first; - for ( const std::pair < unsigned, std::vector < alphabet::Symbol > > & item : symbolItems.second) { - unsigned position = item.first; - std::vector < alphabet::Symbol > rightHandSide = item.second; - - if ( position == rightHandSide.size ( ) ) { - continue; - } - - if ( rightHandSide[position] == symbol ) { - transitionItems[leftHandSide].insert ( { position + 1, rightHandSide } ); - } - } - } - - return LR0Parser::getClosure ( transitionItems, originalGrammar ); -} - bool LRParser::parse ( LRActionTable actionTable, LRGotoTable gotoTable, automaton::State initialState, std::vector < alphabet::Symbol > input ) { std::stack < automaton::State > states; states.push ( initialState ); diff --git a/alib2algo/src/grammar/parsing/LRParser.h b/alib2algo/src/grammar/parsing/LRParser.h index 63349d60f2a53e4fc3150919d1b7db9505472daf..43a71070047c24c2d988490e56e57a9c22217ceb 100644 --- a/alib2algo/src/grammar/parsing/LRParser.h +++ b/alib2algo/src/grammar/parsing/LRParser.h @@ -24,8 +24,6 @@ public: static grammar::CFG getAugmentedGrammar ( grammar::CFG originalGrammar ); - static LR0Items getNextStateItems ( LR0Items items, alphabet::Symbol symbol, grammar::CFG originalGrammar ); - static bool parse ( LRActionTable actionTable, LRGotoTable gotoTable, automaton::State initialState, std::vector < alphabet::Symbol > input ); };