diff --git a/alib2algo/src/grammar/parsing/LRParser.cpp b/alib2algo/src/grammar/parsing/LRParser.cpp index f6d19c69e6c63a8ffdf92447046574c4d2e02a15..11428be7588a03d041fa97aeb32b4931f10e1391 100644 --- a/alib2algo/src/grammar/parsing/LRParser.cpp +++ b/alib2algo/src/grammar/parsing/LRParser.cpp @@ -64,6 +64,27 @@ LR0Items LRParser::getClosure ( LR0Items items, grammar::CFG originalGrammar ) { return items; } +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 getClosure ( transitionItems, originalGrammar ); +} + } /* namespace parsing */ } /* namespace grammar */ diff --git a/alib2algo/src/grammar/parsing/LRParser.h b/alib2algo/src/grammar/parsing/LRParser.h index 50c66a06c8e558eaf41d326856379203b00e3df5..561f69bf8d59d050132b20bad9f65900a35d8955 100644 --- a/alib2algo/src/grammar/parsing/LRParser.h +++ b/alib2algo/src/grammar/parsing/LRParser.h @@ -23,6 +23,8 @@ public: static grammar::CFG getAugmentedGrammar ( grammar::CFG originalGrammar ); static LR0Items getClosure ( LR0Items items, grammar::CFG originalGrammar ); + + static LR0Items getNextStateItems ( LR0Items items, alphabet::Symbol symbol, grammar::CFG originalGrammar ); }; } /* namespace parsing */