From a5a148a8ec81307b21404f42b5bd43c7ccd328f6 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Wed, 14 Sep 2016 20:02:43 +0200
Subject: [PATCH] template RightLG grammar

---
 aaccess2/src/GrammarAccess.cpp                |   4 +-
 aaccess2/src/GrammarAccess.h                  |   2 +-
 acompare2/src/GrammarCompare.cpp              |   8 +-
 acompare2/src/GrammarCompare.h                |   6 +-
 alib2algo/src/grammar/parsing/First.cpp       |   4 +-
 alib2algo/src/grammar/parsing/Follow.cpp      |   4 +-
 .../src/grammar/parsing/LL1ParseTable.cpp     |   2 +-
 .../grammar/properties/IsLanguageEmpty.cpp    |   2 +-
 .../IsLanguageGeneratingEpsilon.cpp           |   2 +-
 .../properties/NonterminalUnitRuleCycle.cpp   |   2 +-
 .../properties/NullableNonterminals.cpp       |   2 +-
 .../properties/ProductiveNonterminals.cpp     |   2 +-
 .../properties/RecursiveNonterminal.cpp       |   2 +-
 .../grammar/properties/UnreachableSymbols.cpp |   2 +-
 .../src/grammar/simplify/EpsilonRemover.cpp   |   4 +-
 .../src/grammar/simplify/EpsilonRemover.h     |   2 +-
 .../grammar/simplify/LeftRecursionRemover.cpp |   8 +-
 .../grammar/simplify/LeftRecursionRemover.h   |   4 +-
 .../grammar/simplify/SimpleRulesRemover.cpp   |   4 +-
 .../src/grammar/simplify/SimpleRulesRemover.h |   2 +-
 alib2algo/src/grammar/simplify/ToCNF.cpp      |   4 +-
 alib2algo/src/grammar/simplify/ToCNF.h        |   2 +-
 alib2algo/src/grammar/simplify/ToGNF.cpp      |   4 +-
 alib2algo/src/grammar/simplify/ToGNF.h        |   2 +-
 alib2algo/src/grammar/simplify/Trim.cpp       |   2 +-
 .../simplify/UnproductiveSymbolsRemover.cpp   |   2 +-
 .../simplify/UnreachableSymbolsRemover.cpp    |   2 +-
 alib2data/src/grammar/GrammarFeatures.h       |   1 +
 alib2data/src/grammar/Regular/RightLG.cpp     | 198 +----------
 alib2data/src/grammar/Regular/RightLG.h       | 331 ++++++++++++++----
 alib2data/test-src/grammar/GrammarTest.cpp    |   4 +-
 .../src/grammar/GrammarFromStringParser.cpp   |   4 +-
 .../src/grammar/GrammarFromStringParser.h     |   2 +-
 .../src/grammar/GrammarToStringComposer.cpp   |   4 +-
 .../src/grammar/GrammarToStringComposer.h     |   2 +-
 35 files changed, 325 insertions(+), 307 deletions(-)

