From c69d56e590a4041e8592e3a3b4360a6b6a426931 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ko=C4=8Di=C4=8Dka?= <martin.kocicka@gmail.com> Date: Wed, 11 May 2016 10:50:53 +0200 Subject: [PATCH] added method for generating next state in LR(0) automaton --- alib2algo/src/grammar/parsing/LRParser.cpp | 21 +++++++++++++++++++++ alib2algo/src/grammar/parsing/LRParser.h | 2 ++ 2 files changed, 23 insertions(+) diff --git a/alib2algo/src/grammar/parsing/LRParser.cpp b/alib2algo/src/grammar/parsing/LRParser.cpp index f6d19c69e6..11428be758 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 50c66a06c8..561f69bf8d 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 */ -- GitLab