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