diff --git a/aaccess2/src/GrammarAccess.cpp b/aaccess2/src/GrammarAccess.cpp
index 2591e003cb..921a1f3ef8 100644
--- a/aaccess2/src/GrammarAccess.cpp
+++ b/aaccess2/src/GrammarAccess.cpp
@@ -43,7 +43,7 @@ void GrammarAccess::access ( grammar::RightRG & grammar, const GrammarSettings::
 
 auto GrammarAccessRightRG = GrammarAccess::RegistratorWrapper < void, grammar::RightRG > ( GrammarAccess::access );
 
-void GrammarAccess::access ( grammar::RightLG & grammar, const GrammarSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ) {
+void GrammarAccess::access ( grammar::RightLG < > & grammar, const GrammarSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ) {
 	if ( settings == GrammarSettings::Settings::NONTERMINALS )
 		return handleComponent < grammar::NonterminalAlphabet > ( grammar, operation, argument );
 
@@ -59,4 +59,4 @@ void GrammarAccess::access ( grammar::RightLG & grammar, const GrammarSettings::
 	throw exception::CommonException ( "Component not available" );
 }
 
-auto GrammarAccessRightLG = GrammarAccess::RegistratorWrapper < void, grammar::RightLG > ( GrammarAccess::access );
+auto GrammarAccessRightLG = GrammarAccess::RegistratorWrapper < void, grammar::RightLG < > > ( GrammarAccess::access );
diff --git a/aaccess2/src/GrammarAccess.h b/aaccess2/src/GrammarAccess.h
index 0f479a704b..014b6b4c96 100644
--- a/aaccess2/src/GrammarAccess.h
+++ b/aaccess2/src/GrammarAccess.h
@@ -22,7 +22,7 @@ public:
 	static void access ( grammar::Grammar & grammar, const GrammarSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument );
 
 	static void access ( grammar::RightRG & grammar, const GrammarSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument );
-	static void access ( grammar::RightLG & grammar, const GrammarSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument );
+	static void access ( grammar::RightLG < > & grammar, const GrammarSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument );
 };
 
 #endif /* GRAMMAR_ACCESS_H_ */
diff --git a/acompare2/src/GrammarCompare.cpp b/acompare2/src/GrammarCompare.cpp
index d9189da995..4c08a56d91 100644
--- a/acompare2/src/GrammarCompare.cpp
+++ b/acompare2/src/GrammarCompare.cpp
@@ -44,7 +44,7 @@ bool GrammarCompare::testCompare(const grammar::LeftRG < > & a, const grammar::L
 			a.getTerminalAlphabet()    == b.getTerminalAlphabet()    ;
 }
 
-bool GrammarCompare::testCompare(const grammar::RightLG& a, const grammar::RightLG& b) {
+bool GrammarCompare::testCompare(const grammar::RightLG < > & a, const grammar::RightLG < > & b) {
 	return  	a.getNonterminalAlphabet() == b.getNonterminalAlphabet() &&
 			a.getRules()               == b.getRules()               &&
 			a.getInitialSymbol()       == b.getInitialSymbol()       &&
@@ -229,7 +229,7 @@ void GrammarCompare::printCompare(const grammar::LeftRG < > & a, const grammar::
 	}
 }
 
-void GrammarCompare::printCompare(const grammar::RightLG& a, const grammar::RightLG& b) {
+void GrammarCompare::printCompare(const grammar::RightLG < > & a, const grammar::RightLG < > & b) {
 	std::cout << "GrammarCompareer" << std::endl;
 
 	if(a.getNonterminalAlphabet() != b.getNonterminalAlphabet()) {
@@ -581,7 +581,7 @@ int GrammarCompare::compare(const grammar::LeftRG < > & a, const grammar::LeftRG
 
 auto GrammarCompareLeftRG = GrammarCompare::RegistratorWrapper<int, grammar::LeftRG < >, grammar::LeftRG < > >(GrammarCompare::compare);
 
-int GrammarCompare::compare(const grammar::RightLG& a, const grammar::RightLG& b) {
+int GrammarCompare::compare(const grammar::RightLG < > & a, const grammar::RightLG < > & b) {
 	if(!GrammarCompare::testCompare(a, b)) {
 	  GrammarCompare::printCompare(a, b);
 	  return 1;
@@ -590,7 +590,7 @@ int GrammarCompare::compare(const grammar::RightLG& a, const grammar::RightLG& b
 	}
 }
 
-auto GrammarCompareRightLG = GrammarCompare::RegistratorWrapper<int, grammar::RightLG, grammar::RightLG>(GrammarCompare::compare);
+auto GrammarCompareRightLG = GrammarCompare::RegistratorWrapper<int, grammar::RightLG < >, grammar::RightLG < > >(GrammarCompare::compare);
 
 int GrammarCompare::compare(const grammar::RightRG& a, const grammar::RightRG& b) {
 	if(!GrammarCompare::testCompare(a, b)) {
diff --git a/acompare2/src/GrammarCompare.h b/acompare2/src/GrammarCompare.h
index 17672d4422..23660ba646 100644
--- a/acompare2/src/GrammarCompare.h
+++ b/acompare2/src/GrammarCompare.h
@@ -26,8 +26,8 @@ private:
 	static bool testCompare(const grammar::LeftRG < > & a, const grammar::LeftRG < > & b);
 	static void printCompare(const grammar::LeftRG < > & a, const grammar::LeftRG < > & b);
 
-	static bool testCompare(const grammar::RightLG& a, const grammar::RightLG& b);
-	static void printCompare(const grammar::RightLG& a, const grammar::RightLG& b);
+	static bool testCompare(const grammar::RightLG < > & a, const grammar::RightLG < > & b);
+	static void printCompare(const grammar::RightLG < > & a, const grammar::RightLG < > & b);
 
 	static bool testCompare(const grammar::RightRG& a, const grammar::RightRG& b);
 	static void printCompare(const grammar::RightRG& a, const grammar::RightRG& b);
@@ -65,7 +65,7 @@ private:
 public:
 	static int compare(const grammar::LeftLG < > & a, const grammar::LeftLG < > & b);
 	static int compare(const grammar::LeftRG < > & a, const grammar::LeftRG < > & b);
-	static int compare(const grammar::RightLG& a, const grammar::RightLG& b);
+	static int compare(const grammar::RightLG < > & a, const grammar::RightLG < > & b);
 	static int compare(const grammar::RightRG& a, const grammar::RightRG& b);
 	static int compare(const grammar::LG < > & a, const grammar::LG < > & b);
 	static int compare(const grammar::CFG < > & a, const grammar::CFG < > & b);
diff --git a/alib2algo/src/grammar/parsing/First.cpp b/alib2algo/src/grammar/parsing/First.cpp
index 913d697942..0b51467237 100644
--- a/alib2algo/src/grammar/parsing/First.cpp
+++ b/alib2algo/src/grammar/parsing/First.cpp
@@ -111,7 +111,7 @@ auto FirstCNF = FirstBase1::RegistratorWrapper < FirstResult1, grammar::CNF < >
 auto FirstLG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::LG < > > ( First::first );
 auto FirstLeftLG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::LeftLG < > > ( First::first );
 auto FirstLeftRG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::LeftRG < > > ( First::first );
-auto FirstRightLG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::RightLG > ( First::first );
+auto FirstRightLG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::RightLG < > > ( First::first );
 auto FirstRightRG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::RightRG > ( First::first );
 
 std::map < std::vector < alphabet::Symbol >, std::set < std::variant < alphabet::Symbol, string::Epsilon < > > > > First::first ( const grammar::Grammar & grammar ) {
@@ -125,7 +125,7 @@ auto FirstCNF2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::CNF < >
 auto FirstLG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::LG < > > ( First::first );
 auto FirstLeftLG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::LeftLG < > > ( First::first );
 auto FirstLeftRG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::LeftRG < > > ( First::first );
-auto FirstRightLG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::RightLG > ( First::first );
+auto FirstRightLG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::RightLG < > > ( First::first );
 auto FirstRightRG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::RightRG > ( First::first );
 
 std::set < std::variant < alphabet::Symbol, string::Epsilon < > > > First::first ( const grammar::Grammar & grammar, const std::vector < alphabet::Symbol > & rhs ) {
diff --git a/alib2algo/src/grammar/parsing/Follow.cpp b/alib2algo/src/grammar/parsing/Follow.cpp
index 22a2726e2d..086daa5678 100644
--- a/alib2algo/src/grammar/parsing/Follow.cpp
+++ b/alib2algo/src/grammar/parsing/Follow.cpp
@@ -99,7 +99,7 @@ auto FollowCNF = FollowBase1::RegistratorWrapper < FollowResult1, grammar::CNF <
 auto FollowLG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::LG < > > ( Follow::follow );
 auto FollowLeftLG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::LeftLG < > > ( Follow::follow );
 auto FollowLeftRG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::LeftRG < > > ( Follow::follow );
-auto FollowRightLG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::RightLG > ( Follow::follow );
+auto FollowRightLG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::RightLG < > > ( Follow::follow );
 auto FollowRightRG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::RightRG > ( Follow::follow );
 
 std::map < alphabet::Symbol, std::set < std::variant < alphabet::Symbol, string::Epsilon < > > > > Follow::follow ( const grammar::Grammar & grammar ) {
@@ -113,7 +113,7 @@ auto FollowCNF2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::CNF
 auto FollowLG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::LG < > > ( Follow::follow );
 auto FollowLeftLG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::LeftLG < > > ( Follow::follow );
 auto FollowLeftRG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::LeftRG < > > ( Follow::follow );
-auto FollowRightLG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::RightLG > ( Follow::follow );
+auto FollowRightLG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::RightLG < > > ( Follow::follow );
 auto FollowRightRG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::RightRG > ( Follow::follow );
 
 std::set < std::variant < alphabet::Symbol, string::Epsilon < > > > Follow::follow ( const grammar::Grammar & grammar, const alphabet::Symbol & nt ) {
diff --git a/alib2algo/src/grammar/parsing/LL1ParseTable.cpp b/alib2algo/src/grammar/parsing/LL1ParseTable.cpp
index 5c922b792e..e0015690d9 100644
--- a/alib2algo/src/grammar/parsing/LL1ParseTable.cpp
+++ b/alib2algo/src/grammar/parsing/LL1ParseTable.cpp
@@ -57,7 +57,7 @@ auto LL1ParseTableCNF = LL1ParseTable::RegistratorWrapper < std::map < std::pair
 auto LL1ParseTableLG  = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::LG < > > ( LL1ParseTable::parseTable );
 auto LL1ParseTableLeftLG  = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::LeftLG < > > ( LL1ParseTable::parseTable );
 auto LL1ParseTableLeftRG  = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::LeftRG < > > ( LL1ParseTable::parseTable );
-auto LL1ParseTableRightLG = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::RightLG > ( LL1ParseTable::parseTable );
+auto LL1ParseTableRightLG = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::RightLG < > > ( LL1ParseTable::parseTable );
 auto LL1ParseTableRightRG = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::RightRG > ( LL1ParseTable::parseTable );
 
 std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > > LL1ParseTable::parseTable ( const grammar::Grammar & grammar ) {
diff --git a/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp b/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp
index f5adeeddee..abe542b37d 100644
--- a/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp
+++ b/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp
@@ -35,7 +35,7 @@ auto IsLanguageEmptyCNF = IsLanguageEmpty::RegistratorWrapper<bool, grammar::CNF
 auto IsLanguageEmptyLG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::LG < > >(IsLanguageEmpty::isLanguageEmpty);
 auto IsLanguageEmptyLeftLG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::LeftLG < > >(IsLanguageEmpty::isLanguageEmpty);
 auto IsLanguageEmptyLeftRG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::LeftRG < > >(IsLanguageEmpty::isLanguageEmpty);
-auto IsLanguageEmptyRightLG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::RightLG>(IsLanguageEmpty::isLanguageEmpty);
+auto IsLanguageEmptyRightLG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::RightLG < > >(IsLanguageEmpty::isLanguageEmpty);
 auto IsLanguageEmptyRightRG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::RightRG>(IsLanguageEmpty::isLanguageEmpty);
 
 } /* namespace properties */
diff --git a/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp b/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp
index 775361ac1d..55b9e38570 100644
--- a/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp
+++ b/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp
@@ -35,7 +35,7 @@ auto IsLanguageGeneratingEpsilonCNF = IsLanguageGeneratingEpsilon::RegistratorWr
 auto IsLanguageGeneratingEpsilonLG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::LG < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
 auto IsLanguageGeneratingEpsilonLeftLG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::LeftLG < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
 auto IsLanguageGeneratingEpsilonLeftRG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::LeftRG < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
-auto IsLanguageGeneratingEpsilonRightLG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::RightLG>(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
+auto IsLanguageGeneratingEpsilonRightLG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::RightLG < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
 auto IsLanguageGeneratingEpsilonRightRG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::RightRG>(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
 
 } /* namespace properties */
diff --git a/alib2algo/src/grammar/properties/NonterminalUnitRuleCycle.cpp b/alib2algo/src/grammar/properties/NonterminalUnitRuleCycle.cpp
index b9e299d7a0..ad8266481d 100644
--- a/alib2algo/src/grammar/properties/NonterminalUnitRuleCycle.cpp
+++ b/alib2algo/src/grammar/properties/NonterminalUnitRuleCycle.cpp
@@ -64,7 +64,7 @@ auto NonterminalUnitRuleCycleCNF = NonterminalUnitRuleCycle::RegistratorWrapper<
 auto NonterminalUnitRuleCycleLG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LG < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
 auto NonterminalUnitRuleCycleLeftLG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftLG < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
 auto NonterminalUnitRuleCycleLeftRG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftRG < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
-auto NonterminalUnitRuleCycleRightLG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightLG>(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
+auto NonterminalUnitRuleCycleRightLG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightLG < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
 auto NonterminalUnitRuleCycleRightRG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightRG>(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
 
 std::set<alphabet::Symbol> NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle(const grammar::Grammar& grammar, const alphabet::Symbol& nonterminal) {
diff --git a/alib2algo/src/grammar/properties/NullableNonterminals.cpp b/alib2algo/src/grammar/properties/NullableNonterminals.cpp
index 51a4fe0203..8e0ecd993f 100644
--- a/alib2algo/src/grammar/properties/NullableNonterminals.cpp
+++ b/alib2algo/src/grammar/properties/NullableNonterminals.cpp
@@ -58,7 +58,7 @@ auto NullableNonterminalsCNF = NullableNonterminals::RegistratorWrapper<std::set
 auto NullableNonterminalsLG = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LG < > >(NullableNonterminals::getNullableNonterminals);
 auto NullableNonterminalsLeftLG = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftLG < > >(NullableNonterminals::getNullableNonterminals);
 auto NullableNonterminalsLeftRG = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftRG < > >(NullableNonterminals::getNullableNonterminals);
-auto NullableNonterminalsRightLG = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightLG>(NullableNonterminals::getNullableNonterminals);
+auto NullableNonterminalsRightLG = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightLG < > >(NullableNonterminals::getNullableNonterminals);
 auto NullableNonterminalsRightRG = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightRG>(NullableNonterminals::getNullableNonterminals);
 
 } /* namespace properties */
diff --git a/alib2algo/src/grammar/properties/ProductiveNonterminals.cpp b/alib2algo/src/grammar/properties/ProductiveNonterminals.cpp
index bbbd8d0eb5..8113a87fd8 100644
--- a/alib2algo/src/grammar/properties/ProductiveNonterminals.cpp
+++ b/alib2algo/src/grammar/properties/ProductiveNonterminals.cpp
@@ -63,7 +63,7 @@ auto ProductiveNonterminalsCNF = ProductiveNonterminals::RegistratorWrapper<std:
 auto ProductiveNonterminalsLG = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LG < > >(ProductiveNonterminals::getProductiveNonterminals);
 auto ProductiveNonterminalsLeftLG = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftLG < > >(ProductiveNonterminals::getProductiveNonterminals);
 auto ProductiveNonterminalsLeftRG = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftRG < > >(ProductiveNonterminals::getProductiveNonterminals);
-auto ProductiveNonterminalsRightLG = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightLG>(ProductiveNonterminals::getProductiveNonterminals);
+auto ProductiveNonterminalsRightLG = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightLG < > >(ProductiveNonterminals::getProductiveNonterminals);
 auto ProductiveNonterminalsRightRG = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightRG>(ProductiveNonterminals::getProductiveNonterminals);
 
 } /* namespace properties */
diff --git a/alib2algo/src/grammar/properties/RecursiveNonterminal.cpp b/alib2algo/src/grammar/properties/RecursiveNonterminal.cpp
index 7501df004a..af6f4bea67 100644
--- a/alib2algo/src/grammar/properties/RecursiveNonterminal.cpp
+++ b/alib2algo/src/grammar/properties/RecursiveNonterminal.cpp
@@ -70,7 +70,7 @@ auto RecursiveNonterminalCNF = RecursiveNonterminal::RegistratorWrapper < bool,
 auto RecursiveNonterminalLG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::LG < > > ( RecursiveNonterminal::isNonterminalRecursive );
 auto RecursiveNonterminalLeftLG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::LeftLG < > > ( RecursiveNonterminal::isNonterminalRecursive );
 auto RecursiveNonterminalLeftRG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::LeftRG < > > ( RecursiveNonterminal::isNonterminalRecursive );
-auto RecursiveNonterminalRightLG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::RightLG > ( RecursiveNonterminal::isNonterminalRecursive );
+auto RecursiveNonterminalRightLG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::RightLG < > > ( RecursiveNonterminal::isNonterminalRecursive );
 auto RecursiveNonterminalRightRG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::RightRG > ( RecursiveNonterminal::isNonterminalRecursive );
 
 bool RecursiveNonterminal::isNonterminalRecursive ( const grammar::Grammar & grammar, const alphabet::Symbol & nonterminal ) {
diff --git a/alib2algo/src/grammar/properties/UnreachableSymbols.cpp b/alib2algo/src/grammar/properties/UnreachableSymbols.cpp
index 472c937ff4..b69cd2238e 100644
--- a/alib2algo/src/grammar/properties/UnreachableSymbols.cpp
+++ b/alib2algo/src/grammar/properties/UnreachableSymbols.cpp
@@ -64,7 +64,7 @@ auto UnreachableSymbolsCNF = UnreachableSymbols::RegistratorWrapper<std::set<alp
 auto UnreachableSymbolsLG = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LG < > >(UnreachableSymbols::getUnreachableSymbols);
 auto UnreachableSymbolsLeftLG = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftLG < > >(UnreachableSymbols::getUnreachableSymbols);
 auto UnreachableSymbolsLeftRG = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftRG < > >(UnreachableSymbols::getUnreachableSymbols);
-auto UnreachableSymbolsRightLG = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightLG>(UnreachableSymbols::getUnreachableSymbols);
+auto UnreachableSymbolsRightLG = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightLG < > >(UnreachableSymbols::getUnreachableSymbols);
 auto UnreachableSymbolsRightRG = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightRG>(UnreachableSymbols::getUnreachableSymbols);
 
 } /* namespace properties */
diff --git a/alib2algo/src/grammar/simplify/EpsilonRemover.cpp b/alib2algo/src/grammar/simplify/EpsilonRemover.cpp
index 1830f3341e..328eaadb31 100644
--- a/alib2algo/src/grammar/simplify/EpsilonRemover.cpp
+++ b/alib2algo/src/grammar/simplify/EpsilonRemover.cpp
@@ -94,11 +94,11 @@ grammar::LeftRG < > EpsilonRemover::remove(const grammar::LeftRG < > & origGramm
 
 auto EpsilonRemoverLeftRG = EpsilonRemover::RegistratorWrapper<grammar::LeftRG < >, grammar::LeftRG < > >(EpsilonRemover::remove);
 
-grammar::EpsilonFreeCFG < > EpsilonRemover::remove(const grammar::RightLG& origGrammar) {
+grammar::EpsilonFreeCFG < > EpsilonRemover::remove(const grammar::RightLG < > & origGrammar) {
 	return removeInternal(origGrammar);
 }
 
-auto EpsilonRemoverRightLG = EpsilonRemover::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::RightLG>(EpsilonRemover::remove);
+auto EpsilonRemoverRightLG = EpsilonRemover::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::RightLG < > >(EpsilonRemover::remove);
 
 grammar::RightRG EpsilonRemover::remove(const grammar::RightRG& origGrammar) {
 	return origGrammar;
diff --git a/alib2algo/src/grammar/simplify/EpsilonRemover.h b/alib2algo/src/grammar/simplify/EpsilonRemover.h
index f0b7240314..268ce46a31 100644
--- a/alib2algo/src/grammar/simplify/EpsilonRemover.h
+++ b/alib2algo/src/grammar/simplify/EpsilonRemover.h
@@ -39,7 +39,7 @@ public:
 	static grammar::EpsilonFreeCFG < > remove( const grammar::LG < > & grammar );
 	static grammar::EpsilonFreeCFG < > remove( const grammar::LeftLG < > & grammar );
 	static grammar::LeftRG < > remove( const grammar::LeftRG < > & grammar );
-	static grammar::EpsilonFreeCFG < > remove( const grammar::RightLG & grammar );
+	static grammar::EpsilonFreeCFG < > remove( const grammar::RightLG < > & grammar );
 	static grammar::RightRG remove( const grammar::RightRG & grammar );
 };
 
diff --git a/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp b/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp
index 82eb493109..74a9cea8bc 100644
--- a/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp
+++ b/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp
@@ -160,11 +160,11 @@ grammar::RightRG LeftRecursionRemover::remove(const grammar::RightRG& origGramma
 
 auto LeftRecursionRemoverRightRG = LeftRecursionRemover::RegistratorWrapper<grammar::RightRG, grammar::RightRG>(LeftRecursionRemover::remove);
 
-grammar::RightLG LeftRecursionRemover::remove(const grammar::RightLG& origGrammar) {
+grammar::RightLG < > LeftRecursionRemover::remove(const grammar::RightLG < > & origGrammar) {
 	return origGrammar;
 }
 
-auto LeftRecursionRemoverRightLG = LeftRecursionRemover::RegistratorWrapper<grammar::RightLG, grammar::RightLG>(LeftRecursionRemover::remove);
+auto LeftRecursionRemoverRightLG = LeftRecursionRemover::RegistratorWrapper<grammar::RightLG < >, grammar::RightLG < > >(LeftRecursionRemover::remove);
 
 grammar::RightRG LeftRecursionRemover::remove(const grammar::LeftRG < > & origGrammar) {
 	return convert::ToGrammarRightRG::convert(origGrammar);
@@ -172,11 +172,11 @@ grammar::RightRG LeftRecursionRemover::remove(const grammar::LeftRG < > & origGr
 
 auto LeftRecursionRemoverLeftRG = LeftRecursionRemover::RegistratorWrapper<grammar::RightRG, grammar::LeftRG < > >(LeftRecursionRemover::remove);
 
-grammar::RightLG LeftRecursionRemover::remove(const grammar::LeftLG < > & /* origGrammar */) {
+grammar::RightLG < > LeftRecursionRemover::remove(const grammar::LeftLG < > & /* origGrammar */) {
 	throw exception::CommonException("LeftRecursionRemover: Removing from LeftLG NYI"); // TODO
 }
 
-auto LeftRecursionRemoverLeftLG = LeftRecursionRemover::RegistratorWrapper<grammar::RightLG, grammar::LeftLG < > >(LeftRecursionRemover::remove);
+auto LeftRecursionRemoverLeftLG = LeftRecursionRemover::RegistratorWrapper<grammar::RightLG < >, grammar::LeftLG < > >(LeftRecursionRemover::remove);
 
 grammar::Grammar LeftRecursionRemover::remove(const grammar::Grammar& grammar) {
 	return dispatch(grammar.getData());
diff --git a/alib2algo/src/grammar/simplify/LeftRecursionRemover.h b/alib2algo/src/grammar/simplify/LeftRecursionRemover.h
index 578910092a..f2e4cb47e9 100644
--- a/alib2algo/src/grammar/simplify/LeftRecursionRemover.h
+++ b/alib2algo/src/grammar/simplify/LeftRecursionRemover.h
@@ -36,9 +36,9 @@ public:
 	static grammar::EpsilonFreeCFG < > remove( const grammar::CNF < > & grammar );
 	static grammar::GNF < > remove( const grammar::GNF < > & grammar );
 	static grammar::RightRG remove( const grammar::RightRG & grammar );
-	static grammar::RightLG remove( const grammar::RightLG & grammar );
+	static grammar::RightLG < > remove( const grammar::RightLG < > & grammar );
 	static grammar::RightRG remove( const grammar::LeftRG < > & grammar );
-	static grammar::RightLG remove( const grammar::LeftLG < > & grammar );
+	static grammar::RightLG < > remove( const grammar::LeftLG < > & grammar );
 };
 
 } /* namespace simplify */
diff --git a/alib2algo/src/grammar/simplify/SimpleRulesRemover.cpp b/alib2algo/src/grammar/simplify/SimpleRulesRemover.cpp
index 68991a1b54..7b494fbcea 100644
--- a/alib2algo/src/grammar/simplify/SimpleRulesRemover.cpp
+++ b/alib2algo/src/grammar/simplify/SimpleRulesRemover.cpp
@@ -109,11 +109,11 @@ grammar::LeftRG < > SimpleRulesRemover::remove(const grammar::LeftRG < > & origG
 
 auto SimpleRulesRemoverLeftRG = SimpleRulesRemover::RegistratorWrapper<grammar::LeftRG < >, grammar::LeftRG < > >(SimpleRulesRemover::remove);
 
-grammar::RightLG SimpleRulesRemover::remove(const grammar::RightLG& origGrammar) {
+grammar::RightLG < > SimpleRulesRemover::remove(const grammar::RightLG < > & origGrammar) {
 	return removeNonEpsilonFree(origGrammar);
 }
 
-auto SimpleRulesRemoverRightLG = SimpleRulesRemover::RegistratorWrapper<grammar::RightLG, grammar::RightLG>(SimpleRulesRemover::remove);
+auto SimpleRulesRemoverRightLG = SimpleRulesRemover::RegistratorWrapper<grammar::RightLG < >, grammar::RightLG < > >(SimpleRulesRemover::remove);
 
 grammar::RightRG SimpleRulesRemover::remove(const grammar::RightRG& origGrammar) {
 	return origGrammar;
diff --git a/alib2algo/src/grammar/simplify/SimpleRulesRemover.h b/alib2algo/src/grammar/simplify/SimpleRulesRemover.h
index afe64e809e..ac4e8f18ee 100644
--- a/alib2algo/src/grammar/simplify/SimpleRulesRemover.h
+++ b/alib2algo/src/grammar/simplify/SimpleRulesRemover.h
@@ -39,7 +39,7 @@ public:
 	static grammar::LG < > remove( const grammar::LG < > & grammar );
 	static grammar::LeftLG < > remove( const grammar::LeftLG < > & grammar );
 	static grammar::LeftRG < > remove( const grammar::LeftRG < > & grammar );
-	static grammar::RightLG remove( const grammar::RightLG & grammar );
+	static grammar::RightLG < > remove( const grammar::RightLG < > & grammar );
 	static grammar::RightRG remove( const grammar::RightRG & grammar );
 };
 
diff --git a/alib2algo/src/grammar/simplify/ToCNF.cpp b/alib2algo/src/grammar/simplify/ToCNF.cpp
index 0c698bb422..7f30761a04 100644
--- a/alib2algo/src/grammar/simplify/ToCNF.cpp
+++ b/alib2algo/src/grammar/simplify/ToCNF.cpp
@@ -159,11 +159,11 @@ grammar::CNF < > ToCNF::convert(const grammar::LeftRG < > & origGrammar) {
 
 auto ToCNFLeftRG = ToCNF::RegistratorWrapper<grammar::CNF < >, grammar::LeftRG < > >(ToCNF::convert);
 
-grammar::CNF < > ToCNF::convert(const grammar::RightLG& origGrammar) {
+grammar::CNF < > ToCNF::convert(const grammar::RightLG < > & origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar)));
 }
 
-auto ToCNFRightLG = ToCNF::RegistratorWrapper<grammar::CNF < >, grammar::RightLG>(ToCNF::convert);
+auto ToCNFRightLG = ToCNF::RegistratorWrapper<grammar::CNF < >, grammar::RightLG < > >(ToCNF::convert);
 
 grammar::CNF < > ToCNF::convert(const grammar::RightRG& origGrammar) {
 	return convertInternal(origGrammar);
diff --git a/alib2algo/src/grammar/simplify/ToCNF.h b/alib2algo/src/grammar/simplify/ToCNF.h
index fd00e818f4..dc861d9d50 100644
--- a/alib2algo/src/grammar/simplify/ToCNF.h
+++ b/alib2algo/src/grammar/simplify/ToCNF.h
@@ -39,7 +39,7 @@ public:
 	static grammar::CNF < > convert( const grammar::LG < > & grammar );
 	static grammar::CNF < > convert( const grammar::LeftLG < > & grammar );
 	static grammar::CNF < > convert( const grammar::LeftRG < > & grammar );
-	static grammar::CNF < > convert( const grammar::RightLG & grammar );
+	static grammar::CNF < > convert( const grammar::RightLG < > & grammar );
 	static grammar::CNF < > convert( const grammar::RightRG & grammar );
 };
 
diff --git a/alib2algo/src/grammar/simplify/ToGNF.cpp b/alib2algo/src/grammar/simplify/ToGNF.cpp
index d9fdf93646..89d019f034 100644
--- a/alib2algo/src/grammar/simplify/ToGNF.cpp
+++ b/alib2algo/src/grammar/simplify/ToGNF.cpp
@@ -129,11 +129,11 @@ grammar::RightRG ToGNF::convert(const grammar::LeftRG < > & origGrammar) {
 
 auto ToGNFLeftRG = ToGNF::RegistratorWrapper<grammar::RightRG, grammar::LeftRG < > >(ToGNF::convert);
 
-grammar::GNF < > ToGNF::convert(const grammar::RightLG& origGrammar) {
+grammar::GNF < > ToGNF::convert(const grammar::RightLG < > & origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::LeftRecursionRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar))));
 }
 
-auto ToGNFRightLG = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::RightLG>(ToGNF::convert);
+auto ToGNFRightLG = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::RightLG < > >(ToGNF::convert);
 
 grammar::RightRG ToGNF::convert(const grammar::RightRG& origGrammar) {
 	return origGrammar;
diff --git a/alib2algo/src/grammar/simplify/ToGNF.h b/alib2algo/src/grammar/simplify/ToGNF.h
index a52794c8a3..2687c48238 100644
--- a/alib2algo/src/grammar/simplify/ToGNF.h
+++ b/alib2algo/src/grammar/simplify/ToGNF.h
@@ -39,7 +39,7 @@ public:
 	static grammar::GNF < > convert( const grammar::LG < > & grammar );
 	static grammar::GNF < > convert( const grammar::LeftLG < > & grammar );
 	static grammar::RightRG convert( const grammar::LeftRG < > & grammar );
-	static grammar::GNF < > convert( const grammar::RightLG & grammar );
+	static grammar::GNF < > convert( const grammar::RightLG < > & grammar );
 	static grammar::RightRG convert( const grammar::RightRG & grammar );
 };
 
diff --git a/alib2algo/src/grammar/simplify/Trim.cpp b/alib2algo/src/grammar/simplify/Trim.cpp
index 39cd6ef41f..da336fb1ef 100644
--- a/alib2algo/src/grammar/simplify/Trim.cpp
+++ b/alib2algo/src/grammar/simplify/Trim.cpp
@@ -36,7 +36,7 @@ auto TrimCNF = Trim::RegistratorWrapper<grammar::CNF < >, grammar::CNF < > >(Tri
 auto TrimLG = Trim::RegistratorWrapper<grammar::LG < >, grammar::LG < > >(Trim::trim);
 auto TrimLeftLG = Trim::RegistratorWrapper<grammar::LeftLG < >, grammar::LeftLG < > >(Trim::trim);
 auto TrimLeftRG = Trim::RegistratorWrapper<grammar::LeftRG < >, grammar::LeftRG < > >(Trim::trim);
-auto TrimRightLG = Trim::RegistratorWrapper<grammar::RightLG, grammar::RightLG>(Trim::trim);
+auto TrimRightLG = Trim::RegistratorWrapper<grammar::RightLG < >, grammar::RightLG < > >(Trim::trim);
 auto TrimRightRG = Trim::RegistratorWrapper<grammar::RightRG, grammar::RightRG>(Trim::trim);
 
 grammar::Grammar Trim::trim(const grammar::Grammar& grammar) {
diff --git a/alib2algo/src/grammar/simplify/UnproductiveSymbolsRemover.cpp b/alib2algo/src/grammar/simplify/UnproductiveSymbolsRemover.cpp
index 86147f2bff..a1750a7eb6 100644
--- a/alib2algo/src/grammar/simplify/UnproductiveSymbolsRemover.cpp
+++ b/alib2algo/src/grammar/simplify/UnproductiveSymbolsRemover.cpp
@@ -67,7 +67,7 @@ auto UnproductiveSymbolsRemoverCNF = UnproductiveSymbolsRemover::RegistratorWrap
 auto UnproductiveSymbolsRemoverLG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::LG < >, grammar::LG < > >(UnproductiveSymbolsRemover::remove);
 auto UnproductiveSymbolsRemoverLeftLG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::LeftLG < >, grammar::LeftLG < > >(UnproductiveSymbolsRemover::remove);
 auto UnproductiveSymbolsRemoverLeftRG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::LeftRG < >, grammar::LeftRG < > >(UnproductiveSymbolsRemover::remove);
-auto UnproductiveSymbolsRemoverRightLG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::RightLG, grammar::RightLG>(UnproductiveSymbolsRemover::remove);
+auto UnproductiveSymbolsRemoverRightLG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::RightLG < >, grammar::RightLG < > >(UnproductiveSymbolsRemover::remove);
 auto UnproductiveSymbolsRemoverRightRG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::RightRG, grammar::RightRG>(UnproductiveSymbolsRemover::remove);
 
 grammar::Grammar UnproductiveSymbolsRemover::remove(const grammar::Grammar& grammar) {
diff --git a/alib2algo/src/grammar/simplify/UnreachableSymbolsRemover.cpp b/alib2algo/src/grammar/simplify/UnreachableSymbolsRemover.cpp
index 15c8c65dc9..d4d6ab4263 100644
--- a/alib2algo/src/grammar/simplify/UnreachableSymbolsRemover.cpp
+++ b/alib2algo/src/grammar/simplify/UnreachableSymbolsRemover.cpp
@@ -66,7 +66,7 @@ auto UnreachableSymbolsRemoverCNF = UnreachableSymbolsRemover::RegistratorWrappe
 auto UnreachableSymbolsRemoverLG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::LG < >, grammar::LG < > >(UnreachableSymbolsRemover::remove);
 auto UnreachableSymbolsRemoverLeftLG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::LeftLG < >, grammar::LeftLG < > >(UnreachableSymbolsRemover::remove);
 auto UnreachableSymbolsRemoverLeftRG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::LeftRG < >, grammar::LeftRG < > >(UnreachableSymbolsRemover::remove);
-auto UnreachableSymbolsRemoverRightLG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::RightLG, grammar::RightLG>(UnreachableSymbolsRemover::remove);
+auto UnreachableSymbolsRemoverRightLG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::RightLG < >, grammar::RightLG < > >(UnreachableSymbolsRemover::remove);
 auto UnreachableSymbolsRemoverRightRG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::RightRG, grammar::RightRG>(UnreachableSymbolsRemover::remove);
 
 grammar::Grammar UnreachableSymbolsRemover::remove(const grammar::Grammar& grammar) {
diff --git a/alib2data/src/grammar/GrammarFeatures.h b/alib2data/src/grammar/GrammarFeatures.h
index 119db86d6d..f66ce36b6d 100644
--- a/alib2data/src/grammar/GrammarFeatures.h
+++ b/alib2data/src/grammar/GrammarFeatures.h
@@ -35,6 +35,7 @@ template<class SymbolType = typename alphabet::Symbol >
 class LeftLG;
 template<class SymbolType = typename alphabet::Symbol >
 class LeftRG;
+template<class SymbolType = typename alphabet::Symbol >
 class RightLG;
 class RightRG;
 template<class SymbolType = typename alphabet::Symbol >
diff --git a/alib2data/src/grammar/Regular/RightLG.cpp b/alib2data/src/grammar/Regular/RightLG.cpp
index 8ea8a51146..998787d6da 100644
--- a/alib2data/src/grammar/Regular/RightLG.cpp
+++ b/alib2data/src/grammar/Regular/RightLG.cpp
@@ -6,207 +6,13 @@
  */
 
 #include "RightLG.h"
-#include <algorithm>
-#include <sstream>
-
-#include "../../alphabet/Symbol.h"
-
-#include <sax/FromXMLParserHelper.h>
-#include "../common/GrammarFromXMLParser.h"
-#include "../common/GrammarToXMLComposer.h"
 #include "../Grammar.h"
 #include <object/Object.h>
 #include <XmlApi.hpp>
 
-namespace grammar {
-
-RightLG::RightLG ( alphabet::Symbol initialSymbol ) : RightLG ( std::set < alphabet::Symbol > { initialSymbol }, std::set < alphabet::Symbol > ( ), initialSymbol ) {
-}
-
-RightLG::RightLG ( std::set < alphabet::Symbol > nonterminalAlphabet, std::set < alphabet::Symbol > terminalAlphabet, alphabet::Symbol initialSymbol ) : std::Components < RightLG, alphabet::Symbol, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > ( std::make_tuple ( std::move ( terminalAlphabet ), std::move ( nonterminalAlphabet ) ), std::make_tuple ( std::move ( initialSymbol ) ) ) {
-}
-
-GrammarBase * RightLG::clone ( ) const {
-	return new RightLG ( * this );
-}
-
-GrammarBase * RightLG::plunder ( ) && {
-	return new RightLG ( std::move ( * this ) );
-}
-
-bool RightLG::addRule ( alphabet::Symbol leftHandSide, std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > rightHandSide ) {
-	if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) )
-		throw GrammarException ( "Rule must rewrite nonterminal symbol" );
-
-	if ( rightHandSide.is < std::vector < alphabet::Symbol > > ( ) ) {
-		for ( const auto & symbol : rightHandSide.get < std::vector < alphabet::Symbol > > ( ) )
-			if ( !getTerminalAlphabet ( ).count ( symbol ) )
-				throw GrammarException ( "Symbol " + std::to_string ( symbol ) + " is not a terminal symbol" );
-
-		return rules[std::move ( leftHandSide )].insert ( std::move ( rightHandSide ) ).second;
-	} else {
-		const std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > & rhs = rightHandSide.get < std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > ( );
-
-		if ( !getNonterminalAlphabet ( ).count ( rhs.second ) )
-			throw GrammarException ( "Symbol " + std::to_string ( rhs.second ) + " is not a nonterminal symbol" );
-
-		for ( const auto & symbol : rhs.first )
-			if ( !getTerminalAlphabet ( ).count ( symbol ) )
-				throw GrammarException ( "Symbol " + std::to_string ( symbol ) + " is not a terminal symbol" );
-
-		return rules[std::move ( leftHandSide )].insert ( std::move ( rightHandSide ) ).second;
-	}
-}
-
-bool RightLG::addRule ( alphabet::Symbol leftHandSide, std::vector < alphabet::Symbol > rightHandSide ) {
-	std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > rhs ( std::move ( rightHandSide ) );
-
-	return addRule ( std::move ( leftHandSide ), std::move ( rhs ) );
-}
-
-bool RightLG::addRule ( alphabet::Symbol leftHandSide, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > rightHandSide ) {
-	std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > rhs ( std::move ( rightHandSide ) );
-
-	return addRule ( std::move ( leftHandSide ), std::move ( rhs ) );
-}
-
-const std::map < alphabet::Symbol, std::set < std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > > > & RightLG::getRules ( ) const {
-	return rules;
-}
-
-bool RightLG::removeRule ( const alphabet::Symbol & leftHandSide, const std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > & rightHandSide ) {
-	return rules[leftHandSide].erase ( rightHandSide );
-}
-
-bool RightLG::removeRule ( const alphabet::Symbol & leftHandSide, const std::vector < alphabet::Symbol > & rightHandSide ) {
-	std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > rhs ( rightHandSide );
-
-	return removeRule ( leftHandSide, rhs );
-}
-
-bool RightLG::removeRule ( const alphabet::Symbol & leftHandSide, const std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > & rightHandSide ) {
-	std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > rhs ( rightHandSide );
-
-	return removeRule ( leftHandSide, rhs );
-}
-
-bool RightLG::addRawRule ( alphabet::Symbol leftHandSide, std::vector < alphabet::Symbol > rightHandSide ) {
-	if ( rightHandSide.size ( ) == 0 )
-		return addRule ( std::move ( leftHandSide ), std::move ( rightHandSide ) );
-	else if ( getNonterminalAlphabet ( ).count ( rightHandSide[rightHandSide.size ( ) - 1] ) )
-		return addRule ( std::move ( leftHandSide ), std::make_pair ( std::vector < alphabet::Symbol > ( std::make_move_iterator ( rightHandSide.begin ( ) ), std::make_move_iterator ( rightHandSide.end ( ) ) - 1 ), std::move ( rightHandSide[rightHandSide.size ( ) - 1] ) ) );
-	else
-		return addRule ( std::move ( leftHandSide ), std::move ( rightHandSide ) );
-}
-
-std::map < alphabet::Symbol, std::set < std::vector < alphabet::Symbol > > > RightLG::getRawRules ( ) const {
-	std::map < alphabet::Symbol, std::set < std::vector < alphabet::Symbol > > > res;
-
-	for ( const auto & rule : getRules ( ) )
-		for ( const auto & rhs : rule.second ) {
-			if ( rhs.is < std::vector < alphabet::Symbol > > ( ) ) {
-				res[rule.first].insert ( rhs.get < std::vector < alphabet::Symbol > > ( ) );
-			} else {
-				const auto & rhsTuple = rhs.get < std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > ( );
-				std::vector < alphabet::Symbol > tmp { rhsTuple.first.begin ( ), rhsTuple.first.end ( ) };
-				tmp.push_back ( rhsTuple.second );
-				res[rule.first].insert ( std::move ( tmp ) );
-			}
-		}
-
-	return res;
-}
-
-bool RightLG::removeRawRule ( const alphabet::Symbol & leftHandSide, const std::vector < alphabet::Symbol > & rightHandSide ) {
-	if ( rightHandSide.size ( ) == 0 )
-		return removeRule ( leftHandSide, rightHandSide );
-	else if ( getNonterminalAlphabet ( ).count ( rightHandSide[rightHandSide.size ( ) - 1] ) )
-		return removeRule ( leftHandSide, std::make_pair ( std::vector < alphabet::Symbol > ( rightHandSide.begin ( ), rightHandSide.end ( ) - 1 ), rightHandSide[rightHandSide.size ( ) - 1] ) );
-	else
-		return removeRule ( leftHandSide, rightHandSide );
-}
-
-int RightLG::compare ( const RightLG & other ) const {
-	auto first = std::tie ( getTerminalAlphabet ( ), getNonterminalAlphabet ( ), getInitialSymbol ( ), rules );
-	auto second = std::tie ( other.getTerminalAlphabet ( ), other.getNonterminalAlphabet ( ), other.getInitialSymbol ( ), other.rules );
-
-	std::compare < decltype ( first ) > comp;
-
-	return comp ( first, second );
-}
-
-void RightLG::operator >>( std::ostream & out ) const {
-	out << "(LeftLG " << "nonterminalAlphabet = "
-	    << getNonterminalAlphabet ( ) << "terminalAlphabet = "
-	    << getTerminalAlphabet ( ) << "initialSymbol = "
-	    << getInitialSymbol ( ) << "rules = "
-	    << rules << ")";
-}
-
-RightLG::operator std::string ( ) const {
-	std::stringstream ss;
-	ss << * this;
-	return ss.str ( );
-}
-
-RightLG RightLG::parse ( std::deque < sax::Token >::iterator & input ) {
-	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, RightLG::getXmlTagName() );
-
-	std::set < alphabet::Symbol > nonterminalAlphabet = GrammarFromXMLParser::parseNonterminalAlphabet ( input );
-	std::set < alphabet::Symbol > terminalAlphabet = GrammarFromXMLParser::parseTerminalAlphabet ( input );
-	alphabet::Symbol initialSymbol = GrammarFromXMLParser::parseInitialSymbol ( input );
-
-	RightLG grammar ( std::move ( initialSymbol ) );
-
-	grammar.setNonterminalAlphabet ( std::move ( nonterminalAlphabet ) );
-	grammar.setTerminalAlphabet ( std::move ( terminalAlphabet ) );
-
-	GrammarFromXMLParser::parseRules ( input, grammar );
-
-	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, RightLG::getXmlTagName() );
-	return grammar;
-}
-
-void RightLG::parseRule ( std::deque < sax::Token >::iterator & input, RightLG & grammar ) {
-	alphabet::Symbol lhs = GrammarFromXMLParser::parseRuleSingleSymbolLHS ( input );
-	std::vector < alphabet::Symbol > rhs = GrammarFromXMLParser::parseRuleRHS ( input );
-
-	grammar.addRawRule ( std::move ( lhs ), std::move ( rhs ) );
-}
-
-void RightLG::compose ( std::deque < sax::Token > & out ) const {
-	out.emplace_back ( RightLG::getXmlTagName(), sax::Token::TokenType::START_ELEMENT );
-
-	GrammarToXMLComposer::composeNonterminalAlphabet ( out, this->getNonterminalAlphabet ( ) );
-	GrammarToXMLComposer::composeTerminalAlphabet ( out, this->getTerminalAlphabet ( ) );
-	GrammarToXMLComposer::composeInitialSymbol ( out, this->getInitialSymbol ( ) );
-	composeRules ( out );
-
-	out.emplace_back ( RightLG::getXmlTagName(), sax::Token::TokenType::END_ELEMENT );
-}
-
-void RightLG::composeRules ( std::deque < sax::Token > & out ) const {
-	out.emplace_back ( "rules", sax::Token::TokenType::START_ELEMENT );
-
-	for ( const auto & rule : this->getRules ( ) )
-
-		for ( const auto & rhs : rule.second ) {
-			out.emplace_back ( "rule", sax::Token::TokenType::START_ELEMENT );
-
-			GrammarToXMLComposer::composeRuleSingleSymbolLHS ( out, rule.first );
-			GrammarToXMLComposer::composeRuleRightLGRHS ( out, rhs );
-
-			out.emplace_back ( "rule", sax::Token::TokenType::END_ELEMENT );
-		}
-
-	out.emplace_back ( "rules", sax::Token::TokenType::END_ELEMENT );
-}
-
-} /* namespace grammar */
-
 namespace alib {
 
-auto RightLGParserRegister = xmlApi < grammar::Grammar >::ParserRegister < grammar::RightLG > ( );
-auto RightLGParserRegister2 = xmlApi < alib::Object >::ParserRegister < grammar::RightLG > ( );
+auto RightLGParserRegister = xmlApi < grammar::Grammar >::ParserRegister < grammar::RightLG < > > ( );
+auto RightLGParserRegister2 = xmlApi < alib::Object >::ParserRegister < grammar::RightLG < > > ( );
 
 } /* namespace alib */
diff --git a/alib2data/src/grammar/Regular/RightLG.h b/alib2data/src/grammar/Regular/RightLG.h
index 34d3881537..ae0f911e31 100644
--- a/alib2data/src/grammar/Regular/RightLG.h
+++ b/alib2data/src/grammar/Regular/RightLG.h
@@ -8,13 +8,20 @@
 #ifndef RIGHT_LG_H_
 #define RIGHT_LG_H_
 
-#include "../GrammarException.h"
-#include "../GrammarBase.h"
 #include <map>
 #include <vector>
 #include <variant>
+#include <algorithm>
+#include <sstream>
+
 #include <core/components.hpp>
-#include "../../alphabet/Symbol.h"
+#include <sax/FromXMLParserHelper.h>
+
+#include "../GrammarBase.h"
+#include "../GrammarFeatures.h"
+#include "../GrammarException.h"
+#include "../common/GrammarFromXMLParser.h"
+#include "../common/GrammarToXMLComposer.h"
 
 namespace grammar {
 
@@ -25,64 +32,65 @@ class TerminalAlphabet;
 class NonterminalAlphabet;
 class InitialSymbol;
 
-class RightLG : public GrammarBase, public std::Components < RightLG, alphabet::Symbol, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > {
-	std::map < alphabet::Symbol, std::set < std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > > > rules;
+template < class SymbolType >
+class RightLG : public GrammarBase, public std::Components < RightLG < SymbolType >, SymbolType, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > {
+	std::map < SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > rules;
 
 public:
-	explicit RightLG ( alphabet::Symbol initialSymbol );
+	explicit RightLG ( SymbolType initialSymbol );
 
-	explicit RightLG ( std::set < alphabet::Symbol > nonTerminalSymbols, std::set < alphabet::Symbol > terminalSymbols, alphabet::Symbol initialSymbol );
+	explicit RightLG ( std::set < SymbolType > nonTerminalSymbols, std::set < SymbolType > terminalSymbols, SymbolType initialSymbol );
 
 	virtual GrammarBase * clone ( ) const;
 
 	virtual GrammarBase * plunder ( ) &&;
 
-	bool addRule ( alphabet::Symbol leftHandSide, std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > rightHandSide );
-	bool addRule ( alphabet::Symbol leftHandSide, std::vector < alphabet::Symbol > rightHandSide );
-	bool addRule ( alphabet::Symbol leftHandSide, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > rightHandSide );
+	bool addRule ( SymbolType leftHandSide, std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rightHandSide );
+	bool addRule ( SymbolType leftHandSide, std::vector < SymbolType > rightHandSide );
+	bool addRule ( SymbolType leftHandSide, std::pair < std::vector < SymbolType >, SymbolType > rightHandSide );
 
-	const std::map < alphabet::Symbol, std::set < std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > > > & getRules ( ) const;
+	const std::map < SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > & getRules ( ) const;
 
-	bool removeRule ( const alphabet::Symbol & leftHandSide, const std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > & rightHandSide );
-	bool removeRule ( const alphabet::Symbol & leftHandSide, const std::vector < alphabet::Symbol > & rightHandSide );
-	bool removeRule ( const alphabet::Symbol & leftHandSide, const std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > & rightHandSide );
+	bool removeRule ( const SymbolType & leftHandSide, const std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > & rightHandSide );
+	bool removeRule ( const SymbolType & leftHandSide, const std::vector < SymbolType > & rightHandSide );
+	bool removeRule ( const SymbolType & leftHandSide, const std::pair < std::vector < SymbolType >, SymbolType > & rightHandSide );
 
-	bool addRawRule ( alphabet::Symbol leftHandSide, std::vector < alphabet::Symbol > rightHandSide );
+	bool addRawRule ( SymbolType leftHandSide, std::vector < SymbolType > rightHandSide );
 
-	std::map < alphabet::Symbol, std::set < std::vector < alphabet::Symbol > > > getRawRules ( ) const;
+	std::map < SymbolType, std::set < std::vector < SymbolType > > > getRawRules ( ) const;
 
-	bool removeRawRule ( const alphabet::Symbol & leftHandSide, const std::vector < alphabet::Symbol > & rightHandSide );
+	bool removeRawRule ( const SymbolType & leftHandSide, const std::vector < SymbolType > & rightHandSide );
 
-	const alphabet::Symbol & getInitialSymbol ( ) const {
-		return accessElement < InitialSymbol > ( ).get ( );
+	const SymbolType & getInitialSymbol ( ) const {
+		return this->template accessElement < InitialSymbol > ( ).get ( );
 	}
 
-	bool setInitialSymbol ( alphabet::Symbol symbol ) {
-		return accessElement < InitialSymbol > ( ).set ( std::move ( symbol ) );
+	bool setInitialSymbol ( SymbolType symbol ) {
+		return this->template accessElement < InitialSymbol > ( ).set ( std::move ( symbol ) );
 	}
 
-	const std::set < alphabet::Symbol > & getNonterminalAlphabet ( ) const {
-		return accessComponent < NonterminalAlphabet > ( ).get ( );
+	const std::set < SymbolType > & getNonterminalAlphabet ( ) const {
+		return this->template accessComponent < NonterminalAlphabet > ( ).get ( );
 	}
 
-	bool addNonterminalSymbol ( alphabet::Symbol symbol ) {
-		return accessComponent < NonterminalAlphabet > ( ).add ( std::move ( symbol ) );
+	bool addNonterminalSymbol ( SymbolType symbol ) {
+		return this->template accessComponent < NonterminalAlphabet > ( ).add ( std::move ( symbol ) );
 	}
 
-	void setNonterminalAlphabet ( std::set < alphabet::Symbol > symbols ) {
-		accessComponent < NonterminalAlphabet > ( ).set ( std::move ( symbols ) );
+	void setNonterminalAlphabet ( std::set < SymbolType > symbols ) {
+		this->template accessComponent < NonterminalAlphabet > ( ).set ( std::move ( symbols ) );
 	}
 
-	const std::set < alphabet::Symbol > & getTerminalAlphabet ( ) const {
-		return accessComponent < TerminalAlphabet > ( ).get ( );
+	const std::set < SymbolType > & getTerminalAlphabet ( ) const {
+		return this->template accessComponent < TerminalAlphabet > ( ).get ( );
 	}
 
-	bool addTerminalSymbol ( alphabet::Symbol symbol ) {
-		return accessComponent < TerminalAlphabet > ( ).add ( std::move ( symbol ) );
+	bool addTerminalSymbol ( SymbolType symbol ) {
+		return this->template accessComponent < TerminalAlphabet > ( ).add ( std::move ( symbol ) );
 	}
 
-	void setTerminalAlphabet ( std::set < alphabet::Symbol > symbols ) {
-		accessComponent < TerminalAlphabet > ( ).set ( std::move ( symbols ) );
+	void setTerminalAlphabet ( std::set < SymbolType > symbols ) {
+		this->template accessComponent < TerminalAlphabet > ( ).set ( std::move ( symbols ) );
 	}
 
 	virtual int compare ( const ObjectBase & other ) const {
@@ -110,23 +118,226 @@ public:
 	void composeRules ( std::deque < sax::Token > & out ) const;
 };
 
+template < class SymbolType >
+RightLG < SymbolType >::RightLG ( SymbolType initialSymbol ) : RightLG ( std::set < SymbolType > { initialSymbol }, std::set < SymbolType > ( ), initialSymbol ) {
+}
+
+template < class SymbolType >
+RightLG < SymbolType >::RightLG ( std::set < SymbolType > nonterminalAlphabet, std::set < SymbolType > terminalAlphabet, SymbolType initialSymbol ) : std::Components < RightLG, SymbolType, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > ( std::make_tuple ( std::move ( terminalAlphabet ), std::move ( nonterminalAlphabet ) ), std::make_tuple ( std::move ( initialSymbol ) ) ) {
+}
+
+template < class SymbolType >
+GrammarBase * RightLG < SymbolType >::clone ( ) const {
+	return new RightLG ( * this );
+}
+
+template < class SymbolType >
+GrammarBase * RightLG < SymbolType >::plunder ( ) && {
+	return new RightLG ( std::move ( * this ) );
+}
+
+template < class SymbolType >
+bool RightLG < SymbolType >::addRule ( SymbolType leftHandSide, std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rightHandSide ) {
+	if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) )
+		throw GrammarException ( "Rule must rewrite nonterminal symbol" );
+
+	if ( rightHandSide.template is < std::vector < SymbolType > > ( ) ) {
+		for ( const auto & symbol : rightHandSide.template get < std::vector < SymbolType > > ( ) )
+			if ( !getTerminalAlphabet ( ).count ( symbol ) )
+				throw GrammarException ( "Symbol " + std::to_string ( symbol ) + " is not a terminal symbol" );
+
+		return rules[std::move ( leftHandSide )].insert ( std::move ( rightHandSide ) ).second;
+	} else {
+		const std::pair < std::vector < SymbolType >, SymbolType > & rhs = rightHandSide.template get < std::pair < std::vector < SymbolType >, SymbolType > > ( );
+
+		if ( !getNonterminalAlphabet ( ).count ( rhs.second ) )
+			throw GrammarException ( "Symbol " + std::to_string ( rhs.second ) + " is not a nonterminal symbol" );
+
+		for ( const auto & symbol : rhs.first )
+			if ( !getTerminalAlphabet ( ).count ( symbol ) )
+				throw GrammarException ( "Symbol " + std::to_string ( symbol ) + " is not a terminal symbol" );
+
+		return rules[std::move ( leftHandSide )].insert ( std::move ( rightHandSide ) ).second;
+	}
+}
+
+template < class SymbolType >
+bool RightLG < SymbolType >::addRule ( SymbolType leftHandSide, std::vector < SymbolType > rightHandSide ) {
+	std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rhs ( std::move ( rightHandSide ) );
+
+	return addRule ( std::move ( leftHandSide ), std::move ( rhs ) );
+}
+
+template < class SymbolType >
+bool RightLG < SymbolType >::addRule ( SymbolType leftHandSide, std::pair < std::vector < SymbolType >, SymbolType > rightHandSide ) {
+	std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rhs ( std::move ( rightHandSide ) );
+
+	return addRule ( std::move ( leftHandSide ), std::move ( rhs ) );
+}
+
+template < class SymbolType >
+const std::map < SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > & RightLG < SymbolType >::getRules ( ) const {
+	return rules;
+}
+
+template < class SymbolType >
+bool RightLG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > & rightHandSide ) {
+	return rules[leftHandSide].erase ( rightHandSide );
+}
+
+template < class SymbolType >
+bool RightLG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::vector < SymbolType > & rightHandSide ) {
+	std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rhs ( rightHandSide );
+
+	return removeRule ( leftHandSide, rhs );
+}
+
+template < class SymbolType >
+bool RightLG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::pair < std::vector < SymbolType >, SymbolType > & rightHandSide ) {
+	std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rhs ( rightHandSide );
+
+	return removeRule ( leftHandSide, rhs );
+}
+
+template < class SymbolType >
+bool RightLG < SymbolType >::addRawRule ( SymbolType leftHandSide, std::vector < SymbolType > rightHandSide ) {
+	if ( rightHandSide.size ( ) == 0 )
+		return addRule ( std::move ( leftHandSide ), std::move ( rightHandSide ) );
+	else if ( getNonterminalAlphabet ( ).count ( rightHandSide[rightHandSide.size ( ) - 1] ) )
+		return addRule ( std::move ( leftHandSide ), std::make_pair ( std::vector < SymbolType > ( std::make_move_iterator ( rightHandSide.begin ( ) ), std::make_move_iterator ( rightHandSide.end ( ) ) - 1 ), std::move ( rightHandSide[rightHandSide.size ( ) - 1] ) ) );
+	else
+		return addRule ( std::move ( leftHandSide ), std::move ( rightHandSide ) );
+}
+
+template < class SymbolType >
+std::map < SymbolType, std::set < std::vector < SymbolType > > > RightLG < SymbolType >::getRawRules ( ) const {
+	std::map < SymbolType, std::set < std::vector < SymbolType > > > res;
+
+	for ( const auto & rule : getRules ( ) )
+		for ( const auto & rhs : rule.second ) {
+			if ( rhs.template is < std::vector < SymbolType > > ( ) ) {
+				res[rule.first].insert ( rhs.template get < std::vector < SymbolType > > ( ) );
+			} else {
+				const auto & rhsTuple = rhs.template get < std::pair < std::vector < SymbolType >, SymbolType > > ( );
+				std::vector < SymbolType > tmp { rhsTuple.first.begin ( ), rhsTuple.first.end ( ) };
+				tmp.push_back ( rhsTuple.second );
+				res[rule.first].insert ( std::move ( tmp ) );
+			}
+		}
+
+	return res;
+}
+
+template < class SymbolType >
+bool RightLG < SymbolType >::removeRawRule ( const SymbolType & leftHandSide, const std::vector < SymbolType > & rightHandSide ) {
+	if ( rightHandSide.size ( ) == 0 )
+		return removeRule ( leftHandSide, rightHandSide );
+	else if ( getNonterminalAlphabet ( ).count ( rightHandSide[rightHandSide.size ( ) - 1] ) )
+		return removeRule ( leftHandSide, std::make_pair ( std::vector < SymbolType > ( rightHandSide.begin ( ), rightHandSide.end ( ) - 1 ), rightHandSide[rightHandSide.size ( ) - 1] ) );
+	else
+		return removeRule ( leftHandSide, rightHandSide );
+}
+
+template < class SymbolType >
+int RightLG < SymbolType >::compare ( const RightLG & other ) const {
+	auto first = std::tie ( getTerminalAlphabet ( ), getNonterminalAlphabet ( ), getInitialSymbol ( ), rules );
+	auto second = std::tie ( other.getTerminalAlphabet ( ), other.getNonterminalAlphabet ( ), other.getInitialSymbol ( ), other.rules );
+
+	std::compare < decltype ( first ) > comp;
+
+	return comp ( first, second );
+}
+
+template < class SymbolType >
+void RightLG < SymbolType >::operator >>( std::ostream & out ) const {
+	out << "(LeftLG " << "nonterminalAlphabet = "
+	    << getNonterminalAlphabet ( ) << "terminalAlphabet = "
+	    << getTerminalAlphabet ( ) << "initialSymbol = "
+	    << getInitialSymbol ( ) << "rules = "
+	    << rules << ")";
+}
+
+template < class SymbolType >
+RightLG < SymbolType >::operator std::string ( ) const {
+	std::stringstream ss;
+	ss << * this;
+	return ss.str ( );
+}
+
+template < class SymbolType >
+RightLG < SymbolType > RightLG < SymbolType >::parse ( std::deque < sax::Token >::iterator & input ) {
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, RightLG::getXmlTagName() );
+
+	std::set < SymbolType > nonterminalAlphabet = GrammarFromXMLParser::parseNonterminalAlphabet ( input );
+	std::set < SymbolType > terminalAlphabet = GrammarFromXMLParser::parseTerminalAlphabet ( input );
+	SymbolType initialSymbol = GrammarFromXMLParser::parseInitialSymbol ( input );
+
+	RightLG < SymbolType > grammar ( std::move ( initialSymbol ) );
+
+	grammar.setNonterminalAlphabet ( std::move ( nonterminalAlphabet ) );
+	grammar.setTerminalAlphabet ( std::move ( terminalAlphabet ) );
+
+	GrammarFromXMLParser::parseRules ( input, grammar );
+
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, RightLG::getXmlTagName() );
+	return grammar;
+}
+
+template < class SymbolType >
+void RightLG < SymbolType >::parseRule ( std::deque < sax::Token >::iterator & input, RightLG & grammar ) {
+	SymbolType lhs = GrammarFromXMLParser::parseRuleSingleSymbolLHS ( input );
+	std::vector < SymbolType > rhs = GrammarFromXMLParser::parseRuleRHS ( input );
+
+	grammar.addRawRule ( std::move ( lhs ), std::move ( rhs ) );
+}
+
+template < class SymbolType >
+void RightLG < SymbolType >::compose ( std::deque < sax::Token > & out ) const {
+	out.emplace_back ( RightLG::getXmlTagName(), sax::Token::TokenType::START_ELEMENT );
+
+	GrammarToXMLComposer::composeNonterminalAlphabet ( out, this->getNonterminalAlphabet ( ) );
+	GrammarToXMLComposer::composeTerminalAlphabet ( out, this->getTerminalAlphabet ( ) );
+	GrammarToXMLComposer::composeInitialSymbol ( out, this->getInitialSymbol ( ) );
+	composeRules ( out );
+
+	out.emplace_back ( RightLG::getXmlTagName(), sax::Token::TokenType::END_ELEMENT );
+}
+
+template < class SymbolType >
+void RightLG < SymbolType >::composeRules ( std::deque < sax::Token > & out ) const {
+	out.emplace_back ( "rules", sax::Token::TokenType::START_ELEMENT );
+
+	for ( const auto & rule : this->getRules ( ) )
+
+		for ( const auto & rhs : rule.second ) {
+			out.emplace_back ( "rule", sax::Token::TokenType::START_ELEMENT );
+
+			GrammarToXMLComposer::composeRuleSingleSymbolLHS ( out, rule.first );
+			GrammarToXMLComposer::composeRuleRightLGRHS ( out, rhs );
+
+			out.emplace_back ( "rule", sax::Token::TokenType::END_ELEMENT );
+		}
+
+	out.emplace_back ( "rules", sax::Token::TokenType::END_ELEMENT );
+}
+
 } /* namespace grammar */
 
 namespace std {
 
-template < >
-class ComponentConstraint< grammar::RightLG, alphabet::Symbol, grammar::TerminalAlphabet > {
+template < class SymbolType >
+class ComponentConstraint< grammar::RightLG < SymbolType >, SymbolType, grammar::TerminalAlphabet > {
 public:
-	static bool used ( const grammar::RightLG & grammar, const alphabet::Symbol & symbol ) {
-		for ( const std::pair < const alphabet::Symbol, std::set < std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > > > & rule : grammar.getRules ( ) ) {
-			for ( const std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > & rhsTmp : rule.second )
-				if ( rhsTmp.is < std::vector < alphabet::Symbol > > ( ) ) {
-					const std::vector < alphabet::Symbol > & rhs = rhsTmp.get < std::vector < alphabet::Symbol > > ( );
+	static bool used ( const grammar::RightLG < SymbolType > & grammar, const SymbolType & symbol ) {
+		for ( const std::pair < const SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > & rule : grammar.getRules ( ) ) {
+			for ( const std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > & rhsTmp : rule.second )
+				if ( rhsTmp.template is < std::vector < SymbolType > > ( ) ) {
+					const std::vector < SymbolType > & rhs = rhsTmp.template get < std::vector < SymbolType > > ( );
 
 					if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.end ( ) )
 						return true;
 				} else {
-					const std::vector < alphabet::Symbol > & rhs = rhsTmp.get < std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > ( ).first;
+					const std::vector < SymbolType > & rhs = rhsTmp.template get < std::pair < std::vector < SymbolType >, SymbolType > > ( ).first;
 
 					if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.end ( ) )
 						return true;
@@ -137,27 +348,27 @@ public:
 		return false;
 	}
 
-	static bool available ( const grammar::RightLG &, const alphabet::Symbol & ) {
+	static bool available ( const grammar::RightLG < SymbolType > &, const SymbolType & ) {
 		return true;
 	}
 
-	static void valid ( const grammar::RightLG & grammar, const alphabet::Symbol & symbol ) {
-		if ( grammar.accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ) )
+	static void valid ( const grammar::RightLG < SymbolType > & grammar, const SymbolType & symbol ) {
+		if ( grammar.template accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ) )
 			throw grammar::GrammarException ( "Symbol " + std::to_string ( symbol ) + "cannot be in terminal alphabet since it is already nonterminal alphabet" );
 	}
 };
 
-template < >
-class ComponentConstraint< grammar::RightLG, alphabet::Symbol, grammar::NonterminalAlphabet > {
+template < class SymbolType >
+class ComponentConstraint< grammar::RightLG < SymbolType >, SymbolType, grammar::NonterminalAlphabet > {
 public:
-	static bool used ( const grammar::RightLG & grammar, const alphabet::Symbol & symbol ) {
-		for ( const std::pair < const alphabet::Symbol, std::set < std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > > > & rule : grammar.getRules ( ) ) {
+	static bool used ( const grammar::RightLG < SymbolType > & grammar, const SymbolType & symbol ) {
+		for ( const std::pair < const SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > & rule : grammar.getRules ( ) ) {
 			if ( rule.first == symbol )
 				return true;
 
-			for ( const std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > & rhsTmp : rule.second )
-				if ( rhsTmp.is < std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > ( ) ) {
-					const std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > & rhs = rhsTmp.get < std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > ( );
+			for ( const std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > & rhsTmp : rule.second )
+				if ( rhsTmp.template is < std::pair < std::vector < SymbolType >, SymbolType > > ( ) ) {
+					const std::pair < std::vector < SymbolType >, SymbolType > & rhs = rhsTmp.template get < std::pair < std::vector < SymbolType >, SymbolType > > ( );
 
 					if ( rhs.second == symbol )
 						return true;
@@ -165,30 +376,30 @@ public:
 
 		}
 
-		if ( grammar.accessElement < grammar::InitialSymbol > ( ).get ( ) == symbol )
+		if ( grammar.template accessElement < grammar::InitialSymbol > ( ).get ( ) == symbol )
 			return true;
 
 		return false;
 	}
 
-	static bool available ( const grammar::RightLG &, const alphabet::Symbol & ) {
+	static bool available ( const grammar::RightLG < SymbolType > &, const SymbolType & ) {
 		return true;
 	}
 
-	static void valid ( const grammar::RightLG & grammar, const alphabet::Symbol & symbol ) {
-		if ( grammar.accessComponent < grammar::TerminalAlphabet > ( ).get ( ).count ( symbol ) )
+	static void valid ( const grammar::RightLG < SymbolType > & grammar, const SymbolType & symbol ) {
+		if ( grammar.template accessComponent < grammar::TerminalAlphabet > ( ).get ( ).count ( symbol ) )
 			throw grammar::GrammarException ( "Symbol " + std::to_string ( symbol ) + "cannot be in nonterminal alphabet since it is already in terminal alphabet" );
 	}
 };
 
-template < >
-class ElementConstraint< grammar::RightLG, alphabet::Symbol, grammar::InitialSymbol > {
+template < class SymbolType >
+class ElementConstraint< grammar::RightLG < SymbolType >, SymbolType, grammar::InitialSymbol > {
 public:
-	static bool available ( const grammar::RightLG & grammar, const alphabet::Symbol & symbol ) {
-		return grammar.accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol );
+	static bool available ( const grammar::RightLG < SymbolType > & grammar, const SymbolType & symbol ) {
+		return grammar.template accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol );
 	}
 
-	static void valid ( const grammar::RightLG &, const alphabet::Symbol & ) {
+	static void valid ( const grammar::RightLG < SymbolType > &, const SymbolType & ) {
 	}
 };
 
diff --git a/alib2data/test-src/grammar/GrammarTest.cpp b/alib2data/test-src/grammar/GrammarTest.cpp
index dc95098a0d..12c285b15c 100644
--- a/alib2data/test-src/grammar/GrammarTest.cpp
+++ b/alib2data/test-src/grammar/GrammarTest.cpp
@@ -120,7 +120,7 @@ void GrammarTest::testRegularParser() {
 	}
 
 	{
-		grammar::RightLG grammar(alphabet::symbolFrom(1));
+		grammar::RightLG < > grammar(alphabet::symbolFrom(1));
 
 		grammar.addNonterminalSymbol(alphabet::symbolFrom(1));
 		grammar.addNonterminalSymbol(alphabet::symbolFrom(2));
@@ -143,7 +143,7 @@ void GrammarTest::testRegularParser() {
 
 			std::deque<sax::Token> tokens2;
 			sax::SaxParseInterface::parseMemory(tmp, tokens2);
-			grammar::RightLG grammar2 = alib::XmlDataFactory::fromTokens<grammar::RightLG>(std::move(tokens2));
+			grammar::RightLG < > grammar2 = alib::XmlDataFactory::fromTokens<grammar::RightLG < > >(std::move(tokens2));
 
 			CPPUNIT_ASSERT( grammar == grammar2 );
 		}
diff --git a/alib2str/src/grammar/GrammarFromStringParser.cpp b/alib2str/src/grammar/GrammarFromStringParser.cpp
index 77cb64c733..6fb235751b 100644
--- a/alib2str/src/grammar/GrammarFromStringParser.cpp
+++ b/alib2str/src/grammar/GrammarFromStringParser.cpp
@@ -467,13 +467,13 @@ LeftRG < > GrammarFromStringParser::parseLeftRG(std::istream& input) const {
 	return parseCFLikeGrammar<LeftRG < > >(input);
 }
 
-RightLG GrammarFromStringParser::parseRightLG(std::istream& input) const {
+RightLG < > GrammarFromStringParser::parseRightLG(std::istream& input) const {
 	GrammarFromStringLexer::Token token = m_GrammarLexer.next(input);
 	if(token.type != GrammarFromStringLexer::TokenType::RIGHT_LG) {
 		throw exception::CommonException("Unrecognised RightLG token.");
 	}
 
-	return parseCFLikeGrammar<RightLG>(input);
+	return parseCFLikeGrammar<RightLG < > >(input);
 }
 
 LeftLG < > GrammarFromStringParser::parseLeftLG(std::istream& input) const {
diff --git a/alib2str/src/grammar/GrammarFromStringParser.h b/alib2str/src/grammar/GrammarFromStringParser.h
index 6538121e5d..082874173d 100644
--- a/alib2str/src/grammar/GrammarFromStringParser.h
+++ b/alib2str/src/grammar/GrammarFromStringParser.h
@@ -47,7 +47,7 @@ private:
 
 	RightRG parseRightRG(std::istream& input) const;
 	LeftRG < > parseLeftRG(std::istream& input) const;
-	RightLG parseRightLG(std::istream& input) const;
+	RightLG < > parseRightLG(std::istream& input) const;
 	LeftLG < > parseLeftLG(std::istream& input) const;
 
 	LG < > parseLG(std::istream& input) const;
diff --git a/alib2str/src/grammar/GrammarToStringComposer.cpp b/alib2str/src/grammar/GrammarToStringComposer.cpp
index c992eebb0e..b9c145f069 100644
--- a/alib2str/src/grammar/GrammarToStringComposer.cpp
+++ b/alib2str/src/grammar/GrammarToStringComposer.cpp
@@ -198,12 +198,12 @@ void GrammarToStringComposer::compose(std::ostream& output, const LeftRG < > & g
 
 GrammarToStringComposer::RegistratorWrapper<void, LeftRG < > > GrammarToStringComposerLeftRG = GrammarToStringComposer::RegistratorWrapper<void, LeftRG < > >(GrammarToStringComposer::compose);
 
-void GrammarToStringComposer::compose(std::ostream& output, const RightLG& grammar) {
+void GrammarToStringComposer::compose(std::ostream& output, const RightLG < > & grammar) {
 	output << "RIGHT_LG";
 	composeCFLikeGrammar(output, grammar);
 }
 
-GrammarToStringComposer::RegistratorWrapper<void, RightLG> GrammarToStringComposerRightLG = GrammarToStringComposer::RegistratorWrapper<void, RightLG>(GrammarToStringComposer::compose);
+GrammarToStringComposer::RegistratorWrapper<void, RightLG < > > GrammarToStringComposerRightLG = GrammarToStringComposer::RegistratorWrapper<void, RightLG < > >(GrammarToStringComposer::compose);
 
 void GrammarToStringComposer::compose(std::ostream& output, const RightRG& grammar) {
 	output << "RIGHT_RG";
diff --git a/alib2str/src/grammar/GrammarToStringComposer.h b/alib2str/src/grammar/GrammarToStringComposer.h
index d8d54e5c20..cb9887a9f7 100644
--- a/alib2str/src/grammar/GrammarToStringComposer.h
+++ b/alib2str/src/grammar/GrammarToStringComposer.h
@@ -26,7 +26,7 @@ public:
 
 	static void compose(std::ostream& output, const LeftLG < > & grammar);
 	static void compose(std::ostream& output, const LeftRG < > & grammar);
-	static void compose(std::ostream& output, const RightLG& grammar);
+	static void compose(std::ostream& output, const RightLG < > & grammar);
 	static void compose(std::ostream& output, const RightRG& grammar);
 	static void compose(std::ostream& output, const LG < > & grammar);
 	static void compose(std::ostream& output, const CFG < > & grammar);
-- 
GitLab