From d2e01be5c6b193013922de3f15a4d4f305ef6631 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Wed, 19 Sep 2018 08:52:02 +0200
Subject: [PATCH] working template redesign for regular and context free
 grammars

---
 alib2algo/src/grammar/convert/ToAutomaton.cpp |  10 +-
 .../src/grammar/generate/GenerateUpToLength.h |   2 +-
 .../grammar/generate/RandomGrammarFactory.cpp |   6 +-
 .../src/grammar/generate/RandomizeGrammar.h   |  20 +-
 .../src/grammar/simplify/EpsilonRemover.h     |  28 +-
 .../grammar/simplify/LeftRecursionRemover.h   |  66 ++---
 alib2algo/src/grammar/simplify/ToCNF.cpp      |  58 ++--
 alib2algo/src/grammar/simplify/ToCNF.h        |  12 +-
 alib2algo/src/grammar/simplify/ToGNF.cpp      |  12 +-
 alib2algo/src/grammar/simplify/ToGNF.h        | 101 +++----
 .../grammar/convert/GrammarCFGtoPDATest.cpp   |  24 +-
 .../properties/GrammarPropertiesTest.cpp      |  12 +-
 .../grammar/simplify/GrammarToCNFTest.cpp     |  18 +-
 .../grammar/simplify/GrammarToGNFTest.cpp     |  88 +++---
 .../grammar/parsing/AbsorbTerminalSymbol.cpp  |  14 +-
 .../grammar/parsing/CornerSubstitution.cpp    |   4 +-
 .../grammar/parsing/ExtractRightContext.cpp   |   6 +-
 .../parsing/HandleFirstFollowConflict.cpp     |  10 +-
 .../src/grammar/parsing/LR0Parser.cpp         |  50 ++--
 .../src/grammar/parsing/LR0Parser.h           |   4 +-
 .../src/grammar/parsing/LRParser.cpp          |   8 +-
 .../src/grammar/parsing/LRParser.h            |   2 +-
 .../src/grammar/parsing/LeftFactorize.cpp     |   8 +-
 .../src/grammar/parsing/SLR1ParseTable.cpp    |  29 +-
 .../src/grammar/parsing/common/Substitute.cpp |   6 +-
 .../src/grammar/parsing/common/Substitute.h   |   2 +-
 .../grammar/parsing/CornerSubstitution.cpp    |  54 ++--
 .../grammar/parsing/ExtractRightContext.cpp   |  46 ++--
 .../test-src/grammar/parsing/FirstTest.cpp    | 250 ++++++++----------
 .../test-src/grammar/parsing/FollowTest.cpp   |  40 +--
 .../parsing/HandleFirstFirstConflict.cpp      |  88 +++---
 .../parsing/HandleFirstFollowConflict.cpp     |  88 +++---
 .../grammar/parsing/LL1ParseTable.cpp         |  81 +++---
 .../test-src/grammar/parsing/LR0Parser.cpp    |  59 ++---
 .../test-src/grammar/parsing/LRParser.cpp     |  10 +-
 .../grammar/parsing/LeftFactorize.cpp         |  72 ++---
 .../grammar/parsing/SLR1ParseTable.cpp        | 122 ++++-----
 alib2data/src/PrimitiveRegistrator.cpp        |   1 +
 .../src/alphabet/common/SymbolNormalize.h     |  23 ++
 alib2data/src/grammar/AddRawRule.h            |  44 ++-
 alib2data/src/grammar/ContextFree/CFG.h       | 174 ++++++------
 alib2data/src/grammar/ContextFree/CNF.h       | 212 +++++++--------
 .../src/grammar/ContextFree/EpsilonFreeCFG.h  | 170 ++++++------
 alib2data/src/grammar/ContextFree/GNF.h       | 166 ++++++------
 alib2data/src/grammar/RawRules.h              |  64 ++---
 alib2data/src/grammar/Regular/LeftLG.h        |  50 ++--
 alib2data/src/grammar/xml/ContextFree/CFG.h   |  42 +--
 alib2data/src/grammar/xml/ContextFree/CNF.h   |  46 ++--
 .../grammar/xml/ContextFree/EpsilonFreeCFG.h  |  42 +--
 alib2data/src/grammar/xml/ContextFree/GNF.h   |  46 ++--
 .../grammar/xml/common/GrammarFromXMLParser.h |  30 ---
 .../grammar/xml/common/GrammarToXMLComposer.h |  12 +-
 alib2data/test-src/grammar/GrammarTest.cpp    | 153 +++++++----
 .../src/grammar/parsing/LRParserTypes.h       |   6 +-
 .../src/label/xml/LR0ItemsLabel.cpp           |   1 +
 alib2str/src/grammar/string/ContextFree/GNF.h |  22 +-
 56 files changed, 1405 insertions(+), 1409 deletions(-)

diff --git a/alib2algo/src/grammar/convert/ToAutomaton.cpp b/alib2algo/src/grammar/convert/ToAutomaton.cpp
index e76d5f55e4..84a1a70abe 100644
--- a/alib2algo/src/grammar/convert/ToAutomaton.cpp
+++ b/alib2algo/src/grammar/convert/ToAutomaton.cpp
@@ -109,9 +109,13 @@ automaton::NPDA < > ToAutomaton::convert(const T& grammar) {
 	for(const DefaultSymbolType& symbol : grammar.getTerminalAlphabet())
 		automaton.addPushdownStoreSymbol(symbol);
 
-	for(const std::pair<const DefaultSymbolType, ext::set<ext::vector<DefaultSymbolType>>>& kv : grammar.getRules())
-		for(const ext::vector<DefaultSymbolType>& rhs : kv.second)
-			automaton.addTransition(automaton.getInitialState(), ext::vector<DefaultSymbolType>{kv.first}, automaton.getInitialState(), rhs);
+	for(const std::pair<const DefaultSymbolType, ext::set<ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>>>& kv : grammar.getRules())
+		for(const ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>& rhs : kv.second) {
+			ext::vector < DefaultSymbolType > tmp;
+			for ( const ext::variant < DefaultSymbolType, DefaultSymbolType > & symbol : rhs )
+				tmp.push_back ( symbol.get < DefaultSymbolType > ( ) );
+			automaton.addTransition(automaton.getInitialState(), ext::vector<DefaultSymbolType>{kv.first}, automaton.getInitialState(), tmp);
+		}
 
 	for(const DefaultSymbolType& symbol : grammar.getTerminalAlphabet())
 		automaton.addTransition(automaton.getInitialState(), symbol, ext::vector<DefaultSymbolType>{symbol}, automaton.getInitialState(), ext::vector<DefaultSymbolType>{});
diff --git a/alib2algo/src/grammar/generate/GenerateUpToLength.h b/alib2algo/src/grammar/generate/GenerateUpToLength.h
index 45e0487520..5007490124 100644
--- a/alib2algo/src/grammar/generate/GenerateUpToLength.h
+++ b/alib2algo/src/grammar/generate/GenerateUpToLength.h
@@ -66,7 +66,7 @@ ext::set < string::LinearString < TerminalSymbolType > > GenerateUpToLength::gen
 			ext::vector < TerminalSymbolType > newString ( item.first );
 			newStack.insert ( newStack.end ( ), rhs.rbegin ( ), rhs.rend ( ) );
 
-			while ( ! newStack.empty ( ) && grammar.getTerminalAlphabet ( ).count ( newStack.back ( ).template get < TerminalSymbolType > ( ) ) ) {
+			while ( ! newStack.empty ( ) && grammar.getTerminalAlphabet ( ).count ( newStack.back ( ) ) ) {
 				newString.push_back ( std::move ( newStack.back ( ).template get < TerminalSymbolType > ( ) ) );
 				newStack.pop_back ( );
 			}
diff --git a/alib2algo/src/grammar/generate/RandomGrammarFactory.cpp b/alib2algo/src/grammar/generate/RandomGrammarFactory.cpp
index 7c4a26ae6f..f612148ac4 100644
--- a/alib2algo/src/grammar/generate/RandomGrammarFactory.cpp
+++ b/alib2algo/src/grammar/generate/RandomGrammarFactory.cpp
@@ -65,14 +65,14 @@ grammar::CFG < > RandomGrammarFactory::randomCFG( const ext::deque<DefaultSymbol
 		const DefaultSymbolType& lhs = nonterminals[ext::random_devices::semirandom() % nonterminals.size()];
 
 		int rhsSize = ext::random_devices::semirandom() % 5;
-		ext::vector<DefaultSymbolType> rhs;
+		ext::vector<ext::variant<DefaultSymbolType, DefaultSymbolType>> rhs;
 		int nonterminalsOnRHS = 0;
 		for(int i = 0; i < rhsSize; i++) {
 			if(ext::random_devices::semirandom() % (nonterminals.size() + terminals.size()) < nonterminals.size()) {
-				rhs.push_back(nonterminals[ext::random_devices::semirandom() % nonterminals.size()]);
+				rhs.push_back(ext::variant < DefaultSymbolType, DefaultSymbolType > ( nonterminals[ext::random_devices::semirandom() % nonterminals.size()]));
 				nonterminalsOnRHS++;
 			} else {
-				rhs.push_back(terminals[ext::random_devices::semirandom() % terminals.size()]);
+				rhs.push_back(ext::variant < DefaultSymbolType, DefaultSymbolType > ( terminals[ext::random_devices::semirandom() % terminals.size()]));
 			}
 		}
 		rules += nonterminalsOnRHS;
diff --git a/alib2algo/src/grammar/generate/RandomizeGrammar.h b/alib2algo/src/grammar/generate/RandomizeGrammar.h
index 464f65dda9..0fadf8bae5 100644
--- a/alib2algo/src/grammar/generate/RandomizeGrammar.h
+++ b/alib2algo/src/grammar/generate/RandomizeGrammar.h
@@ -30,8 +30,8 @@ public:
 	static grammar::RightRG < SymbolType > randomize ( const grammar::RightRG < SymbolType > & gram );
 	template < class SymbolType >
 	static grammar::RightLG < SymbolType > randomize ( const grammar::RightLG < SymbolType > & gram );
-	template < class SymbolType >
-	static grammar::CFG < SymbolType > randomize ( const grammar::CFG < SymbolType > & gram );
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static grammar::CFG < TerminalSymbolType, NonterminalSymbolType > randomize ( const grammar::CFG < TerminalSymbolType, NonterminalSymbolType > & gram );
 
 };
 
@@ -111,20 +111,20 @@ grammar::RightLG < SymbolType > RandomizeGrammar::randomize ( const grammar::Rig
 	return res;
 }
 
-template < class SymbolType >
-grammar::CFG < SymbolType > RandomizeGrammar::randomize ( const grammar::CFG < SymbolType > & gram ) {
-	ext::map < SymbolType, SymbolType > symbolPermutationMap = common::Permutation::permutationMap ( gram.getNonterminalAlphabet ( ) );
+template < class TerminalSymbolType, class NonterminalSymbolType >
+grammar::CFG < TerminalSymbolType, NonterminalSymbolType > RandomizeGrammar::randomize ( const grammar::CFG < TerminalSymbolType, NonterminalSymbolType > & gram ) {
+	ext::map < NonterminalSymbolType, NonterminalSymbolType > symbolPermutationMap = common::Permutation::permutationMap ( gram.getNonterminalAlphabet ( ) );
 
-	grammar::CFG < SymbolType > res ( symbolPermutationMap.find ( gram.getInitialSymbol ( ) )->second );
+	grammar::CFG < TerminalSymbolType, NonterminalSymbolType > res ( symbolPermutationMap.find ( gram.getInitialSymbol ( ) )->second );
 
 	res.setNonterminalAlphabet ( gram.getNonterminalAlphabet ( ) );
 	res.setTerminalAlphabet ( gram.getTerminalAlphabet ( ) );
 
-	for ( const std::pair < SymbolType, ext::set < ext::vector < SymbolType > > > & rule : gram.getRules ( ) )
-		for ( const ext::vector < SymbolType > & rhs : rule.second )
-			res.addRule ( symbolPermutationMap.find ( rule.first )->second, ext::transform < SymbolType > ( rhs, [ & ] ( const SymbolType & elem ) {
+	for ( const std::pair < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > & rule : gram.getRules ( ) )
+		for ( const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rhs : rule.second )
+			res.addRule ( symbolPermutationMap.find ( rule.first )->second, ext::transform < ext::variant < TerminalSymbolType, NonterminalSymbolType > > ( rhs, [ & ] ( const ext::variant < TerminalSymbolType, NonterminalSymbolType > & elem ) {
 						if ( gram.getNonterminalAlphabet ( ).count ( elem ) )
-							return symbolPermutationMap.find ( elem )->second;
+							return ext::variant < TerminalSymbolType, NonterminalSymbolType > ( symbolPermutationMap.find ( elem )->second );
 						else
 							return elem;
 					} ) );
diff --git a/alib2algo/src/grammar/simplify/EpsilonRemover.h b/alib2algo/src/grammar/simplify/EpsilonRemover.h
index b91a62ed3e..11d020ef20 100644
--- a/alib2algo/src/grammar/simplify/EpsilonRemover.h
+++ b/alib2algo/src/grammar/simplify/EpsilonRemover.h
@@ -33,13 +33,13 @@ namespace simplify {
 
 class EpsilonRemover {
 	template < class TerminalSymbolType, class NonterminalSymbolType >
-	static void removeNullableNonterminals(grammar::EpsilonFreeCFG < TerminalSymbolType > & grammar, const ext::set < NonterminalSymbolType >& nullableNonterminals, const NonterminalSymbolType & lhs, const ext::vector<ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rhs, unsigned i, ext::vector < TerminalSymbolType > clear);
+	static void removeNullableNonterminals(grammar::EpsilonFreeCFG < TerminalSymbolType > & grammar, const ext::set < NonterminalSymbolType >& nullableNonterminals, const NonterminalSymbolType & lhs, const ext::vector<ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rhs, unsigned i, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > clear);
 
-	template<class T, class SymbolType = typename grammar::TerminalSymbolTypeOfGrammar < T > >
-	static grammar::EpsilonFreeCFG < SymbolType > removeInternal( const T & origGrammar );
+	template<class T, class TerminalSymbolType = typename grammar::TerminalSymbolTypeOfGrammar < T >, class NonterminalSymbolType = typename grammar::NonterminalSymbolTypeOfGrammar < T > >
+	static grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > removeInternal( const T & origGrammar );
 public:
-	template < class SymbolType >
-	static grammar::EpsilonFreeCFG < SymbolType > remove( const grammar::CFG < SymbolType > & grammar );
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > remove( const grammar::CFG < TerminalSymbolType, NonterminalSymbolType > & grammar );
 	template < class SymbolType >
 	static grammar::EpsilonFreeCFG < SymbolType > remove( const grammar::EpsilonFreeCFG < SymbolType > & grammar );
 	template < class SymbolType >
@@ -59,24 +59,24 @@ public:
 };
 
 template < class TerminalSymbolType, class NonterminalSymbolType >
-void EpsilonRemover::removeNullableNonterminals(grammar::EpsilonFreeCFG < TerminalSymbolType > & grammar, const ext::set < NonterminalSymbolType > & nullableNonterminals, const NonterminalSymbolType & lhs, const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rhs, unsigned i, ext::vector < TerminalSymbolType > clear) {
+void EpsilonRemover::removeNullableNonterminals(grammar::EpsilonFreeCFG < TerminalSymbolType > & grammar, const ext::set < NonterminalSymbolType > & nullableNonterminals, const NonterminalSymbolType & lhs, const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rhs, unsigned i, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > clear) {
 	if(rhs.size() == i) {
 		if(clear.size() == 0) return;
 		grammar.addRule(lhs, clear);
 	} else if(rhs[i].template is < NonterminalSymbolType > ( ) && nullableNonterminals.find ( rhs [ i ].template get < NonterminalSymbolType > ( ) ) != nullableNonterminals.end()) {
 		removeNullableNonterminals(grammar, nullableNonterminals, lhs, rhs, i+1, clear);
 
-		clear.push_back(rhs[i].template get < NonterminalSymbolType > ( ) );
+		clear.push_back ( rhs [ i ] );
 		removeNullableNonterminals(grammar, nullableNonterminals, lhs, rhs, i+1, clear);
 	} else {
-		clear.push_back(rhs[i].template get < TerminalSymbolType > ( ) );
+		clear.push_back ( rhs [ i ] );
 		removeNullableNonterminals(grammar, nullableNonterminals, lhs, rhs, i+1, clear);
 	}
 }
 
-template<class T, class SymbolType >
-grammar::EpsilonFreeCFG < SymbolType > EpsilonRemover::removeInternal( const T & origGrammar ) {
-	grammar::EpsilonFreeCFG < SymbolType > grammar(origGrammar.getInitialSymbol());
+template<class T, class TerminalSymbolType, class NonterminalSymbolType >
+grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > EpsilonRemover::removeInternal( const T & origGrammar ) {
+	grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > grammar(origGrammar.getInitialSymbol());
 
 	for( const auto & symbol : origGrammar.getNonterminalAlphabet() )
 		grammar.addNonterminalSymbol( symbol );
@@ -84,7 +84,7 @@ grammar::EpsilonFreeCFG < SymbolType > EpsilonRemover::removeInternal( const T &
 	for( const auto & symbol : origGrammar.getTerminalAlphabet() )
 		grammar.addTerminalSymbol( symbol );
 
-	ext::set<SymbolType> nullableNonterminals = grammar::properties::NullableNonterminals::getNullableNonterminals(origGrammar);
+	ext::set < NonterminalSymbolType > nullableNonterminals = grammar::properties::NullableNonterminals::getNullableNonterminals(origGrammar);
 
 	auto rawRules = grammar::RawRules::getRawRules ( origGrammar );
 
@@ -101,8 +101,8 @@ grammar::EpsilonFreeCFG < SymbolType > EpsilonRemover::removeInternal( const T &
 	return grammar;
 }
 
-template < class SymbolType >
-grammar::EpsilonFreeCFG < SymbolType > EpsilonRemover::remove(const grammar::CFG < SymbolType > & origGrammar) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > EpsilonRemover::remove(const grammar::CFG < TerminalSymbolType, NonterminalSymbolType > & origGrammar) {
 	return EpsilonRemover::removeInternal(origGrammar);
 }
 
diff --git a/alib2algo/src/grammar/simplify/LeftRecursionRemover.h b/alib2algo/src/grammar/simplify/LeftRecursionRemover.h
index a536828664..c3b4dff95a 100644
--- a/alib2algo/src/grammar/simplify/LeftRecursionRemover.h
+++ b/alib2algo/src/grammar/simplify/LeftRecursionRemover.h
@@ -31,14 +31,14 @@ namespace grammar {
 namespace simplify {
 
 class LeftRecursionRemover {
-	template < class SymbolType >
-	static grammar::EpsilonFreeCFG < SymbolType > directLeftRecursionRemoveAsOrder ( const grammar::EpsilonFreeCFG < SymbolType > & origGrammar );
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > directLeftRecursionRemoveAsOrder ( const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & origGrammar );
 
-	template < class SymbolType >
-	static grammar::EpsilonFreeCFG < SymbolType > assignAsOrder ( const grammar::EpsilonFreeCFG < SymbolType > & origGrammar, unsigned i, const ext::set< SymbolType >& origNonterminals );
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > assignAsOrder ( const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & origGrammar, unsigned i, const ext::set < NonterminalSymbolType > & origNonterminals );
 public:
-	template < class SymbolType >
-	static grammar::EpsilonFreeCFG < SymbolType > remove( const grammar::EpsilonFreeCFG < SymbolType > & grammar );
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > remove( const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & grammar );
 	template < class SymbolType >
 	static grammar::EpsilonFreeCFG < SymbolType > remove( const grammar::CNF < SymbolType > & grammar );
 	template < class SymbolType >
@@ -53,9 +53,9 @@ public:
 	static grammar::RightLG < SymbolType > remove( const grammar::LeftLG < SymbolType > & grammar );
 };
 
-template < class SymbolType >
-grammar::EpsilonFreeCFG < SymbolType > LeftRecursionRemover::directLeftRecursionRemoveAsOrder(const grammar::EpsilonFreeCFG < SymbolType > & origGrammar) {
-	grammar::EpsilonFreeCFG < SymbolType > res(origGrammar.getInitialSymbol());
+template < class TerminalSymbolType, class NonterminalSymbolType >
+grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > LeftRecursionRemover::directLeftRecursionRemoveAsOrder(const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & origGrammar) {
+	grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > res(origGrammar.getInitialSymbol());
 	res.setNonterminalAlphabet(origGrammar.getNonterminalAlphabet());
 	res.setTerminalAlphabet(origGrammar.getTerminalAlphabet());
 	res.setGeneratesEpsilon(origGrammar.getGeneratesEpsilon());
@@ -63,23 +63,23 @@ grammar::EpsilonFreeCFG < SymbolType > LeftRecursionRemover::directLeftRecursion
 	for(const auto& nonterminal : origGrammar.getNonterminalAlphabet()) {
 		if(origGrammar.getRules().find(nonterminal) == origGrammar.getRules().end()) continue;
 
-		if(std::any_of(origGrammar.getRules().find(nonterminal)->second.begin(), origGrammar.getRules().find(nonterminal)->second.end(), [&](const ext::vector<SymbolType>& singleRHS) {
+		if(std::any_of(origGrammar.getRules().find(nonterminal)->second.begin(), origGrammar.getRules().find(nonterminal)->second.end(), [&](const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & singleRHS ) {
 				return singleRHS[0] == nonterminal; // is there a direct left recursion?
-			} ) && std::all_of(origGrammar.getRules().find(nonterminal)->second.begin(), origGrammar.getRules().find(nonterminal)->second.end(), [&](const ext::vector<SymbolType>& singleRHS) {
+			} ) && std::all_of(origGrammar.getRules().find(nonterminal)->second.begin(), origGrammar.getRules().find(nonterminal)->second.end(), [&](const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & singleRHS) {
 				return origGrammar.getTerminalAlphabet().count(singleRHS[0]) || singleRHS[0] >= nonterminal; // only remove left recursion when all nonterminals are bigger than the left hand side
 			})) {
-			SymbolType primed = common::createUnique(nonterminal, res.getTerminalAlphabet(), res.getNonterminalAlphabet());
+			NonterminalSymbolType primed = common::createUnique(nonterminal, res.getTerminalAlphabet(), res.getNonterminalAlphabet());
 			res.addNonterminalSymbol(primed);
-			for(const ext::vector<SymbolType>& singleRHS : origGrammar.getRules().find(nonterminal)->second) { // do the removal
+			for(const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & singleRHS : origGrammar.getRules().find(nonterminal)->second) { // do the removal
 				if(singleRHS[0] == nonterminal) { // A -> A alpha
-					ext::vector<SymbolType> tmpRHS(singleRHS.begin() + 1, singleRHS.end());
+					ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > tmpRHS(singleRHS.begin() + 1, singleRHS.end());
 
 					res.addRule(primed, tmpRHS); // A' -> alpha
 
 					tmpRHS.push_back(primed);
 					res.addRule(primed, tmpRHS); // A' -> alpha A'
 				} else { // a -> beta
-					ext::vector<SymbolType> tmpRHS(singleRHS);
+					ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > tmpRHS(singleRHS);
 
 					res.addRule(nonterminal, tmpRHS); // A -> beta
 
@@ -88,7 +88,7 @@ grammar::EpsilonFreeCFG < SymbolType > LeftRecursionRemover::directLeftRecursion
 				}
 			}
 		} else {
-			for(const ext::vector<SymbolType>& singleRHS : origGrammar.getRules().find(nonterminal)->second) {
+			for(const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & singleRHS : origGrammar.getRules().find(nonterminal)->second) {
 				res.addRule(nonterminal, singleRHS);
 			}
 		}
@@ -96,17 +96,17 @@ grammar::EpsilonFreeCFG < SymbolType > LeftRecursionRemover::directLeftRecursion
 	return res;
 }
 
-template < class SymbolType >
-grammar::EpsilonFreeCFG < SymbolType > LeftRecursionRemover::assignAsOrder(const grammar::EpsilonFreeCFG < SymbolType > & origGrammar, unsigned i, const ext::set<SymbolType>& origNonterminals) {
-	grammar::EpsilonFreeCFG < SymbolType > res(origGrammar.getInitialSymbol());
+template < class TerminalSymbolType, class NonterminalSymbolType >
+grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > LeftRecursionRemover::assignAsOrder ( const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & origGrammar, unsigned i, const ext::set < NonterminalSymbolType > & origNonterminals) {
+	grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > res(origGrammar.getInitialSymbol());
 	res.setNonterminalAlphabet(origGrammar.getNonterminalAlphabet());
 	res.setTerminalAlphabet(origGrammar.getTerminalAlphabet());
 	res.setGeneratesEpsilon(origGrammar.getGeneratesEpsilon());
 
-	for(const SymbolType& lhs : origGrammar.getNonterminalAlphabet()) {
+	for(const NonterminalSymbolType& lhs : origGrammar.getNonterminalAlphabet()) {
 		if(i > 0) {
 			if(origGrammar.getRules().find(lhs) == origGrammar.getRules().end()) continue;
-			for(const ext::vector<SymbolType>& rule : origGrammar.getRules().find(lhs)->second) {
+			for ( const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rule : origGrammar.getRules().find(lhs)->second) {
 				res.addRule(lhs, rule);
 			}
 
@@ -115,20 +115,20 @@ grammar::EpsilonFreeCFG < SymbolType > LeftRecursionRemover::assignAsOrder(const
 		}
 		if(origGrammar.getRules().find(lhs) == origGrammar.getRules().end()) continue;
 		if(!origNonterminals.count(lhs)) { // do not subsitute in nonoriginal nonterminals
-			for(const ext::vector<SymbolType>& rule : origGrammar.getRules().find(lhs)->second) {
+			for ( const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rule : origGrammar.getRules().find(lhs)->second) {
 				res.addRule(lhs, rule);
 			}
 			continue;
 		}
 
-		const ext::set<ext::vector<SymbolType>>& rule = origGrammar.getRules().find(lhs)->second;
+		const ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > & rule = origGrammar.getRules().find(lhs)->second;
 
-		for(const ext::vector<SymbolType>& singleRHS : rule) {
+		for ( const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & singleRHS : rule ) {
 			if(res.getTerminalAlphabet().count(singleRHS[0])) { //do not substitute terminals
 				res.addRule(lhs, singleRHS);
 				continue;
 			}
-			const SymbolType& secondLHS = singleRHS[0];
+			const ext::variant < TerminalSymbolType, NonterminalSymbolType > & secondLHS = singleRHS[0];
 			if(secondLHS >= lhs) { // substitute only by 0th up to i-th nonterminals right hand sides
 				res.addRule(lhs, singleRHS);
 				continue;
@@ -138,8 +138,8 @@ grammar::EpsilonFreeCFG < SymbolType > LeftRecursionRemover::assignAsOrder(const
 				continue;
 			}
 
-			for(const ext::vector<SymbolType>& secondSingleRHS : origGrammar.getRules().find(secondLHS)->second) { // do the substitution
-				ext::vector<SymbolType> newRHS(secondSingleRHS);
+			for(const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & secondSingleRHS : origGrammar.getRules().find(secondLHS)->second) { // do the substitution
+				ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > newRHS ( secondSingleRHS );
 				newRHS.insert(newRHS.end(), singleRHS.begin() + 1, singleRHS.end());
 				res.addRule(lhs, newRHS);
 			}
@@ -148,15 +148,15 @@ grammar::EpsilonFreeCFG < SymbolType > LeftRecursionRemover::assignAsOrder(const
 	return res;
 }
 
-template < class SymbolType >
-grammar::EpsilonFreeCFG < SymbolType > LeftRecursionRemover::remove(const grammar::EpsilonFreeCFG < SymbolType > & origGrammar) {
-	grammar::EpsilonFreeCFG < SymbolType > step = origGrammar;
-	for(const SymbolType& nonterminal : step.getNonterminalAlphabet()) { // remove identities
-		step.removeRule(nonterminal, ext::vector<SymbolType>{nonterminal});
+template < class TerminalSymbolType, class NonterminalSymbolType >
+grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > LeftRecursionRemover::remove(const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & origGrammar) {
+	grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > step = origGrammar;
+	for(const NonterminalSymbolType& nonterminal : step.getNonterminalAlphabet()) { // remove identities
+		step.removeRule(nonterminal, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > >{nonterminal});
 	}
 	unsigned i = 0;
 	while(i < origGrammar.getNonterminalAlphabet().size()) {
-		grammar::EpsilonFreeCFG < SymbolType > nextStep = assignAsOrder(directLeftRecursionRemoveAsOrder(step), i, origGrammar.getNonterminalAlphabet());
+		grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > nextStep = assignAsOrder(directLeftRecursionRemoveAsOrder(step), i, origGrammar.getNonterminalAlphabet());
 
 		if(step == nextStep) break;
 		step = std::move(nextStep);
diff --git a/alib2algo/src/grammar/simplify/ToCNF.cpp b/alib2algo/src/grammar/simplify/ToCNF.cpp
index 903a644e95..a82015413e 100644
--- a/alib2algo/src/grammar/simplify/ToCNF.cpp
+++ b/alib2algo/src/grammar/simplify/ToCNF.cpp
@@ -21,14 +21,14 @@ namespace grammar {
 
 namespace simplify {
 
-void splitRule ( const DefaultSymbolType & lhs, ext::vector < DefaultSymbolType > rhs, grammar::CNF < DefaultSymbolType > & result ) { //After templating the CNF make rhs const reference
+void splitRule ( const DefaultSymbolType & lhs, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhs, grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > & result ) { //After templating the CNF make rhs const reference
 	switch ( rhs.size ( ) ) {
 	case 2: {
 			result.addRule ( lhs, ext::make_pair ( std::move ( rhs [ 0 ] ), std::move ( rhs [ 1 ] ) ) );
 			break;
 		}
 	case 3: {
-			ext::vector < DefaultSymbolType > right ( std::make_move_iterator ( std::next ( rhs.begin ( ) ) ), std::make_move_iterator ( rhs.end ( ) ) );
+			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > right ( std::make_move_iterator ( std::next ( rhs.begin ( ) ) ), std::make_move_iterator ( rhs.end ( ) ) );
 			DefaultSymbolType second = object::ObjectFactory::make ( right );
 			if ( result.addNonterminalSymbol ( second ) )
 				splitRule ( second, std::move ( right ), result );
@@ -37,7 +37,7 @@ void splitRule ( const DefaultSymbolType & lhs, ext::vector < DefaultSymbolType
 			break;
 		}
 	default: {
-			ext::vector < DefaultSymbolType > left;
+			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > left;
 			for ( unsigned i = 0; i < rhs.size ( ) / 2; ++ i )
 				left.push_back ( std::move ( rhs [ i ] ) );
 
@@ -45,7 +45,7 @@ void splitRule ( const DefaultSymbolType & lhs, ext::vector < DefaultSymbolType
 			if ( result.addNonterminalSymbol ( first ) )
 				splitRule ( first, std::move ( left ), result );
 
-			ext::vector < DefaultSymbolType > right;
+			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > right;
 			for ( unsigned i = rhs.size ( ) / 2; i < rhs.size ( ); ++ i )
 				right.push_back ( std::move ( rhs [ i ] ) );
 
@@ -59,10 +59,12 @@ void splitRule ( const DefaultSymbolType & lhs, ext::vector < DefaultSymbolType
 }
 
 template<class T>
-grammar::CNF < > convertInternal( const T & origGrammar ) {
-	grammar::CNF < > result ( origGrammar.getInitialSymbol ( ) );
+grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > convertInternal( const T & origGrammar ) {
+	grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > result ( origGrammar.getInitialSymbol ( ) );
+
+	for ( const DefaultSymbolType & nonterminal : origGrammar.getNonterminalAlphabet ( ) )
+		result.addNonterminalSymbol ( nonterminal );
 
-	result.setNonterminalAlphabet ( origGrammar.getNonterminalAlphabet ( ) );
 	result.setTerminalAlphabet ( origGrammar.getTerminalAlphabet ( ) );
 
 	ext::map < DefaultSymbolType, DefaultSymbolType > terminalToShadowNonterminal;
@@ -74,14 +76,14 @@ grammar::CNF < > convertInternal( const T & origGrammar ) {
 	}
 
 	for ( const auto & rules : origGrammar.getRules ( ) ) {
-		for ( const ext::vector < DefaultSymbolType > & rhs : rules.second ) {
+		for ( const ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > & rhs : rules.second ) {
 			if ( rhs.size ( ) == 1 ) {
-				result.addRule ( rules.first, rhs [ 0 ] );
+				result.addRule ( rules.first, rhs [ 0 ].get < DefaultSymbolType > ( ) );
 			} else {
-				ext::vector < DefaultSymbolType > rawRule;
-				for ( const DefaultSymbolType & symbol : rhs ) {
+				ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rawRule;
+				for ( const ext::variant < DefaultSymbolType, DefaultSymbolType > & symbol : rhs ) {
 					if ( origGrammar.getTerminalAlphabet ( ).count ( symbol ) )
-						rawRule.push_back ( terminalToShadowNonterminal.at ( symbol ) );
+						rawRule.push_back ( terminalToShadowNonterminal.at ( symbol.get < DefaultSymbolType > ( ) ) );
 					else
 						rawRule.push_back ( symbol );
 				}
@@ -96,18 +98,20 @@ grammar::CNF < > convertInternal( const T & origGrammar ) {
 	return result;
 }
 
-grammar::CNF < > ToCNF::convert(const grammar::CFG < > & origGrammar) {
+grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > ToCNF::convert(const grammar::CFG < > & origGrammar) {
 	return convert(grammar::simplify::EpsilonRemover::remove(origGrammar));
 }
 
-grammar::CNF < > ToCNF::convert(const grammar::EpsilonFreeCFG < > & origGrammar) {
+grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > ToCNF::convert(const grammar::EpsilonFreeCFG < > & origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(origGrammar));
 }
 
-grammar::CNF < > ToCNF::convert ( const grammar::GNF < > & origGrammar ) {
-	grammar::CNF < > result ( origGrammar.getInitialSymbol ( ) );
+grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > ToCNF::convert ( const grammar::GNF < > & origGrammar ) {
+	grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > result ( origGrammar.getInitialSymbol ( ) );
+
+	for ( const DefaultSymbolType & nonterminal : origGrammar.getNonterminalAlphabet ( ) )
+		result.addNonterminalSymbol ( nonterminal );
 
-	result.setNonterminalAlphabet ( origGrammar.getNonterminalAlphabet ( ) );
 	result.setTerminalAlphabet ( origGrammar.getTerminalAlphabet ( ) );
 
 	ext::map < DefaultSymbolType, DefaultSymbolType > terminalToShadowNonterminal;
@@ -123,7 +127,7 @@ grammar::CNF < > ToCNF::convert ( const grammar::GNF < > & origGrammar ) {
 			if ( rhs.second.size ( ) == 0 )
 				result.addRule ( rules.first, rhs.first );
 			else {
-				ext::vector < DefaultSymbolType > rawRule { terminalToShadowNonterminal.at ( rhs.first ) };
+				ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rawRule { terminalToShadowNonterminal.at ( rhs.first ) };
 				rawRule.insert ( rawRule.end ( ), rhs.second.begin ( ), rhs.second.end ( ) );
 				splitRule ( rules.first, std::move ( rawRule ), result );
 			}
@@ -135,26 +139,26 @@ grammar::CNF < > ToCNF::convert ( const grammar::GNF < > & origGrammar ) {
 	return result;
 }
 
-grammar::CNF < > ToCNF::convert(const grammar::LG < > & origGrammar) {
+grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > ToCNF::convert(const grammar::LG < > & origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar)));
 }
 
-grammar::CNF < > ToCNF::convert(const grammar::LeftLG< > & origGrammar) {
+grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > ToCNF::convert(const grammar::LeftLG< > & origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar)));
 }
 
-grammar::CNF < > ToCNF::convert(const grammar::RightLG < > & origGrammar) {
+grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > ToCNF::convert(const grammar::RightLG < > & origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar)));
 }
 
-auto ToCNFCFG = registration::AbstractRegister < ToCNF, grammar::CNF < >, const grammar::CFG < > & > ( ToCNF::convert );
-auto ToCNFEpsilonFreeCFG = registration::AbstractRegister < ToCNF, grammar::CNF < >, const grammar::EpsilonFreeCFG < > & > ( ToCNF::convert );
+auto ToCNFCFG = registration::AbstractRegister < ToCNF, grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > >, const grammar::CFG < > & > ( ToCNF::convert );
+auto ToCNFEpsilonFreeCFG = registration::AbstractRegister < ToCNF, grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > >, const grammar::EpsilonFreeCFG < > & > ( ToCNF::convert );
 auto ToCNFCNF = registration::AbstractRegister < ToCNF, grammar::CNF < >, const grammar::CNF < > & > ( ToCNF::convert );
-auto ToCNFGNF = registration::AbstractRegister < ToCNF, grammar::CNF < >, const grammar::GNF < > & > ( ToCNF::convert );
-auto ToCNFLG = registration::AbstractRegister < ToCNF, grammar::CNF < >, const grammar::LG < > & > ( ToCNF::convert );
-auto ToCNFLeftLG = registration::AbstractRegister < ToCNF, grammar::CNF < >, const grammar::LeftLG < > & > ( ToCNF::convert );
+auto ToCNFGNF = registration::AbstractRegister < ToCNF, grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > >, const grammar::GNF < > & > ( ToCNF::convert );
+auto ToCNFLG = registration::AbstractRegister < ToCNF, grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > >, const grammar::LG < > & > ( ToCNF::convert );
+auto ToCNFLeftLG = registration::AbstractRegister < ToCNF, grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > >, const grammar::LeftLG < > & > ( ToCNF::convert );
 auto ToCNFLeftRG = registration::AbstractRegister < ToCNF, grammar::CNF < >, const grammar::LeftRG < > & > ( ToCNF::convert );
-auto ToCNFRightLG = registration::AbstractRegister < ToCNF, grammar::CNF < >, const grammar::RightLG < > & > ( ToCNF::convert );
+auto ToCNFRightLG = registration::AbstractRegister < ToCNF, grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > >, const grammar::RightLG < > & > ( ToCNF::convert );
 auto ToCNFRightRG = registration::AbstractRegister < ToCNF, grammar::CNF < >, const grammar::RightRG < > & > ( ToCNF::convert );
 
 } /* namespace simplify */
diff --git a/alib2algo/src/grammar/simplify/ToCNF.h b/alib2algo/src/grammar/simplify/ToCNF.h
index 8b39636ea3..1b58eeba81 100644
--- a/alib2algo/src/grammar/simplify/ToCNF.h
+++ b/alib2algo/src/grammar/simplify/ToCNF.h
@@ -26,23 +26,23 @@ namespace simplify {
 
 class ToCNF {
 public:
-	static grammar::CNF < > convert( const grammar::CFG < > & grammar );
+	static grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > convert( const grammar::CFG < > & grammar );
 
-	static grammar::CNF < > convert( const grammar::EpsilonFreeCFG < > & grammar );
+	static grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > convert( const grammar::EpsilonFreeCFG < > & grammar );
 
-	static grammar::CNF < > convert( const grammar::GNF < > & grammar );
+	static grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > convert( const grammar::GNF < > & grammar );
 
 	template < class SymbolType >
 	static grammar::CNF < SymbolType > convert( const grammar::CNF < SymbolType > & grammar );
 
-	static grammar::CNF < > convert( const grammar::LG < > & grammar );
+	static grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > convert( const grammar::LG < > & grammar );
 
-	static grammar::CNF < > convert( const grammar::LeftLG < > & grammar );
+	static grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > convert( const grammar::LeftLG < > & grammar );
 
 	template < class SymbolType >
 	static grammar::CNF < SymbolType > convert( const grammar::LeftRG < SymbolType > & grammar );
 
-	static grammar::CNF < > convert( const grammar::RightLG < > & grammar );
+	static grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > convert( const grammar::RightLG < > & grammar );
 
 	template < class SymbolType >
 	static grammar::CNF < SymbolType > convert( const grammar::RightRG < SymbolType > & grammar );
diff --git a/alib2algo/src/grammar/simplify/ToGNF.cpp b/alib2algo/src/grammar/simplify/ToGNF.cpp
index 8352b12d07..412797732b 100644
--- a/alib2algo/src/grammar/simplify/ToGNF.cpp
+++ b/alib2algo/src/grammar/simplify/ToGNF.cpp
@@ -12,14 +12,14 @@ namespace grammar {
 
 namespace simplify {
 
-auto ToGNFCFG = registration::AbstractRegister < ToGNF, grammar::GNF < >, const grammar::CFG < > & > ( ToGNF::convert );
-auto ToGNFEpsilonFreeCFG = registration::AbstractRegister < ToGNF, grammar::GNF < >, const grammar::EpsilonFreeCFG < > & > ( ToGNF::convert );
-auto ToGNFCNF = registration::AbstractRegister < ToGNF, grammar::GNF < >, const grammar::CNF < > & > ( ToGNF::convert );
+auto ToGNFCFG = registration::AbstractRegister < ToGNF, grammar::GNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > >, const grammar::CFG < > & > ( ToGNF::convert );
+auto ToGNFEpsilonFreeCFG = registration::AbstractRegister < ToGNF, grammar::GNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > >, const grammar::EpsilonFreeCFG < > & > ( ToGNF::convert );
+auto ToGNFCNF = registration::AbstractRegister < ToGNF, grammar::GNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > >, const grammar::CNF < > & > ( ToGNF::convert );
 auto ToGNFGNF = registration::AbstractRegister < ToGNF, grammar::GNF < >, const grammar::GNF < > & > ( ToGNF::convert );
-auto ToGNFLG = registration::AbstractRegister < ToGNF, grammar::GNF < >, const grammar::LG < > & > ( ToGNF::convert );
-auto ToGNFLeftLG = registration::AbstractRegister < ToGNF, grammar::GNF < >, const grammar::LeftLG < > & > ( ToGNF::convert );
+auto ToGNFLG = registration::AbstractRegister < ToGNF, grammar::GNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > >, const grammar::LG < > & > ( ToGNF::convert );
+auto ToGNFLeftLG = registration::AbstractRegister < ToGNF, grammar::GNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > >, const grammar::LeftLG < > & > ( ToGNF::convert );
 auto ToGNFLeftRG = registration::AbstractRegister < ToGNF, grammar::RightRG < >, const grammar::LeftRG < > & > ( ToGNF::convert );
-auto ToGNFRightLG = registration::AbstractRegister < ToGNF, grammar::GNF < >, const grammar::RightLG < > & > ( ToGNF::convert );
+auto ToGNFRightLG = registration::AbstractRegister < ToGNF, grammar::GNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > >, const grammar::RightLG < > & > ( ToGNF::convert );
 auto ToGNFRightRG = registration::AbstractRegister < ToGNF, grammar::RightRG < >, const grammar::RightRG < > & > ( ToGNF::convert );
 
 } /* namespace simplify */
diff --git a/alib2algo/src/grammar/simplify/ToGNF.h b/alib2algo/src/grammar/simplify/ToGNF.h
index 830e879c06..c233a2d6de 100644
--- a/alib2algo/src/grammar/simplify/ToGNF.h
+++ b/alib2algo/src/grammar/simplify/ToGNF.h
@@ -32,53 +32,53 @@ namespace grammar {
 namespace simplify {
 
 class ToGNF {
-	template < class SymbolType >
-	static grammar::EpsilonFreeCFG < SymbolType > assignNonterminals(const grammar::EpsilonFreeCFG < SymbolType > & origGrammar);
-	template < class SymbolType >
-	static grammar::GNF < SymbolType > convertInternal( const grammar::EpsilonFreeCFG < SymbolType > & origGrammar );
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > assignNonterminals(const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & origGrammar);
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static grammar::GNF < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType > > convertInternal( const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & origGrammar );
 
 public:
-	template < class SymbolType >
-	static grammar::GNF < SymbolType > convert( const grammar::CFG < SymbolType > & grammar );
-	template < class SymbolType >
-	static grammar::GNF < SymbolType > convert( const grammar::EpsilonFreeCFG < SymbolType > & grammar );
-	template < class SymbolType >
-	static grammar::GNF < SymbolType > convert( const grammar::CNF < SymbolType > & grammar );
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static grammar::GNF < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType > > convert( const grammar::CFG < TerminalSymbolType, NonterminalSymbolType > & grammar );
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static grammar::GNF < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType > > convert ( const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & grammar );
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static grammar::GNF < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType > > convert( const grammar::CNF < TerminalSymbolType, NonterminalSymbolType > & grammar );
 	template < class SymbolType >
 	static grammar::GNF < SymbolType > convert( const grammar::GNF < SymbolType > & grammar );
-	template < class SymbolType >
-	static grammar::GNF < SymbolType > convert( const grammar::LG < SymbolType > & grammar );
-	template < class SymbolType >
-	static grammar::GNF < SymbolType > convert( const grammar::LeftLG < SymbolType > & grammar );
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static grammar::GNF < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType > > convert( const grammar::LG < TerminalSymbolType, NonterminalSymbolType > & grammar );
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static grammar::GNF < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType > > convert( const grammar::LeftLG < TerminalSymbolType, NonterminalSymbolType > & grammar );
 	template < class SymbolType >
 	static grammar::RightRG < SymbolType > convert( const grammar::LeftRG < SymbolType > & grammar );
-	template < class SymbolType >
-	static grammar::GNF < SymbolType > convert( const grammar::RightLG < SymbolType > & grammar );
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static grammar::GNF < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType > > convert( const grammar::RightLG < TerminalSymbolType, NonterminalSymbolType > & grammar );
 	template < class SymbolType >
 	static grammar::RightRG < SymbolType > convert( const grammar::RightRG < SymbolType > & grammar );
 };
 
-template < class SymbolType >
-grammar::EpsilonFreeCFG < SymbolType > ToGNF::assignNonterminals(const grammar::EpsilonFreeCFG < SymbolType > & origGrammar) {
-	grammar::EpsilonFreeCFG < SymbolType > res(origGrammar.getInitialSymbol());
+template < class TerminalSymbolType, class NonterminalSymbolType >
+grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > ToGNF::assignNonterminals(const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & origGrammar) {
+	grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > res(origGrammar.getInitialSymbol());
 	res.setNonterminalAlphabet(origGrammar.getNonterminalAlphabet());
 	res.setTerminalAlphabet(origGrammar.getTerminalAlphabet());
 	res.setGeneratesEpsilon(origGrammar.getGeneratesEpsilon());
 
-	for(const std::pair<const SymbolType, ext::set<ext::vector<SymbolType>>>& rule : origGrammar.getRules()) {
-		for(const ext::vector<SymbolType>& singleRHS : rule.second) {
+	for ( const std::pair < const NonterminalSymbolType, ext::set<ext::vector<ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > & rule : origGrammar.getRules ( ) ) {
+		for(const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & singleRHS : rule.second) {
 			if(res.getTerminalAlphabet().count(singleRHS[0])) { //do not substitute terminals
 				res.addRule(rule.first, singleRHS);
 				continue;
 			}
-			const SymbolType& secondLHS = singleRHS[0];
+			const ext::variant < TerminalSymbolType, NonterminalSymbolType > & secondLHS = singleRHS[0];
 			if(origGrammar.getRules().find(secondLHS) == origGrammar.getRules().end()) { //is there any right hand side to substitue with?
 				//if not well this rule does not generate anything anyway
 				continue;
 			}
 
-			for(const ext::vector<SymbolType>& secondSingleRHS : origGrammar.getRules().find(secondLHS)->second) { // do the substitution
-				ext::vector<SymbolType> newRHS(secondSingleRHS);
+			for(const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & secondSingleRHS : origGrammar.getRules().find(secondLHS)->second) { // do the substitution
+				ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > newRHS(secondSingleRHS);
 				newRHS.insert(newRHS.end(), singleRHS.begin() + 1, singleRHS.end());
 				res.addRule(rule.first, newRHS);
 			}
@@ -87,32 +87,33 @@ grammar::EpsilonFreeCFG < SymbolType > ToGNF::assignNonterminals(const grammar::
 	return res;
 }
 
-template < class SymbolType >
-grammar::GNF < SymbolType > ToGNF::convertInternal( const grammar::EpsilonFreeCFG < SymbolType > & origGrammar ) {
-	grammar::EpsilonFreeCFG < SymbolType > step(origGrammar);
+template < class TerminalSymbolType, class NonterminalSymbolType >
+grammar::GNF < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType > > ToGNF::convertInternal( const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & origGrammar ) {
+	grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > step(origGrammar);
 	while(true) {
-		grammar::EpsilonFreeCFG < SymbolType > nextStep = assignNonterminals(step);
+		grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > nextStep = assignNonterminals(step);
 
 		if(step == nextStep) break;
 		step = std::move(nextStep);
 	}
 
-	grammar::GNF < SymbolType > res(step.getInitialSymbol());
+	grammar::GNF < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType > > res(step.getInitialSymbol());
 	res.setTerminalAlphabet(step.getTerminalAlphabet());
-	res.setNonterminalAlphabet(step.getNonterminalAlphabet());
+	for ( const NonterminalSymbolType & nonterminal : step.getNonterminalAlphabet ( ) )
+		res.addNonterminalSymbol ( ext::variant < TerminalSymbolType, NonterminalSymbolType > ( nonterminal ) );
 	res.setGeneratesEpsilon(step.getGeneratesEpsilon());
-	ext::map<SymbolType, SymbolType> terminalToPrimed;
-	for(const SymbolType& terminal : step.getTerminalAlphabet()) {
-		SymbolType primed = common::createUnique(terminal, res.getTerminalAlphabet(), res.getNonterminalAlphabet());
+	ext::map < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType > > terminalToPrimed;
+	for ( const TerminalSymbolType & terminal : step.getTerminalAlphabet ( ) ) {
+		ext::variant < TerminalSymbolType, NonterminalSymbolType > primed = common::createUnique ( terminal, res.getTerminalAlphabet(), res.getNonterminalAlphabet());
 		terminalToPrimed.insert(std::make_pair(terminal, primed));
 		res.addNonterminalSymbol(primed);
-		res.addRule(primed, ext::make_pair(terminal, ext::vector<SymbolType> {}));
+		res.addRule(primed, ext::make_pair(terminal, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > { } ) );
 	}
 	for(const auto& rule : step.getRules()) {
 		for(const auto& rhs : rule.second) {
-			ext::vector<SymbolType> convertedNonterminals;
+			ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > convertedNonterminals;
 			bool first = true;
-			for(const SymbolType& rhsSymbol : rhs) {
+			for(const ext::variant < TerminalSymbolType, NonterminalSymbolType > & rhsSymbol : rhs) {
 				if(first) {
 					first = false;
 					continue;
@@ -123,24 +124,24 @@ grammar::GNF < SymbolType > ToGNF::convertInternal( const grammar::EpsilonFreeCF
 				else
 					convertedNonterminals.push_back(terminalToPrimed.find(rhsSymbol)->second);
 			}
-			res.addRule(rule.first, ext::make_pair(rhs[0], std::move(convertedNonterminals)));
+			res.addRule(rule.first, ext::make_pair(rhs[0].template get < TerminalSymbolType > ( ), std::move(convertedNonterminals)));
 		}
 	}
 	return res;
 }
 
-template < class SymbolType >
-grammar::GNF < SymbolType > ToGNF::convert(const grammar::CFG < SymbolType > & origGrammar) {
-	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::LeftRecursionRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar))));
+template < class TerminalSymbolType, class NonterminalSymbolType >
+grammar::GNF < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType > > ToGNF::convert ( const grammar::CFG < TerminalSymbolType, NonterminalSymbolType > & origGrammar) {
+	return convert(grammar::simplify::EpsilonRemover::remove(origGrammar));
 }
 
-template < class SymbolType >
-grammar::GNF < SymbolType > ToGNF::convert(const grammar::EpsilonFreeCFG < SymbolType > & origGrammar) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+grammar::GNF < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType > > ToGNF::convert(const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::LeftRecursionRemover::remove(origGrammar)));
 }
 
-template < class SymbolType >
-grammar::GNF < SymbolType > ToGNF::convert(const grammar::CNF < SymbolType > & origGrammar) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+grammar::GNF < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType > > ToGNF::convert(const grammar::CNF < TerminalSymbolType, NonterminalSymbolType > & origGrammar) {
 	return convertInternal(grammar::simplify::LeftRecursionRemover::remove(origGrammar));
 }
 
@@ -149,13 +150,13 @@ grammar::GNF < SymbolType > ToGNF::convert(const grammar::GNF < SymbolType > & o
 	return origGrammar;
 }
 
-template < class SymbolType >
-grammar::GNF < SymbolType > ToGNF::convert(const grammar::LG < SymbolType > & origGrammar) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+grammar::GNF < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType > > ToGNF::convert(const grammar::LG < TerminalSymbolType, NonterminalSymbolType > & origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::LeftRecursionRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar))));
 }
 
-template < class SymbolType >
-grammar::GNF < SymbolType > ToGNF::convert(const grammar::LeftLG < SymbolType > & origGrammar) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+grammar::GNF < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType > > ToGNF::convert(const grammar::LeftLG < TerminalSymbolType, NonterminalSymbolType > & origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::LeftRecursionRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar))));
 }
 
@@ -164,8 +165,8 @@ grammar::RightRG < SymbolType > ToGNF::convert(const grammar::LeftRG < SymbolTyp
 	return convert::ToGrammarRightRG::convert(origGrammar);
 }
 
-template < class SymbolType >
-grammar::GNF < SymbolType > ToGNF::convert(const grammar::RightLG < SymbolType > & origGrammar) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+grammar::GNF < TerminalSymbolType, ext::variant < TerminalSymbolType, NonterminalSymbolType > > ToGNF::convert(const grammar::RightLG < TerminalSymbolType, NonterminalSymbolType > & origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::LeftRecursionRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar))));
 }
 
diff --git a/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp b/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp
index 102175c865..f2aab8b5f5 100644
--- a/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp
+++ b/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp
@@ -36,12 +36,12 @@ void GrammarCFGtoPDATest::testTopDown()
 		grammar::CFG < > grammar(nE);
 		grammar.setTerminalAlphabet(ext::set<DefaultSymbolType>{tP, tS, tL, tR, tA});
 		grammar.setNonterminalAlphabet(ext::set<DefaultSymbolType>{nE, nT, nF});
-		grammar.addRule(nE, ext::vector<DefaultSymbolType>{nE, tP, nT});
-		grammar.addRule(nE, ext::vector<DefaultSymbolType>{nT});
-		grammar.addRule(nT, ext::vector<DefaultSymbolType>{nT, tS, nF});
-		grammar.addRule(nT, ext::vector<DefaultSymbolType>{nF});
-		grammar.addRule(nF, ext::vector<DefaultSymbolType>{tL, nE, tR});
-		grammar.addRule(nF, ext::vector<DefaultSymbolType>{tA});
+		grammar.addRule(nE, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{nE, tP, nT});
+		grammar.addRule(nE, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{nT});
+		grammar.addRule(nT, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{nT, tS, nF});
+		grammar.addRule(nT, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{nF});
+		grammar.addRule(nF, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{tL, nE, tR});
+		grammar.addRule(nF, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{tA});
 
 
 		DefaultStateType q = label::InitialStateLabel::instance < DefaultStateType > ( );
@@ -81,12 +81,12 @@ void GrammarCFGtoPDATest::testBottomUp()
 		grammar::CFG < > grammar(nE);
 		grammar.setTerminalAlphabet(ext::set<DefaultSymbolType>{tP, tS, tL, tR, tA});
 		grammar.setNonterminalAlphabet(ext::set<DefaultSymbolType>{nE, nT, nF});
-		grammar.addRule(nE, ext::vector<DefaultSymbolType>{nE, tP, nT});
-		grammar.addRule(nE, ext::vector<DefaultSymbolType>{nT});
-		grammar.addRule(nT, ext::vector<DefaultSymbolType>{nT, tS, nF});
-		grammar.addRule(nT, ext::vector<DefaultSymbolType>{nF});
-		grammar.addRule(nF, ext::vector<DefaultSymbolType>{tL, nE, tR});
-		grammar.addRule(nF, ext::vector<DefaultSymbolType>{tA});
+		grammar.addRule(nE, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{nE, tP, nT});
+		grammar.addRule(nE, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{nT});
+		grammar.addRule(nT, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{nT, tS, nF});
+		grammar.addRule(nT, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{nF});
+		grammar.addRule(nF, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{tL, nE, tR});
+		grammar.addRule(nF, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{tA});
 
 
 		unsigned q = label::InitialStateLabel::instance < unsigned > ( );
diff --git a/alib2algo/test-src/grammar/properties/GrammarPropertiesTest.cpp b/alib2algo/test-src/grammar/properties/GrammarPropertiesTest.cpp
index 3ff696c633..0c8478a7cd 100644
--- a/alib2algo/test-src/grammar/properties/GrammarPropertiesTest.cpp
+++ b/alib2algo/test-src/grammar/properties/GrammarPropertiesTest.cpp
@@ -28,12 +28,12 @@ void GrammarPropertiesTest::testNullable() {
 	grammar.setNonterminalAlphabet({{X, Y, Z}});
 	grammar.setInitialSymbol(X);
 
-	grammar.addRule(X, ext::vector<DefaultSymbolType>{ d });
-	grammar.addRule(X, ext::vector<DefaultSymbolType>{ Y });
-	grammar.addRule(Y, ext::vector<DefaultSymbolType>{ d });
-	grammar.addRule(Y, ext::vector<DefaultSymbolType>{ });
-	grammar.addRule(Z, ext::vector<DefaultSymbolType>{ d });
-	grammar.addRule(Z, ext::vector<DefaultSymbolType>{ X, Y, Z });
+	grammar.addRule(X, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{ d });
+	grammar.addRule(X, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{ Y });
+	grammar.addRule(Y, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{ d });
+	grammar.addRule(Y, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{ });
+	grammar.addRule(Z, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{ d });
+	grammar.addRule(Z, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{ X, Y, Z });
 
 	ext::set<DefaultSymbolType> res = {X, Y};
 	CPPUNIT_ASSERT(res == grammar::properties::NullableNonterminals::getNullableNonterminals(grammar));
diff --git a/alib2algo/test-src/grammar/simplify/GrammarToCNFTest.cpp b/alib2algo/test-src/grammar/simplify/GrammarToCNFTest.cpp
index fb2951651c..fa54a8ace0 100644
--- a/alib2algo/test-src/grammar/simplify/GrammarToCNFTest.cpp
+++ b/alib2algo/test-src/grammar/simplify/GrammarToCNFTest.cpp
@@ -37,9 +37,9 @@ void GrammarToCNFTest::testToCNFRules1() {
 	grammar1.setNonterminalAlphabet({S, A, B, C, D});
 	grammar1.setTerminalAlphabet({a, b});
 
-	grammar::CNF < > grammar2 = grammar::simplify::ToCNF::convert(grammar1);
+	grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > grammar2 = grammar::simplify::ToCNF::convert(grammar1);
 
-	grammar::CNF < > grammar3(S);
+	grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > grammar3(S);
 	grammar3.setNonterminalAlphabet({S, A, B, C, D, aP, bP});
 	grammar3.setTerminalAlphabet({a, b});
 	grammar3.addRule(aP, a);
@@ -70,15 +70,15 @@ void GrammarToCNFTest::testToCNFRules2() {
 	grammar1.addRule({Y}, {X});
 	grammar1.addRule({Y}, {c});
 
-	grammar::CNF < > grammar2 = grammar::simplify::ToCNF::convert(grammar1);
+	grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > grammar2 = grammar::simplify::ToCNF::convert(grammar1);
 	DefaultSymbolType aP = DefaultSymbolType("a'");
 	DefaultSymbolType bP = DefaultSymbolType("b'");
 	DefaultSymbolType cP = DefaultSymbolType("c'");
-	DefaultSymbolType Xb = object::ObjectFactory::make ( ext::vector < DefaultSymbolType > { X, bP } );
-	DefaultSymbolType aX = object::ObjectFactory::make ( ext::vector < DefaultSymbolType > { aP, X } );
-	DefaultSymbolType bX = object::ObjectFactory::make ( ext::vector < DefaultSymbolType > { bP, X } );
+	DefaultSymbolType Xb = object::ObjectFactory::make ( ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { X, bP } );
+	DefaultSymbolType aX = object::ObjectFactory::make ( ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { aP, X } );
+	DefaultSymbolType bX = object::ObjectFactory::make ( ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { bP, X } );
 
-	grammar::CNF < > grammar3(S);
+	grammar::CNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > grammar3(S);
 	grammar3.setNonterminalAlphabet({S, X, Y, aP, bP, cP, Xb, aX, bX});
 	grammar3.setTerminalAlphabet({a, b, c});
 	grammar3.addRule(S, ext::make_pair(aX, bX));
@@ -101,8 +101,8 @@ void GrammarToCNFTest::testToCNFRules2() {
 	grammar3.addRule(bP, b);
 	grammar3.addRule(cP, c);
 
-	std::cout << factory::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar2)) << std::endl;
-	std::cout << factory::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar3)) << std::endl;
+	std::cout << grammar2 << std::endl;
+	std::cout << grammar3 << std::endl;
 
 	CPPUNIT_ASSERT(grammar2 == grammar3);
 }
diff --git a/alib2algo/test-src/grammar/simplify/GrammarToGNFTest.cpp b/alib2algo/test-src/grammar/simplify/GrammarToGNFTest.cpp
index a7548621fa..81174c8231 100644
--- a/alib2algo/test-src/grammar/simplify/GrammarToGNFTest.cpp
+++ b/alib2algo/test-src/grammar/simplify/GrammarToGNFTest.cpp
@@ -10,6 +10,8 @@
 #include <factory/StringDataFactory.hpp>
 #include <common/createUnique.hpp>
 
+#include "container/string/ObjectsVariant.h"
+
 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( GrammarToGNFTest, "grammar" );
 CPPUNIT_TEST_SUITE_REGISTRATION( GrammarToGNFTest );
 
@@ -36,16 +38,16 @@ void GrammarToGNFTest::testRemoveToGNFRules1() {
 	DefaultSymbolType aprimed = common::createUnique(a, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
 	DefaultSymbolType bprimed = common::createUnique(b, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
 
-	grammar::GNF < > grammar2 = grammar::simplify::ToGNF::convert(grammar1);
+	grammar::GNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > grammar2 = grammar::simplify::ToGNF::convert(grammar1);
 
-	grammar::GNF < > grammar3(S);
+	grammar::GNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > grammar3(S);
 	grammar3.setNonterminalAlphabet({S, A, B, C, D, aprimed, bprimed});
 	grammar3.setTerminalAlphabet({a, b});
-	grammar3.addRule(aprimed, ext::make_pair(a, ext::vector<DefaultSymbolType>{}));
-	grammar3.addRule(bprimed, ext::make_pair(b, ext::vector<DefaultSymbolType>{}));
+	grammar3.addRule(aprimed, ext::make_pair(a, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{}));
+	grammar3.addRule(bprimed, ext::make_pair(b, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{}));
 
-	std::cout << factory::StringDataFactory::toString(grammar2) << std::endl;
-	std::cout << factory::StringDataFactory::toString(grammar3) << std::endl;
+	std::cout << grammar2 << std::endl;
+	std::cout << grammar3 << std::endl;
 
 	CPPUNIT_ASSERT(grammar2 == grammar3);
 }
@@ -74,27 +76,27 @@ void GrammarToGNFTest::testRemoveToGNFRules2() {
 	DefaultSymbolType bprimed = common::createUnique(b, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
 	DefaultSymbolType cprimed = common::createUnique(c, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
 
-	std::cout << factory::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar1)) << std::endl;
+	std::cout << grammar1 << std::endl;
 
-	grammar::GNF < > grammar2 = grammar::simplify::ToGNF::convert(grammar1);
+	grammar::GNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > grammar2 = grammar::simplify::ToGNF::convert(grammar1);
 
-	grammar::GNF < > grammar3(S);
+	grammar::GNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > grammar3(S);
 	grammar3.setNonterminalAlphabet({S, A, Aprimed, B, C, D, aprimed, bprimed, cprimed});
 	grammar3.setTerminalAlphabet({a, b, c});
-	grammar3.addRule(S, ext::make_pair(c, ext::vector<DefaultSymbolType>{Aprimed}));
-	grammar3.addRule(S, ext::make_pair(c, ext::vector<DefaultSymbolType>{}));
-	grammar3.addRule(A, ext::make_pair(c, ext::vector<DefaultSymbolType>{Aprimed}));
-	grammar3.addRule(A, ext::make_pair(c, ext::vector<DefaultSymbolType>{}));
-	grammar3.addRule(Aprimed, ext::make_pair(a, ext::vector<DefaultSymbolType>{Aprimed}));
-	grammar3.addRule(Aprimed, ext::make_pair(a, ext::vector<DefaultSymbolType>{}));
-	grammar3.addRule(Aprimed, ext::make_pair(b, ext::vector<DefaultSymbolType>{Aprimed}));
-	grammar3.addRule(Aprimed, ext::make_pair(b, ext::vector<DefaultSymbolType>{}));
-	grammar3.addRule(aprimed, ext::make_pair(a, ext::vector<DefaultSymbolType>{}));
-	grammar3.addRule(bprimed, ext::make_pair(b, ext::vector<DefaultSymbolType>{}));
-	grammar3.addRule(cprimed, ext::make_pair(c, ext::vector<DefaultSymbolType>{}));
-
-	std::cout << factory::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar2)) << std::endl;
-	std::cout << factory::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar3)) << std::endl;
+	grammar3.addRule(S, ext::make_pair(c, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{Aprimed}));
+	grammar3.addRule(S, ext::make_pair(c, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{}));
+	grammar3.addRule(A, ext::make_pair(c, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{Aprimed}));
+	grammar3.addRule(A, ext::make_pair(c, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{}));
+	grammar3.addRule(Aprimed, ext::make_pair(a, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{Aprimed}));
+	grammar3.addRule(Aprimed, ext::make_pair(a, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{}));
+	grammar3.addRule(Aprimed, ext::make_pair(b, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{Aprimed}));
+	grammar3.addRule(Aprimed, ext::make_pair(b, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{}));
+	grammar3.addRule(aprimed, ext::make_pair(a, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{}));
+	grammar3.addRule(bprimed, ext::make_pair(b, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{}));
+	grammar3.addRule(cprimed, ext::make_pair(c, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{}));
+
+	std::cout << grammar2 << std::endl;
+	std::cout << grammar3 << std::endl;
 
 	CPPUNIT_ASSERT(grammar2 == grammar3);
 }
@@ -122,29 +124,29 @@ void GrammarToGNFTest::testRemoveToGNFRules3() {
 	DefaultSymbolType bprimed = common::createUnique(b, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
 	DefaultSymbolType cprimed = common::createUnique(c, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
 
-	std::cout << factory::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar1)) << std::endl;
+	std::cout << grammar1 << std::endl;
 
-	grammar::GNF < > grammar2 = grammar::simplify::ToGNF::convert(grammar1);
+	grammar::GNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > grammar2 = grammar::simplify::ToGNF::convert(grammar1);
 
-	grammar::GNF < > grammar3(S);
+	grammar::GNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > grammar3(S);
 	grammar3.setNonterminalAlphabet({S, A, B, Bprimed, C, aprimed, bprimed, cprimed});
 	grammar3.setTerminalAlphabet({a, b, c});
-	grammar3.addRule(S, ext::make_pair(c, ext::vector<DefaultSymbolType>{}));
-	grammar3.addRule(S, ext::make_pair(c, ext::vector<DefaultSymbolType>{bprimed, Bprimed, aprimed}));
-	grammar3.addRule(S, ext::make_pair(c, ext::vector<DefaultSymbolType>{bprimed, aprimed}));
-	grammar3.addRule(A, ext::make_pair(c, ext::vector<DefaultSymbolType>{bprimed, aprimed}));
-	grammar3.addRule(A, ext::make_pair(c, ext::vector<DefaultSymbolType>{bprimed, Bprimed, aprimed}));
-	grammar3.addRule(A, ext::make_pair(c, ext::vector<DefaultSymbolType>{}));
-	grammar3.addRule(B, ext::make_pair(c, ext::vector<DefaultSymbolType>{bprimed}));
-	grammar3.addRule(B, ext::make_pair(c, ext::vector<DefaultSymbolType>{bprimed, Bprimed}));
-	grammar3.addRule(Bprimed, ext::make_pair(a, ext::vector<DefaultSymbolType>{bprimed, Bprimed}));
-	grammar3.addRule(Bprimed, ext::make_pair(a, ext::vector<DefaultSymbolType>{bprimed}));
-	grammar3.addRule(aprimed, ext::make_pair(a, ext::vector<DefaultSymbolType>{}));
-	grammar3.addRule(bprimed, ext::make_pair(b, ext::vector<DefaultSymbolType>{}));
-	grammar3.addRule(cprimed, ext::make_pair(c, ext::vector<DefaultSymbolType>{}));
-
-	std::cout << factory::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar2)) << std::endl;
-	std::cout << factory::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar3)) << std::endl;
+	grammar3.addRule(S, ext::make_pair(c, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{}));
+	grammar3.addRule(S, ext::make_pair(c, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{bprimed, Bprimed, aprimed}));
+	grammar3.addRule(S, ext::make_pair(c, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{bprimed, aprimed}));
+	grammar3.addRule(A, ext::make_pair(c, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{bprimed, aprimed}));
+	grammar3.addRule(A, ext::make_pair(c, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{bprimed, Bprimed, aprimed}));
+	grammar3.addRule(A, ext::make_pair(c, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{}));
+	grammar3.addRule(B, ext::make_pair(c, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{bprimed}));
+	grammar3.addRule(B, ext::make_pair(c, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{bprimed, Bprimed}));
+	grammar3.addRule(Bprimed, ext::make_pair(a, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{bprimed, Bprimed}));
+	grammar3.addRule(Bprimed, ext::make_pair(a, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{bprimed}));
+	grammar3.addRule(aprimed, ext::make_pair(a, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{}));
+	grammar3.addRule(bprimed, ext::make_pair(b, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{}));
+	grammar3.addRule(cprimed, ext::make_pair(c, ext::vector<ext::variant<DefaultSymbolType,DefaultSymbolType>>{}));
+
+	std::cout << grammar2 << std::endl;
+	std::cout << grammar3 << std::endl;
 
 	CPPUNIT_ASSERT(grammar2 == grammar3);
 }
@@ -168,7 +170,7 @@ void GrammarToGNFTest::testRemoveToGNFRules4() {
 	grammar1.addRule(C, {C, C});
 	grammar1.addRule(C, {a});
 
-	grammar::GNF < > grammar2 = grammar::simplify::ToGNF::convert(grammar1);
+	grammar::GNF < DefaultSymbolType, ext::variant < DefaultSymbolType, DefaultSymbolType > > grammar2 = grammar::simplify::ToGNF::convert(grammar1);
 
 	CPPUNIT_ASSERT(grammar::generate::GenerateUpToLength::generate(grammar1, 7) == grammar::generate::GenerateUpToLength::generate(grammar2, 7));
 }
diff --git a/alib2algo_experimental/src/grammar/parsing/AbsorbTerminalSymbol.cpp b/alib2algo_experimental/src/grammar/parsing/AbsorbTerminalSymbol.cpp
index 92f29151b5..04df2c6ecf 100644
--- a/alib2algo_experimental/src/grammar/parsing/AbsorbTerminalSymbol.cpp
+++ b/alib2algo_experimental/src/grammar/parsing/AbsorbTerminalSymbol.cpp
@@ -17,10 +17,10 @@ namespace parsing {
 
 void AbsorbTerminalSymbol::handleAbsobtion ( const grammar::CFG < > & orig, grammar::CFG < > & res, const DefaultSymbolType & terminal, const ext::set < DefaultSymbolType > & nonterminals, const ext::map < DefaultSymbolType, DefaultSymbolType > & nonterminalsPrimed ) {
 	for ( const DefaultSymbolType & nonterminal : nonterminals )
-		for ( const ext::vector < DefaultSymbolType > & rhs : orig.getRules ( ).find ( nonterminal )->second ) {
-			ext::vector < DefaultSymbolType > newRHS;
+		for ( const ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > & rhs : orig.getRules ( ).find ( nonterminal )->second ) {
+			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > newRHS;
 
-			for ( ext::vector < DefaultSymbolType >::const_iterator iter = rhs.begin ( ); iter != rhs.end ( ); ++iter ) {
+			for ( ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >::const_iterator iter = rhs.begin ( ); iter != rhs.end ( ); ++iter ) {
 				if ( nonterminals.count ( * iter ) && ( ( iter + 1 == rhs.end ( ) ) || ( terminal == * ( iter + 1 ) ) ) ) {
 					newRHS.push_back ( nonterminalsPrimed.find ( * iter )->second );
 
@@ -57,13 +57,13 @@ void AbsorbTerminalSymbol::absorbTerminalSymbol ( grammar::CFG < > & grammar, co
 
 	handleAbsobtion ( grammar, res, terminal, nonterminals, nonterminalsPrimed );
 
-	for ( const std::pair < const DefaultSymbolType, ext::set < ext::vector < DefaultSymbolType > > > & rule : grammar.getRules ( ) ) {
+	for ( const std::pair < const DefaultSymbolType, ext::set < ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > > & rule : grammar.getRules ( ) ) {
 		const DefaultSymbolType & lhs = rule.first;
 
-		for ( const ext::vector < DefaultSymbolType > & rhs : rule.second ) {
-			ext::vector < DefaultSymbolType > newRHS;
+		for ( const ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > & rhs : rule.second ) {
+			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > newRHS;
 
-			for ( ext::vector < DefaultSymbolType >::const_iterator iter = rhs.begin ( ); iter != rhs.end ( ); ++iter ) {
+			for ( ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >::const_iterator iter = rhs.begin ( ); iter != rhs.end ( ); ++iter ) {
 				if ( ( iter + 1 != rhs.end ( ) ) && nonterminals.count ( * iter ) && ( terminal == * ( iter + 1 ) ) ) {
 					newRHS.push_back ( nonterminalsPrimed.find ( * iter )->second );
 					++iter;
diff --git a/alib2algo_experimental/src/grammar/parsing/CornerSubstitution.cpp b/alib2algo_experimental/src/grammar/parsing/CornerSubstitution.cpp
index 19c550037c..c2f23ff290 100644
--- a/alib2algo_experimental/src/grammar/parsing/CornerSubstitution.cpp
+++ b/alib2algo_experimental/src/grammar/parsing/CornerSubstitution.cpp
@@ -22,10 +22,10 @@ void CornerSubstitution::cornerSubstitution ( grammar::CFG < > & grammar, const
 	res.setNonterminalAlphabet ( grammar.getNonterminalAlphabet ( ) );
 	res.setTerminalAlphabet ( grammar.getTerminalAlphabet ( ) );
 
-	for ( const std::pair < const DefaultSymbolType, ext::set < ext::vector < DefaultSymbolType > > > & rule : grammar.getRules ( ) ) {
+	for ( const std::pair < const DefaultSymbolType, ext::set < ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > > & rule : grammar.getRules ( ) ) {
 		const DefaultSymbolType & lhs = rule.first;
 
-		for ( const ext::vector < DefaultSymbolType > & rhs : rule.second ) {
+		for ( const ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > & rhs : rule.second ) {
 			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rawRhs ( rhs.begin ( ), rhs.end ( ) );
 			if ( ( lhs == nonterminal ) && ( rhs.size ( ) > 0 ) && ( grammar.getNonterminalAlphabet ( ).count ( rhs[0] ) ) && First::first ( grammar, rawRhs ).count ( ext::variant < DefaultSymbolType, DefaultEpsilonType > ( terminal ) ) )
 				Substitute::substitute ( grammar, res, lhs, rhs, rhs.begin ( ) );
diff --git a/alib2algo_experimental/src/grammar/parsing/ExtractRightContext.cpp b/alib2algo_experimental/src/grammar/parsing/ExtractRightContext.cpp
index 43fcdb9048..c7e39b422e 100644
--- a/alib2algo_experimental/src/grammar/parsing/ExtractRightContext.cpp
+++ b/alib2algo_experimental/src/grammar/parsing/ExtractRightContext.cpp
@@ -21,13 +21,13 @@ void ExtractRightContext::extractRightContext ( grammar::CFG < > & grammar, cons
 	res.setNonterminalAlphabet ( grammar.getNonterminalAlphabet ( ) );
 	res.setTerminalAlphabet ( grammar.getTerminalAlphabet ( ) );
 
-	for ( const std::pair < const DefaultSymbolType, ext::set < ext::vector < DefaultSymbolType > > > & rule : grammar.getRules ( ) ) {
+	for ( const std::pair < const DefaultSymbolType, ext::set < ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > > & rule : grammar.getRules ( ) ) {
 		const DefaultSymbolType & lhs = rule.first;
 
-		for ( const ext::vector < DefaultSymbolType > & rhs : rule.second ) {
+		for ( const ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > & rhs : rule.second ) {
 			bool substitued = false;
 			if(rhs.size() > 0)
-				for ( ext::vector < DefaultSymbolType >::const_iterator iter = rhs.begin ( ); iter + 1 != rhs.end ( ); ++iter )
+				for ( ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >::const_iterator iter = rhs.begin ( ); iter + 1 != rhs.end ( ); ++iter )
 					if ( nonterminals.count ( * iter ) && grammar.getNonterminalAlphabet ( ).count ( * ( iter + 1 ) ) && First::first ( grammar, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > ( iter + 1, rhs.end ( ) ) ).count ( ext::variant < DefaultSymbolType, DefaultEpsilonType > ( terminal ) ) ) {
 						Substitute::substitute ( grammar, res, lhs, rhs, iter + 1 );
 						substitued = true;
diff --git a/alib2algo_experimental/src/grammar/parsing/HandleFirstFollowConflict.cpp b/alib2algo_experimental/src/grammar/parsing/HandleFirstFollowConflict.cpp
index 58b8116cd1..57f9c82c58 100644
--- a/alib2algo_experimental/src/grammar/parsing/HandleFirstFollowConflict.cpp
+++ b/alib2algo_experimental/src/grammar/parsing/HandleFirstFollowConflict.cpp
@@ -30,11 +30,11 @@ void HandleFirstFollowConflict::handleFirstFollowConflict ( grammar::CFG < > & g
 	while ( true ) {
 		ext::set < DefaultSymbolType > symbolsEndingWithNonterminalOld = symbolsEndingWithNonterminal;
 
-		for ( const std::pair < const DefaultSymbolType, ext::set < ext::vector < DefaultSymbolType > > > & rule : grammar.getRules ( ) ) {
+		for ( const std::pair < const DefaultSymbolType, ext::set < ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > > & rule : grammar.getRules ( ) ) {
 			const DefaultSymbolType & lhs = rule.first;
 
 			if ( Follow::follow ( grammar, lhs ).count ( ext::variant < DefaultSymbolType, DefaultEpsilonType > ( terminal ) ) )
-				for ( const ext::vector < DefaultSymbolType > & rhs : rule.second )
+				for ( const ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > & rhs : rule.second )
 					for ( unsigned i = rhs.size ( ); i > 0; i-- ) {
 						if ( symbolsEndingWithNonterminal.count ( rhs[i - 1] ) )
 							symbolsEndingWithNonterminal.insert ( lhs );
@@ -48,10 +48,10 @@ void HandleFirstFollowConflict::handleFirstFollowConflict ( grammar::CFG < > & g
 	}
 
 	 // find whether all occurrences of a symbol in symbolsEndingWithNonterminal are followed by terminal symbol (the paremeter)
-	for ( const std::pair < const DefaultSymbolType, ext::set < ext::vector < DefaultSymbolType > > > & rule : grammar.getRules ( ) )
-		for ( const ext::vector < DefaultSymbolType > & rhs : rule.second ) {
+	for ( const std::pair < const DefaultSymbolType, ext::set < ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > > & rule : grammar.getRules ( ) )
+		for ( const ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > & rhs : rule.second ) {
 			if ( rhs.size ( ) > 0 )
-				for ( ext::vector < DefaultSymbolType >::const_iterator iter = rhs.begin ( ); iter + 1 != rhs.end ( ); ++iter )
+				for ( ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >::const_iterator iter = rhs.begin ( ); iter + 1 != rhs.end ( ); ++iter )
 					if ( symbolsEndingWithNonterminal.count ( * iter ) && grammar.getNonterminalAlphabet ( ).count ( * ( iter + 1 ) ) && First::first ( grammar, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > ( iter + 1, rhs.end ( ) ) ).count ( ext::variant < DefaultSymbolType, DefaultEpsilonType > ( terminal ) ) ) {
 						ExtractRightContext::extractRightContext ( grammar, terminal, symbolsEndingWithNonterminal );
 						return;
diff --git a/alib2algo_experimental/src/grammar/parsing/LR0Parser.cpp b/alib2algo_experimental/src/grammar/parsing/LR0Parser.cpp
index 9824f028af..b3a10d6ede 100644
--- a/alib2algo_experimental/src/grammar/parsing/LR0Parser.cpp
+++ b/alib2algo_experimental/src/grammar/parsing/LR0Parser.cpp
@@ -23,21 +23,21 @@ LR0Items LR0Parser::getClosure ( LR0Items items, grammar::CFG < > originalGramma
 		changed = false;
 
 		for ( const LR0Items::value_type & symbolItems : items ) {
-			for ( const std::pair < unsigned, ext::vector < DefaultSymbolType > > & item : symbolItems.second ) {
+			for ( const std::pair < unsigned, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > & item : symbolItems.second ) {
 				unsigned position = item.first;
-				ext::vector < DefaultSymbolType > rightHandSide = item.second;
+				ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rightHandSide = item.second;
 
 				if ( position == rightHandSide.size ( ) )
 					continue;
 
-				ext::map < DefaultSymbolType, ext::set < ext::vector < DefaultSymbolType > > >::const_iterator rulesIterator = originalGrammar.getRules ( ) . find(rightHandSide[position]);
+				ext::map < DefaultSymbolType, ext::set < ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > >::const_iterator rulesIterator = originalGrammar.getRules ( ) . find(rightHandSide[position]);
 				if ( rulesIterator == originalGrammar.getRules ( ) . end ( ) )
 					continue;
 
-				for ( const ext::vector < DefaultSymbolType > & rule : rulesIterator->second ) {
-					if (items[rightHandSide[position]].find ( { 0, rule } ) == items[rightHandSide[position]].end ( ) ) {
+				for ( const ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > & rule : rulesIterator->second ) {
+					if (items[rightHandSide[position].get < DefaultSymbolType > ( ) ].find ( { 0, rule } ) == items[rightHandSide[position].get < DefaultSymbolType > ( ) ].end ( ) ) {
 						changed = true;
-						items[rightHandSide[position]].insert ( { 0, rule } );
+						items[rightHandSide[position].get < DefaultSymbolType > ( ) ].insert ( { 0, rule } );
 					}
 				}
 			}
@@ -47,13 +47,13 @@ LR0Items LR0Parser::getClosure ( LR0Items items, grammar::CFG < > originalGramma
 	return items;
 }
 
-LR0Items LR0Parser::getNextStateItems ( LR0Items items, DefaultSymbolType symbol, grammar::CFG < > originalGrammar ) {
+LR0Items LR0Parser::getNextStateItems ( LR0Items items, ext::variant < DefaultSymbolType, DefaultSymbolType > symbol, grammar::CFG < > originalGrammar ) {
 	LR0Items transitionItems;
 	for ( const LR0Items::value_type & symbolItems : items ) {
 		DefaultSymbolType leftHandSide = symbolItems.first;
-		for ( const std::pair < unsigned, ext::vector < DefaultSymbolType > > & item : symbolItems.second) {
+		for ( const std::pair < unsigned, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > & item : symbolItems.second) {
 			unsigned position = item.first;
-			ext::vector < DefaultSymbolType > rightHandSide = item.second;
+			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rightHandSide = item.second;
 
 			if ( position == rightHandSide.size ( ) ) {
 				continue;
@@ -68,34 +68,34 @@ LR0Items LR0Parser::getNextStateItems ( LR0Items items, DefaultSymbolType symbol
 	return getClosure ( transitionItems, originalGrammar );
 }
 
-automaton::DFA<> LR0Parser::getAutomaton ( grammar::CFG < > originalGrammar ) {
+automaton::DFA < ext::variant < DefaultSymbolType, DefaultSymbolType >, LR0Items > LR0Parser::getAutomaton ( grammar::CFG < > originalGrammar ) {
 	grammar::CFG < > augmentedGrammar = LRParser::getAugmentedGrammar ( originalGrammar );
 	DefaultSymbolType initialSymbol = augmentedGrammar.getInitialSymbol ( );
-	const ext::map < DefaultSymbolType, ext::set < ext::vector < DefaultSymbolType > > > & rules = augmentedGrammar.getRules ( );
+	const ext::map < DefaultSymbolType, ext::set < ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > > & rules = augmentedGrammar.getRules ( );
 
 	LR0Items initialItems;
 	initialItems[initialSymbol].insert ( { 0, *rules.find ( initialSymbol ) -> second.begin ( ) } );
 
-	DefaultStateType initialState ( label::LR0ItemsLabel ( getClosure ( initialItems, augmentedGrammar ) ) );
+	LR0Items initialState = getClosure ( initialItems, augmentedGrammar );
 
-	automaton::DFA<> lr0Automaton ( initialState );
-	lr0Automaton.addInputSymbols ( augmentedGrammar.getNonterminalAlphabet ( ) );
-	lr0Automaton.addInputSymbols ( augmentedGrammar.getTerminalAlphabet ( ) );
+	automaton::DFA < ext::variant < DefaultSymbolType, DefaultSymbolType >, LR0Items > lr0Automaton ( initialState );
 
-	std::queue < DefaultStateType > itemsToProcess;
+	for ( const DefaultSymbolType & nonterminal : augmentedGrammar.getNonterminalAlphabet ( ) )
+		lr0Automaton.addInputSymbol ( nonterminal );
+
+	for ( const DefaultSymbolType & terminal : augmentedGrammar.getTerminalAlphabet ( ) )
+		lr0Automaton.addInputSymbol ( terminal );
+
+	std::queue < LR0Items > itemsToProcess;
 	itemsToProcess.push ( initialState );
 	while ( !itemsToProcess.empty ( ) ) {
-		DefaultStateType currentState = itemsToProcess.front ( );
-		label::LR0ItemsLabel & currentLabel = static_cast < label::LR0ItemsLabel & > ( currentState . getData ( ) );
+		LR0Items currentState = itemsToProcess.front ( );
 		itemsToProcess.pop ( );
 
-		for ( const DefaultSymbolType & symbol : lr0Automaton.getInputAlphabet ( ) ) {
-			LR0Items nextStateItems = getNextStateItems ( currentLabel.getItems ( ), symbol, augmentedGrammar );
-			if ( !nextStateItems.empty ( ) ) {
-				label::LR0ItemsLabel nextStateLabel ( nextStateItems );
-
-				DefaultStateType nextState ( nextStateLabel );
-				ext::set < DefaultStateType > ::iterator stateIterator = lr0Automaton.getStates ( ) . find ( nextState );
+		for ( const ext::variant < DefaultSymbolType, DefaultSymbolType > & symbol : lr0Automaton.getInputAlphabet ( ) ) {
+			LR0Items nextState = getNextStateItems ( currentState, symbol, augmentedGrammar );
+			if ( !nextState.empty ( ) ) {
+				ext::set < LR0Items > ::iterator stateIterator = lr0Automaton.getStates ( ) . find ( nextState );
 				if ( stateIterator == lr0Automaton.getStates ( ) . end ( ) ) {
 					lr0Automaton.addState ( nextState );
 					lr0Automaton.addTransition ( currentState, symbol, nextState );
diff --git a/alib2algo_experimental/src/grammar/parsing/LR0Parser.h b/alib2algo_experimental/src/grammar/parsing/LR0Parser.h
index 8ab87ba3f3..6b74013a4c 100644
--- a/alib2algo_experimental/src/grammar/parsing/LR0Parser.h
+++ b/alib2algo_experimental/src/grammar/parsing/LR0Parser.h
@@ -20,9 +20,9 @@ class LR0Parser {
 public:
 	static LR0Items getClosure ( LR0Items items, grammar::CFG < > originalGrammar );
 
-	static LR0Items getNextStateItems ( LR0Items items, DefaultSymbolType symbol, grammar::CFG < > originalGrammar );
+	static LR0Items getNextStateItems ( LR0Items items, ext::variant < DefaultSymbolType, DefaultSymbolType > symbol, grammar::CFG < > originalGrammar );
 
-	static automaton::DFA<> getAutomaton ( grammar::CFG < > originalGrammar );
+	static automaton::DFA < ext::variant < DefaultSymbolType, DefaultSymbolType >, LR0Items > getAutomaton ( grammar::CFG < > originalGrammar );
 };
 
 } /* namespace parsing */
diff --git a/alib2algo_experimental/src/grammar/parsing/LRParser.cpp b/alib2algo_experimental/src/grammar/parsing/LRParser.cpp
index c0a1c8a7d0..285f26744d 100644
--- a/alib2algo_experimental/src/grammar/parsing/LRParser.cpp
+++ b/alib2algo_experimental/src/grammar/parsing/LRParser.cpp
@@ -29,8 +29,8 @@ grammar::CFG < > LRParser::getAugmentedGrammar ( grammar::CFG < > originalGramma
 	return originalGrammar;
 }
 
-bool LRParser::parse ( LRActionTable actionTable, LRGotoTable gotoTable, DefaultStateType initialState, ext::vector < DefaultSymbolType > input ) {
-	std::stack < DefaultStateType > states;
+bool LRParser::parse ( LRActionTable actionTable, LRGotoTable gotoTable, LR0Items initialState, ext::vector < DefaultSymbolType > input ) {
+	std::stack < LR0Items > states;
 	states.push ( initialState );
 
 	unsigned currentPosition = 0;
@@ -41,13 +41,13 @@ bool LRParser::parse ( LRActionTable actionTable, LRGotoTable gotoTable, Default
 
 		switch ( actionIterator->second.first ) {
 			case LRAction::Shift:
-				states.push ( actionIterator->second.second.get < DefaultStateType > ( ) );
+				states.push ( actionIterator->second.second.get < LR0Items > ( ) );
 
 				++currentPosition;
 				break;
 
 			case LRAction::Reduce: {
-				ext::pair < DefaultSymbolType, ext::vector < DefaultSymbolType > > reduceBy = actionIterator->second.second.get < ext::pair < DefaultSymbolType, ext::vector < DefaultSymbolType > > > ( );
+				ext::pair < DefaultSymbolType, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > reduceBy = actionIterator->second.second.get < ext::pair < DefaultSymbolType, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > > ( );
 				for ( unsigned i = 0; i < reduceBy.second.size ( ); ++i ) {
 					states.pop ( );
 				}
diff --git a/alib2algo_experimental/src/grammar/parsing/LRParser.h b/alib2algo_experimental/src/grammar/parsing/LRParser.h
index f759a6f7e5..e9b8573af7 100644
--- a/alib2algo_experimental/src/grammar/parsing/LRParser.h
+++ b/alib2algo_experimental/src/grammar/parsing/LRParser.h
@@ -24,7 +24,7 @@ public:
 
 	static grammar::CFG < > getAugmentedGrammar ( grammar::CFG < > originalGrammar );
 
-	static bool parse ( LRActionTable actionTable, LRGotoTable gotoTable, DefaultStateType initialState, ext::vector < DefaultSymbolType > input );
+	static bool parse ( LRActionTable actionTable, LRGotoTable gotoTable, LR0Items initialState, ext::vector < DefaultSymbolType > input );
 };
 
 } /* namespace parsing */
diff --git a/alib2algo_experimental/src/grammar/parsing/LeftFactorize.cpp b/alib2algo_experimental/src/grammar/parsing/LeftFactorize.cpp
index 4e7d24f85a..6596086ef4 100644
--- a/alib2algo_experimental/src/grammar/parsing/LeftFactorize.cpp
+++ b/alib2algo_experimental/src/grammar/parsing/LeftFactorize.cpp
@@ -23,13 +23,13 @@ void LeftFactorize::leftFactorize ( grammar::CFG < > & grammar, const DefaultSym
 	DefaultSymbolType primed = common::createUnique ( nonterminal, grammar.getTerminalAlphabet ( ), grammar.getNonterminalAlphabet ( ) );
 	res.addNonterminalSymbol ( primed );
 
-	for ( const std::pair < const DefaultSymbolType, ext::set < ext::vector < DefaultSymbolType > > > & rule : grammar.getRules ( ) ) {
+	for ( const std::pair < const DefaultSymbolType, ext::set < ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > > & rule : grammar.getRules ( ) ) {
 		const DefaultSymbolType & lhs = rule.first;
 
-		for ( const ext::vector < DefaultSymbolType > & rhs : rule.second ) {
+		for ( const ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > & rhs : rule.second ) {
 			if ( ( lhs == nonterminal ) && ( rhs.size ( ) > 0 ) && ( rhs[0] == terminal ) ) {
-				res.addRule ( lhs, ext::vector < DefaultSymbolType > { terminal, primed } );
-				res.addRule ( primed, ext::vector < DefaultSymbolType > ( rhs.begin ( ) + 1, rhs.end ( ) ) );
+				res.addRule ( lhs, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { terminal, primed } );
+				res.addRule ( primed, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > ( rhs.begin ( ) + 1, rhs.end ( ) ) );
 			} else {
 				res.addRule ( lhs, rhs );
 			}
diff --git a/alib2algo_experimental/src/grammar/parsing/SLR1ParseTable.cpp b/alib2algo_experimental/src/grammar/parsing/SLR1ParseTable.cpp
index 1e4676c05a..408cd90ee1 100644
--- a/alib2algo_experimental/src/grammar/parsing/SLR1ParseTable.cpp
+++ b/alib2algo_experimental/src/grammar/parsing/SLR1ParseTable.cpp
@@ -28,16 +28,13 @@ void SLR1ParseTable::insertToActionTable ( LRActionTable & actionTable, LRAction
 LRActionTable SLR1ParseTable::getActionTable ( grammar::CFG < > originalGrammar ) {
 	LRActionTable actionTable;
 	grammar::CFG < > augmentedGrammar = LRParser::getAugmentedGrammar ( originalGrammar );
-	automaton::DFA<> parsingAutomaton = LR0Parser::getAutomaton ( originalGrammar );
-	for ( const DefaultStateType & state : parsingAutomaton.getStates ( ) ) {
-		LR0Items items = static_cast < const label::LR0ItemsLabel & > ( state . getData ( ) ) . getItems ( );
-		ext::iterator_range < ext::map < ext::pair < DefaultStateType, DefaultSymbolType >, DefaultStateType >::const_iterator > transitionsFromCurrentStateRange = parsingAutomaton.getTransitionsFromState ( state );
-		ext::map < ext::pair < DefaultStateType, DefaultSymbolType >, DefaultStateType > transitionsFromCurrentState ( transitionsFromCurrentStateRange.begin ( ), transitionsFromCurrentStateRange.end ( ) );
-		for ( const LR0Items::value_type & nonterminalItems : items ) {
+	automaton::DFA < ext::variant < DefaultSymbolType, DefaultSymbolType >, LR0Items > parsingAutomaton = LR0Parser::getAutomaton ( originalGrammar );
+	for ( const LR0Items & state : parsingAutomaton.getStates ( ) ) {
+		for ( const LR0Items::value_type & nonterminalItems : state ) {
 			DefaultSymbolType leftHandSide = nonterminalItems.first;
-			for ( const std::pair < unsigned, ext::vector < DefaultSymbolType > > & item : nonterminalItems.second ) {
+			for ( const std::pair < unsigned, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > & item : nonterminalItems.second ) {
 				unsigned position = item.first;
-				ext::vector < DefaultSymbolType > rightHandSide = item.second;
+				ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rightHandSide = item.second;
 
 				if ( position == rightHandSide.size ( ) ) {
 					if ( leftHandSide == augmentedGrammar.getInitialSymbol ( ) ) {
@@ -46,7 +43,7 @@ LRActionTable SLR1ParseTable::getActionTable ( grammar::CFG < > originalGrammar
 					}
 
 					ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > followSet = grammar::parsing::Follow::follow ( augmentedGrammar, leftHandSide );
-					ext::pair < DefaultSymbolType, ext::vector < DefaultSymbolType > > currentRule = { leftHandSide, rightHandSide };
+					ext::pair < DefaultSymbolType, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > currentRule = { leftHandSide, rightHandSide };
 					for ( const ext::variant < DefaultSymbolType, string::Epsilon < > > & followSymbol : followSet ) {
 						if ( followSymbol.is < DefaultSymbolType > ( ) ) {
 							insertToActionTable(actionTable, { state, followSymbol.get < DefaultSymbolType > ( ) }, { LRAction::Reduce, currentRule } );
@@ -57,9 +54,9 @@ LRActionTable SLR1ParseTable::getActionTable ( grammar::CFG < > originalGrammar
 					continue;
 				}
 
-				DefaultSymbolType currentSymbol = rightHandSide[position];
+				ext::variant < DefaultSymbolType, DefaultSymbolType > currentSymbol = rightHandSide[position];
 				if ( originalGrammar.getTerminalAlphabet ( ) . find ( currentSymbol ) != originalGrammar.getTerminalAlphabet ( ) . end ( ) ) {
-					insertToActionTable(actionTable, { state, currentSymbol }, { LRAction::Shift, transitionsFromCurrentState.find ( { state, currentSymbol } )->second } );
+					insertToActionTable(actionTable, { state, currentSymbol.get < DefaultSymbolType /* terminal */ > ( ) }, { LRAction::Shift, parsingAutomaton.getTransitions ( ).find ( { state, currentSymbol } )->second } );
 				}
 			}
 		}
@@ -71,13 +68,11 @@ LRActionTable SLR1ParseTable::getActionTable ( grammar::CFG < > originalGrammar
 LRGotoTable SLR1ParseTable::getGotoTable ( grammar::CFG < > originalGrammar ) {
 	LRGotoTable gotoTable;
 	grammar::CFG < > augmentedGrammar = LRParser::getAugmentedGrammar ( originalGrammar );
-	automaton::DFA<> parsingAutomaton = LR0Parser::getAutomaton ( originalGrammar );
-	for ( const DefaultStateType & state : parsingAutomaton.getStates ( ) ) {
-		ext::iterator_range < ext::map < ext::pair < DefaultStateType, DefaultSymbolType >, DefaultStateType >::const_iterator > transitionsFromCurrentStateRange = parsingAutomaton.getTransitionsFromState ( state );
-		ext::map < ext::pair < DefaultStateType, DefaultSymbolType >, DefaultStateType > transitionsFromCurrentState ( transitionsFromCurrentStateRange.begin ( ), transitionsFromCurrentStateRange.end ( ) );
+	automaton::DFA < ext::variant < DefaultSymbolType, DefaultSymbolType >, LR0Items > parsingAutomaton = LR0Parser::getAutomaton ( originalGrammar );
+	for ( const LR0Items & state : parsingAutomaton.getStates ( ) ) {
 		for ( const DefaultSymbolType & nonterminal : augmentedGrammar.getNonterminalAlphabet ( ) ) {
-			ext::map < ext::pair<DefaultStateType, DefaultSymbolType >, DefaultStateType >::iterator transitionIterator = transitionsFromCurrentState.find ( { state, nonterminal } );
-			if ( transitionIterator != transitionsFromCurrentState.end ( ) ) {
+			ext::map < ext::pair < LR0Items, ext::variant < DefaultSymbolType, DefaultSymbolType > >, LR0Items >::const_iterator transitionIterator = parsingAutomaton.getTransitions ( ).find ( { state, nonterminal } );
+			if ( transitionIterator != parsingAutomaton.getTransitions ( ).end ( ) ) {
 				gotoTable.insert ( { { state, nonterminal }, transitionIterator->second } );
 			}
 		}
diff --git a/alib2algo_experimental/src/grammar/parsing/common/Substitute.cpp b/alib2algo_experimental/src/grammar/parsing/common/Substitute.cpp
index 95f015898a..755f700b70 100644
--- a/alib2algo_experimental/src/grammar/parsing/common/Substitute.cpp
+++ b/alib2algo_experimental/src/grammar/parsing/common/Substitute.cpp
@@ -12,13 +12,13 @@ namespace grammar {
 
 namespace parsing {
 
-void Substitute::substitute ( const grammar::CFG < > & orig, grammar::CFG < > & res, const DefaultSymbolType & origLHS, const ext::vector < DefaultSymbolType > & origRHS, ext::vector < DefaultSymbolType >::const_iterator nonterminal ) {
+void Substitute::substitute ( const grammar::CFG < > & orig, grammar::CFG < > & res, const DefaultSymbolType & origLHS, const ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > & origRHS, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >::const_iterator nonterminal ) {
 	auto iter = orig.getRules ( ).find ( * nonterminal );
 
 	if ( iter == orig.getRules ( ).end ( ) ) return;
 
-	for ( const ext::vector < DefaultSymbolType > & rhs : iter->second ) {
-		ext::vector < DefaultSymbolType > newRHS ( origRHS.begin ( ), nonterminal );
+	for ( const ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > & rhs : iter->second ) {
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > newRHS ( origRHS.begin ( ), nonterminal );
 		newRHS.insert ( newRHS.end ( ), rhs.begin ( ), rhs.end ( ) );
 		newRHS.insert ( newRHS.end ( ), nonterminal + 1, origRHS.end ( ) );
 		res.addRule ( origLHS, newRHS );
diff --git a/alib2algo_experimental/src/grammar/parsing/common/Substitute.h b/alib2algo_experimental/src/grammar/parsing/common/Substitute.h
index f151b80f44..561cf7b4c0 100644
--- a/alib2algo_experimental/src/grammar/parsing/common/Substitute.h
+++ b/alib2algo_experimental/src/grammar/parsing/common/Substitute.h
@@ -18,7 +18,7 @@ namespace parsing {
 
 class Substitute {
 public:
-	static void substitute ( const grammar::CFG < > & orig, grammar::CFG < > & res, const DefaultSymbolType & origLHS, const ext::vector < DefaultSymbolType > & origRHS, ext::vector < DefaultSymbolType >::const_iterator nonterminal );
+	static void substitute ( const grammar::CFG < > & orig, grammar::CFG < > & res, const DefaultSymbolType & origLHS, const ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > & origRHS, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >::const_iterator nonterminal );
 
 };
 
diff --git a/alib2algo_experimental/test-src/grammar/parsing/CornerSubstitution.cpp b/alib2algo_experimental/test-src/grammar/parsing/CornerSubstitution.cpp
index 45117d1895..cc38e87bbe 100644
--- a/alib2algo_experimental/test-src/grammar/parsing/CornerSubstitution.cpp
+++ b/alib2algo_experimental/test-src/grammar/parsing/CornerSubstitution.cpp
@@ -28,12 +28,12 @@ void CornerSubstitution::testCornerSubstitution ( ) {
 	grammar.setNonterminalAlphabet ( { A, B, C } );
 	grammar.setInitialSymbol ( A );
 
-	grammar.addRule ( A, ext::vector < DefaultSymbolType > { a, B } );
-	grammar.addRule ( A, ext::vector < DefaultSymbolType > { C, B } );
-	grammar.addRule ( B, ext::vector < DefaultSymbolType > { c, B } );
-	grammar.addRule ( B, ext::vector < DefaultSymbolType > { d } );
-	grammar.addRule ( C, ext::vector < DefaultSymbolType > { a, C } );
-	grammar.addRule ( C, ext::vector < DefaultSymbolType > { b, B } );
+	grammar.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, B } );
+	grammar.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { C, B } );
+	grammar.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, B } );
+	grammar.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { d } );
+	grammar.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C } );
+	grammar.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, B } );
 
 	grammar::CFG < > res = grammar;
 	grammar::parsing::CornerSubstitution::cornerSubstitution ( res, a, A );
@@ -44,13 +44,13 @@ void CornerSubstitution::testCornerSubstitution ( ) {
 	comp.setNonterminalAlphabet ( { A, B, C } );
 	comp.setInitialSymbol ( A );
 
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { a, B } );
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { a, C, B } );
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { b, B, B } );
-	comp.addRule ( B, ext::vector < DefaultSymbolType > { c, B } );
-	comp.addRule ( B, ext::vector < DefaultSymbolType > { d } );
-	comp.addRule ( C, ext::vector < DefaultSymbolType > { a, C } );
-	comp.addRule ( C, ext::vector < DefaultSymbolType > { b, B } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, B } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C, B } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, B, B } );
+	comp.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, B } );
+	comp.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { d } );
+	comp.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C } );
+	comp.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, B } );
 
 //	std::cout << res << std::endl << comp << std::endl;
 
@@ -73,12 +73,12 @@ void CornerSubstitution::testCornerSubstitution2 ( ) {
 	grammar.setNonterminalAlphabet ( { A, B, C } );
 	grammar.setInitialSymbol ( A );
 
-	grammar.addRule ( A, ext::vector < DefaultSymbolType > { a, B } );
-	grammar.addRule ( A, ext::vector < DefaultSymbolType > { C, B } );
-	grammar.addRule ( B, ext::vector < DefaultSymbolType > { c, B } );
-	grammar.addRule ( B, ext::vector < DefaultSymbolType > { a } );
-	grammar.addRule ( C, ext::vector < DefaultSymbolType > { a, C } );
-	grammar.addRule ( C, ext::vector < DefaultSymbolType > { B, b } );
+	grammar.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, B } );
+	grammar.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { C, B } );
+	grammar.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, B } );
+	grammar.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a } );
+	grammar.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C } );
+	grammar.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { B, b } );
 
 	grammar::CFG < > res = grammar;
 	grammar::parsing::CornerSubstitution::cornerSubstitution ( res, a, A );
@@ -90,14 +90,14 @@ void CornerSubstitution::testCornerSubstitution2 ( ) {
 	comp.setNonterminalAlphabet ( { A, B, C } );
 	comp.setInitialSymbol ( A );
 
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { a, B } );
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { a, C, B } );
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { a, b, B } );
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { c, B, b, B } );
-	comp.addRule ( B, ext::vector < DefaultSymbolType > { c, B } );
-	comp.addRule ( B, ext::vector < DefaultSymbolType > { a } );
-	comp.addRule ( C, ext::vector < DefaultSymbolType > { a, C } );
-	comp.addRule ( C, ext::vector < DefaultSymbolType > { B, b } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, B } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C, B } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, b, B } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, B, b, B } );
+	comp.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, B } );
+	comp.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a } );
+	comp.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C } );
+	comp.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { B, b } );
 
 //	std::cout << res << std::endl << comp << std::endl;
 
diff --git a/alib2algo_experimental/test-src/grammar/parsing/ExtractRightContext.cpp b/alib2algo_experimental/test-src/grammar/parsing/ExtractRightContext.cpp
index 4ec2ba8b92..ce3d159029 100644
--- a/alib2algo_experimental/test-src/grammar/parsing/ExtractRightContext.cpp
+++ b/alib2algo_experimental/test-src/grammar/parsing/ExtractRightContext.cpp
@@ -27,10 +27,10 @@ void ExtractRightContext::testExtractRightContext ( ) {
 	grammar.setNonterminalAlphabet ( { S, A, C } );
 	grammar.setInitialSymbol ( S );
 
-	grammar.addRule ( S, ext::vector < DefaultSymbolType > { b, c, A, C } );
-	grammar.addRule ( S, ext::vector < DefaultSymbolType > { b, b } );
-	grammar.addRule ( A, ext::vector < DefaultSymbolType > { } );
-	grammar.addRule ( A, ext::vector < DefaultSymbolType > { a, c, A, b } );
+	grammar.addRule ( S, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, c, A, C } );
+	grammar.addRule ( S, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, b } );
+	grammar.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { } );
+	grammar.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, c, A, b } );
 	grammar.addRule ( C, { a, b } );
 	grammar.addRule ( C, { c, C } );
 
@@ -43,13 +43,13 @@ void ExtractRightContext::testExtractRightContext ( ) {
 	comp.setNonterminalAlphabet ( { S, A, C } );
 	comp.setInitialSymbol ( S );
 
-	comp.addRule ( S, ext::vector < DefaultSymbolType > { b, c, A, a, b } );
-	comp.addRule ( S, ext::vector < DefaultSymbolType > { b, c, A, c, C } );
-	comp.addRule ( S, ext::vector < DefaultSymbolType > { b, b } );
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { } );
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { a, c, A, b } );
-	comp.addRule ( C, ext::vector < DefaultSymbolType > { a, b } );
-	comp.addRule ( C, ext::vector < DefaultSymbolType > { c, C } );
+	comp.addRule ( S, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, c, A, a, b } );
+	comp.addRule ( S, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, c, A, c, C } );
+	comp.addRule ( S, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, b } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, c, A, b } );
+	comp.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, b } );
+	comp.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, C } );
 
 	// std::cout << res << std::endl << comp << std::endl;
 
@@ -72,11 +72,11 @@ void ExtractRightContext::testExtractRightContext2 ( ) {
 	grammar.setNonterminalAlphabet ( { S, X, A, C } );
 	grammar.setInitialSymbol ( S );
 
-	grammar.addRule ( S, ext::vector < DefaultSymbolType > { b, c, X, C } );
-	grammar.addRule ( S, ext::vector < DefaultSymbolType > { b, b } );
-	grammar.addRule ( X, ext::vector < DefaultSymbolType > { b, A } );
-	grammar.addRule ( A, ext::vector < DefaultSymbolType > { } );
-	grammar.addRule ( A, ext::vector < DefaultSymbolType > { a, c, A, b } );
+	grammar.addRule ( S, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, c, X, C } );
+	grammar.addRule ( S, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, b } );
+	grammar.addRule ( X, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, A } );
+	grammar.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { } );
+	grammar.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, c, A, b } );
 	grammar.addRule ( C, { A, a, b } );
 	grammar.addRule ( C, { c, C } );
 
@@ -89,14 +89,14 @@ void ExtractRightContext::testExtractRightContext2 ( ) {
 	comp.setNonterminalAlphabet ( { S, X, A, C } );
 	comp.setInitialSymbol ( S );
 
-	comp.addRule ( S, ext::vector < DefaultSymbolType > { b, c, X, A, a, b } );
-	comp.addRule ( S, ext::vector < DefaultSymbolType > { b, c, X, c, C } );
-	comp.addRule ( S, ext::vector < DefaultSymbolType > { b, b } );
+	comp.addRule ( S, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, c, X, A, a, b } );
+	comp.addRule ( S, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, c, X, c, C } );
+	comp.addRule ( S, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, b } );
 	comp.addRule ( X, { b, A } );
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { } );
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { a, c, A, b } );
-	comp.addRule ( C, ext::vector < DefaultSymbolType > { A, a, b } );
-	comp.addRule ( C, ext::vector < DefaultSymbolType > { c, C } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, c, A, b } );
+	comp.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { A, a, b } );
+	comp.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, C } );
 
 	// std::cout << res << std::endl << comp << std::endl;
 
diff --git a/alib2algo_experimental/test-src/grammar/parsing/FirstTest.cpp b/alib2algo_experimental/test-src/grammar/parsing/FirstTest.cpp
index da5d72bbfd..64da2b9aa4 100644
--- a/alib2algo_experimental/test-src/grammar/parsing/FirstTest.cpp
+++ b/alib2algo_experimental/test-src/grammar/parsing/FirstTest.cpp
@@ -29,52 +29,41 @@ void FirstTest::testFirst ( ) {
 		grammar.setTerminalAlphabet ( ext::set < DefaultSymbolType > { tP, tS, tL, tR, tA } );
 		grammar.setNonterminalAlphabet ( ext::set < DefaultSymbolType > { nE, nT, nF } );
 
-		{
-			ext::vector < DefaultSymbolType > rhsE1 ( { nE, tP, nT } );
-			ext::vector < DefaultSymbolType > rhsE2 ( { nT } );
-			ext::vector < DefaultSymbolType > rhsT1 ( { nT, tS, nF } );
-			ext::vector < DefaultSymbolType > rhsT2 ( { nF } );
-			ext::vector < DefaultSymbolType > rhsF1 ( { tA } );
-			ext::vector < DefaultSymbolType > rhsF2 ( { tL, nE, tR } );
-
-			grammar.addRule ( nE, rhsE1 );
-			grammar.addRule ( nE, rhsE2 );
-			grammar.addRule ( nT, rhsT1 );
-			grammar.addRule ( nT, rhsT2 );
-			grammar.addRule ( nF, rhsF1 );
-			grammar.addRule ( nF, rhsF2 );
-		}
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsE1 ( { nE, tP, nT } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsE2 ( { nT } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsT1 ( { nT, tS, nF } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsT2 ( { nF } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsF1 ( { tA } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsF2 ( { tL, nE, tR } );
+
+		grammar.addRule ( nE, rhsE1 );
+		grammar.addRule ( nE, rhsE2 );
+		grammar.addRule ( nT, rhsT1 );
+		grammar.addRule ( nT, rhsT2 );
+		grammar.addRule ( nF, rhsF1 );
+		grammar.addRule ( nF, rhsF2 );
 
 		 // --------------------------------------------------
 		ext::map < ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >, ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > first;
 
-		{
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsE1 ( { nE, tP, nT } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsE2 ( { nT } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsT1 ( { nT, tS, nF } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsT2 ( { nF } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsF1 ( { tA } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsF2 ( { tL, nE, tR } );
-
-			first[rhsE1] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
-				tA, tL
-			};
-			first[rhsE2] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
-				tA, tL
-			};
-			first[rhsT1] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
-				tA, tL
-			};
-			first[rhsT2] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
-				tA, tL
-			};
-			first[rhsF1] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
-				tA
-			};
-			first[rhsF2] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
-				tL
-			};
-		}
+		first[rhsE1] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
+			tA, tL
+		};
+		first[rhsE2] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
+			tA, tL
+		};
+		first[rhsT1] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
+			tA, tL
+		};
+		first[rhsT2] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
+			tA, tL
+		};
+		first[rhsF1] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
+			tA
+		};
+		first[rhsF2] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
+			tL
+		};
 
 		// --------------------------------------------------
 
@@ -106,100 +95,81 @@ void FirstTest::testFirst ( ) {
 		grammar.setTerminalAlphabet ( ext::set < DefaultSymbolType > { tA, tB, tC, tD, tE } );
 		grammar.setNonterminalAlphabet ( ext::set < DefaultSymbolType > { nS, nA, nB, nC, nD, nE, nF } );
 
-		{
-			ext::vector < DefaultSymbolType > rhsS1 ( { nB, tD, nS } );
-			ext::vector < DefaultSymbolType > rhsS2 ( { tD, tD, nC } );
-			ext::vector < DefaultSymbolType > rhsS3 ( { tC, nA } );
-			ext::vector < DefaultSymbolType > rhsA1 ( { tA, tE, nE } );
-			ext::vector < DefaultSymbolType > rhsA2 ( { tB, tB, nE } );
-			ext::vector < DefaultSymbolType > rhsB1 ( { tA, nF } );
-			ext::vector < DefaultSymbolType > rhsB2 ( { tB, tB, nD } );
-			ext::vector < DefaultSymbolType > rhsC1 ( { tA, nB, tD } );
-			ext::vector < DefaultSymbolType > rhsC2 ( { tE, nA } );
-			ext::vector < DefaultSymbolType > rhsD1 ( { tC, tA, nF } );
-			ext::vector < DefaultSymbolType > rhsE1 ( { tC, tA, tE, nE } );
-			ext::vector < DefaultSymbolType > rhsE2 ( { } );
-			ext::vector < DefaultSymbolType > rhsF1 ( { tE, nD } );
-			ext::vector < DefaultSymbolType > rhsF2 ( { } );
-
-			grammar.addRule ( nS, rhsS1 );
-			grammar.addRule ( nS, rhsS2 );
-			grammar.addRule ( nS, rhsS3 );
-			grammar.addRule ( nA, rhsA1 );
-			grammar.addRule ( nA, rhsA2 );
-			grammar.addRule ( nB, rhsB1 );
-			grammar.addRule ( nB, rhsB2 );
-			grammar.addRule ( nC, rhsC1 );
-			grammar.addRule ( nC, rhsC2 );
-			grammar.addRule ( nD, rhsD1 );
-			grammar.addRule ( nE, rhsE1 );
-			grammar.addRule ( nE, rhsE2 );
-			grammar.addRule ( nF, rhsF1 );
-			grammar.addRule ( nF, rhsF2 );
-		}
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsS1 ( { nB, tD, nS } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsS2 ( { tD, tD, nC } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsS3 ( { tC, nA } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsA1 ( { tA, tE, nE } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsA2 ( { tB, tB, nE } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsB1 ( { tA, nF } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsB2 ( { tB, tB, nD } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsC1 ( { tA, nB, tD } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsC2 ( { tE, nA } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsD1 ( { tC, tA, nF } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsE1 ( { tC, tA, tE, nE } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsE2 ( { } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsF1 ( { tE, nD } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsF2 ( { } );
+
+		grammar.addRule ( nS, rhsS1 );
+		grammar.addRule ( nS, rhsS2 );
+		grammar.addRule ( nS, rhsS3 );
+		grammar.addRule ( nA, rhsA1 );
+		grammar.addRule ( nA, rhsA2 );
+		grammar.addRule ( nB, rhsB1 );
+		grammar.addRule ( nB, rhsB2 );
+		grammar.addRule ( nC, rhsC1 );
+		grammar.addRule ( nC, rhsC2 );
+		grammar.addRule ( nD, rhsD1 );
+		grammar.addRule ( nE, rhsE1 );
+		grammar.addRule ( nE, rhsE2 );
+		grammar.addRule ( nF, rhsF1 );
+		grammar.addRule ( nF, rhsF2 );
 
 		 // --------------------------------------------------
 		ext::map < ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >, ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > first;
 
-		{
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsS1 ( { nB, tD, nS } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsS2 ( { tD, tD, nC } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsS3 ( { tC, nA } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsA1 ( { tA, tE, nE } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsA2 ( { tB, tB, nE } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsB1 ( { tA, nF } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsB2 ( { tB, tB, nD } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsC1 ( { tA, nB, tD } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsC2 ( { tE, nA } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsD1 ( { tC, tA, nF } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsE1 ( { tC, tA, tE, nE } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsE2 ( { } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsF1 ( { tE, nD } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsF2 ( { } );
-
-			first[rhsS1] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
-				tA, tB
-			};
-			first[rhsS2] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
-				tD
-			};
-			first[rhsS3] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
-				tC
-			};
-			first[rhsA1] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
-				tA
-			};
-			first[rhsA2] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
-				tB
-			};
-			first[rhsB1] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
-				tA
-			};
-			first[rhsB2] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
-				tB
-			};
-			first[rhsC1] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
-				tA
-			};
-			first[rhsC2] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
-				tE
-			};
-			first[rhsD1] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
-				tC
-			};
-			first[rhsE1] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
-				tC
-			};
-			first[rhsE2] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
-				string::Epsilon < >::EPSILON
-			};
-			first[rhsF1] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
-				tE
-			};
-			first[rhsF2] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
-				string::Epsilon < >::EPSILON
-			};
-		}
+		first[rhsS1] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
+			tA, tB
+		};
+		first[rhsS2] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
+			tD
+		};
+		first[rhsS3] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
+			tC
+		};
+		first[rhsA1] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
+			tA
+		};
+		first[rhsA2] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
+			tB
+		};
+		first[rhsB1] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
+			tA
+		};
+		first[rhsB2] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
+			tB
+		};
+		first[rhsC1] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
+			tA
+		};
+		first[rhsC2] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
+			tE
+		};
+		first[rhsD1] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
+			tC
+		};
+		first[rhsE1] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
+			tC
+		};
+		first[rhsE2] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
+			string::Epsilon < >::EPSILON
+		};
+		first[rhsF1] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
+			tE
+		};
+		first[rhsF2] = ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > {
+			string::Epsilon < >::EPSILON
+		};
 		// --------------------------------------------------
 
 		ext::map < ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >, ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > firstAlgo;
@@ -223,8 +193,8 @@ void FirstTest::testFirst2 ( ) {
 	grammar.setNonterminalAlphabet ( { { A } } );
 	grammar.setInitialSymbol ( A );
 
-	grammar.addRule ( A, ext::vector < DefaultSymbolType > { A, c } );
-	grammar.addRule ( A, ext::vector < DefaultSymbolType > { d } );
+	grammar.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { A, c } );
+	grammar.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { d } );
 
 	ext::map < ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >, ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > res = { { { d }, { d } }, { { A, c }, { d } } };
 	CPPUNIT_ASSERT ( res == grammar::parsing::First::first ( grammar ) );
@@ -246,12 +216,12 @@ void FirstTest::testFirst3 ( ) {
 	grammar.setNonterminalAlphabet ( { { S, A, B } } );
 	grammar.setInitialSymbol ( S );
 
-	grammar.addRule ( S, ext::vector < DefaultSymbolType > { A, a } );
-	grammar.addRule ( S, ext::vector < DefaultSymbolType > { b, S } );
-	grammar.addRule ( A, ext::vector < DefaultSymbolType > { c, A, d } );
-	grammar.addRule ( A, ext::vector < DefaultSymbolType > { B } );
-	grammar.addRule ( B, ext::vector < DefaultSymbolType > { f, S } );
-	grammar.addRule ( B, ext::vector < DefaultSymbolType > { } );
+	grammar.addRule ( S, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { A, a } );
+	grammar.addRule ( S, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, S } );
+	grammar.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, A, d } );
+	grammar.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { B } );
+	grammar.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { f, S } );
+	grammar.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { } );
 
 	ext::map < ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > >, ext::set < ext::variant < DefaultSymbolType, string::Epsilon < > > > > res =
 	{
diff --git a/alib2algo_experimental/test-src/grammar/parsing/FollowTest.cpp b/alib2algo_experimental/test-src/grammar/parsing/FollowTest.cpp
index 384615b4ac..b0eb04c7a2 100644
--- a/alib2algo_experimental/test-src/grammar/parsing/FollowTest.cpp
+++ b/alib2algo_experimental/test-src/grammar/parsing/FollowTest.cpp
@@ -29,12 +29,12 @@ void FollowTest::testFollow ( ) {
 		grammar.setTerminalAlphabet ( ext::set < DefaultSymbolType > { tP, tS, tL, tR, tA } );
 		grammar.setNonterminalAlphabet ( ext::set < DefaultSymbolType > { nE, nT, nF } );
 
-		ext::vector < DefaultSymbolType > rhsE1 ( { nE, tP, nT } );
-		ext::vector < DefaultSymbolType > rhsE2 ( { nT } );
-		ext::vector < DefaultSymbolType > rhsT1 ( { nT, tS, nF } );
-		ext::vector < DefaultSymbolType > rhsT2 ( { nF } );
-		ext::vector < DefaultSymbolType > rhsF1 ( { tA } );
-		ext::vector < DefaultSymbolType > rhsF2 ( { tL, nE, tR } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsE1 ( { nE, tP, nT } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsE2 ( { nT } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsT1 ( { nT, tS, nF } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsT2 ( { nF } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsF1 ( { tA } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsF2 ( { tL, nE, tR } );
 
 		grammar.addRule ( nE, rhsE1 );
 		grammar.addRule ( nE, rhsE2 );
@@ -87,20 +87,20 @@ void FollowTest::testFollow ( ) {
 		grammar.setTerminalAlphabet ( ext::set < DefaultSymbolType > { tA, tB, tC, tD, tE } );
 		grammar.setNonterminalAlphabet ( ext::set < DefaultSymbolType > { nS, nA, nB, nC, nD, nE, nF } );
 
-		ext::vector < DefaultSymbolType > rhsS1 ( { nB, tD, nS } );
-		ext::vector < DefaultSymbolType > rhsS2 ( { tD, tD, nC } );
-		ext::vector < DefaultSymbolType > rhsS3 ( { tC, nA } );
-		ext::vector < DefaultSymbolType > rhsA1 ( { tA, tE, nE } );
-		ext::vector < DefaultSymbolType > rhsA2 ( { tB, tB, nE } );
-		ext::vector < DefaultSymbolType > rhsB1 ( { tA, nF } );
-		ext::vector < DefaultSymbolType > rhsB2 ( { tB, tB, nD } );
-		ext::vector < DefaultSymbolType > rhsC1 ( { tA, nB, tD } );
-		ext::vector < DefaultSymbolType > rhsC2 ( { tE, nA } );
-		ext::vector < DefaultSymbolType > rhsD1 ( { tC, tA, nF } );
-		ext::vector < DefaultSymbolType > rhsE1 ( { tC, tA, tE, nE } );
-		ext::vector < DefaultSymbolType > rhsE2 ( { } );
-		ext::vector < DefaultSymbolType > rhsF1 ( { tE, nD } );
-		ext::vector < DefaultSymbolType > rhsF2 ( { } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsS1 ( { nB, tD, nS } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsS2 ( { tD, tD, nC } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsS3 ( { tC, nA } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsA1 ( { tA, tE, nE } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsA2 ( { tB, tB, nE } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsB1 ( { tA, nF } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsB2 ( { tB, tB, nD } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsC1 ( { tA, nB, tD } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsC2 ( { tE, nA } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsD1 ( { tC, tA, nF } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsE1 ( { tC, tA, tE, nE } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsE2 ( { } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsF1 ( { tE, nD } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsF2 ( { } );
 
 		grammar.addRule ( nS, rhsS1 );
 		grammar.addRule ( nS, rhsS2 );
diff --git a/alib2algo_experimental/test-src/grammar/parsing/HandleFirstFirstConflict.cpp b/alib2algo_experimental/test-src/grammar/parsing/HandleFirstFirstConflict.cpp
index 52eef65ed1..1f7cb3daab 100644
--- a/alib2algo_experimental/test-src/grammar/parsing/HandleFirstFirstConflict.cpp
+++ b/alib2algo_experimental/test-src/grammar/parsing/HandleFirstFirstConflict.cpp
@@ -29,12 +29,12 @@ void HandleFirstFirstConflict::testHandleFirstFirstConflict ( ) {
 	grammar.setNonterminalAlphabet ( { A, B, C } );
 	grammar.setInitialSymbol ( A );
 
-	grammar.addRule ( A, ext::vector < DefaultSymbolType > { a, B } );
-	grammar.addRule ( A, ext::vector < DefaultSymbolType > { C, B } );
-	grammar.addRule ( B, ext::vector < DefaultSymbolType > { c, B } );
-	grammar.addRule ( B, ext::vector < DefaultSymbolType > { d } );
-	grammar.addRule ( C, ext::vector < DefaultSymbolType > { a, C } );
-	grammar.addRule ( C, ext::vector < DefaultSymbolType > { b, B } );
+	grammar.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, B } );
+	grammar.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { C, B } );
+	grammar.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, B } );
+	grammar.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { d } );
+	grammar.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C } );
+	grammar.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, B } );
 
 	grammar::CFG < > res = grammar;
 	grammar::parsing::HandleFirstFirstConflict::handleFirstFirstConflict ( res, a, A, { {a, B }, {C ,B} } );
@@ -45,13 +45,13 @@ void HandleFirstFirstConflict::testHandleFirstFirstConflict ( ) {
 	comp.setNonterminalAlphabet ( { A, B, C } );
 	comp.setInitialSymbol ( A );
 
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { a, B } );
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { a, C, B } );
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { b, B, B } );
-	comp.addRule ( B, ext::vector < DefaultSymbolType > { c, B } );
-	comp.addRule ( B, ext::vector < DefaultSymbolType > { d } );
-	comp.addRule ( C, ext::vector < DefaultSymbolType > { a, C } );
-	comp.addRule ( C, ext::vector < DefaultSymbolType > { b, B } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, B } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C, B } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, B, B } );
+	comp.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, B } );
+	comp.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { d } );
+	comp.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C } );
+	comp.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, B } );
 
 //	std::cout << res << std::endl << comp << std::endl;
 
@@ -65,14 +65,14 @@ void HandleFirstFirstConflict::testHandleFirstFirstConflict ( ) {
 	comp2.setNonterminalAlphabet ( { A, Ap, B, C } );
 	comp2.setInitialSymbol ( A );
 
-	comp2.addRule ( A, ext::vector < DefaultSymbolType > { a, Ap } );
-	comp2.addRule ( A, ext::vector < DefaultSymbolType > { b, B, B } );
-	comp2.addRule ( Ap, ext::vector < DefaultSymbolType > { B } );
-	comp2.addRule ( Ap, ext::vector < DefaultSymbolType > { C, B } );
-	comp2.addRule ( B, ext::vector < DefaultSymbolType > { c, B } );
-	comp2.addRule ( B, ext::vector < DefaultSymbolType > { d } );
-	comp2.addRule ( C, ext::vector < DefaultSymbolType > { a, C } );
-	comp2.addRule ( C, ext::vector < DefaultSymbolType > { b, B } );
+	comp2.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, Ap } );
+	comp2.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, B, B } );
+	comp2.addRule ( Ap, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { B } );
+	comp2.addRule ( Ap, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { C, B } );
+	comp2.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, B } );
+	comp2.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { d } );
+	comp2.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C } );
+	comp2.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, B } );
 
 //	std::cout << res << std::endl << comp2 << std::endl;
 
@@ -96,12 +96,12 @@ void HandleFirstFirstConflict::testHandleFirstFirstConflict2 ( ) {
 	grammar.setNonterminalAlphabet ( { A, B, C } );
 	grammar.setInitialSymbol ( A );
 
-	grammar.addRule ( A, ext::vector < DefaultSymbolType > { a, B } );
-	grammar.addRule ( A, ext::vector < DefaultSymbolType > { C, B } );
-	grammar.addRule ( B, ext::vector < DefaultSymbolType > { c, B } );
-	grammar.addRule ( B, ext::vector < DefaultSymbolType > { a } );
-	grammar.addRule ( C, ext::vector < DefaultSymbolType > { a, C } );
-	grammar.addRule ( C, ext::vector < DefaultSymbolType > { B, b } );
+	grammar.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, B } );
+	grammar.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { C, B } );
+	grammar.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, B } );
+	grammar.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a } );
+	grammar.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C } );
+	grammar.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { B, b } );
 
 	grammar::CFG < > res = grammar;
 	grammar::parsing::HandleFirstFirstConflict::handleFirstFirstConflict ( res, a, A, { {a, B}, {C, B}});
@@ -113,14 +113,14 @@ void HandleFirstFirstConflict::testHandleFirstFirstConflict2 ( ) {
 	comp.setNonterminalAlphabet ( { A, B, C } );
 	comp.setInitialSymbol ( A );
 
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { a, B } );
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { a, C, B } );
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { a, b, B } );
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { c, B, b, B } );
-	comp.addRule ( B, ext::vector < DefaultSymbolType > { c, B } );
-	comp.addRule ( B, ext::vector < DefaultSymbolType > { a } );
-	comp.addRule ( C, ext::vector < DefaultSymbolType > { a, C } );
-	comp.addRule ( C, ext::vector < DefaultSymbolType > { B, b } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, B } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C, B } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, b, B } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, B, b, B } );
+	comp.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, B } );
+	comp.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a } );
+	comp.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C } );
+	comp.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { B, b } );
 
 //	std::cout << res << std::endl << comp << std::endl;
 
@@ -134,15 +134,15 @@ void HandleFirstFirstConflict::testHandleFirstFirstConflict2 ( ) {
 	comp2.setNonterminalAlphabet ( { A, Ap, B, C } );
 	comp2.setInitialSymbol ( A );
 
-	comp2.addRule ( A, ext::vector < DefaultSymbolType > { a, Ap } );
-	comp2.addRule ( A, ext::vector < DefaultSymbolType > { c, B, b, B } );
-	comp2.addRule ( Ap, ext::vector < DefaultSymbolType > { B } );
-	comp2.addRule ( Ap, ext::vector < DefaultSymbolType > { C, B } );
-	comp2.addRule ( Ap, ext::vector < DefaultSymbolType > { b, B } );
-	comp2.addRule ( B, ext::vector < DefaultSymbolType > { c, B } );
-	comp2.addRule ( B, ext::vector < DefaultSymbolType > { a } );
-	comp2.addRule ( C, ext::vector < DefaultSymbolType > { a, C } );
-	comp2.addRule ( C, ext::vector < DefaultSymbolType > { B, b } );
+	comp2.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, Ap } );
+	comp2.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, B, b, B } );
+	comp2.addRule ( Ap, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { B } );
+	comp2.addRule ( Ap, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { C, B } );
+	comp2.addRule ( Ap, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, B } );
+	comp2.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, B } );
+	comp2.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a } );
+	comp2.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C } );
+	comp2.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { B, b } );
 
 //	std::cout << res << std::endl << comp2 << std::endl;
 
diff --git a/alib2algo_experimental/test-src/grammar/parsing/HandleFirstFollowConflict.cpp b/alib2algo_experimental/test-src/grammar/parsing/HandleFirstFollowConflict.cpp
index cd1ca80f58..17ff67d5fc 100644
--- a/alib2algo_experimental/test-src/grammar/parsing/HandleFirstFollowConflict.cpp
+++ b/alib2algo_experimental/test-src/grammar/parsing/HandleFirstFollowConflict.cpp
@@ -32,12 +32,12 @@ void HandleFirstFollowConflict::testHandleFirstFollowConflict ( ) {
 	grammar.setNonterminalAlphabet ( { A, B, C } );
 	grammar.setInitialSymbol ( A );
 
-	grammar.addRule ( A, ext::vector < DefaultSymbolType > { a, B, C } );
-	grammar.addRule ( A, ext::vector < DefaultSymbolType > { c, C } );
-	grammar.addRule ( B, ext::vector < DefaultSymbolType > { a, B, a, d } );
-	grammar.addRule ( B, ext::vector < DefaultSymbolType > { } );
-	grammar.addRule ( C, ext::vector < DefaultSymbolType > { a, C } );
-	grammar.addRule ( C, ext::vector < DefaultSymbolType > { b, B } );
+	grammar.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, B, C } );
+	grammar.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, C } );
+	grammar.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, B, a, d } );
+	grammar.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { } );
+	grammar.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C } );
+	grammar.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, B } );
 
 	grammar::CFG < > res = grammar;
 	grammar::parsing::HandleFirstFollowConflict::handleFirstFollowConflict ( res, a, B, { { a, B, C }, { } } );
@@ -48,13 +48,13 @@ void HandleFirstFollowConflict::testHandleFirstFollowConflict ( ) {
 	comp.setNonterminalAlphabet ( { A, B, C } );
 	comp.setInitialSymbol ( A );
 
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { a, B, a, C } );
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { a, B, b, B } );
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { c, C } );
-	comp.addRule ( B, ext::vector < DefaultSymbolType > { a, B, a, d } );
-	comp.addRule ( B, ext::vector < DefaultSymbolType > { } );
-	comp.addRule ( C, ext::vector < DefaultSymbolType > { a, C } );
-	comp.addRule ( C, ext::vector < DefaultSymbolType > { b, B } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, B, a, C } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, B, b, B } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, C } );
+	comp.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, B, a, d } );
+	comp.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { } );
+	comp.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C } );
+	comp.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, B } );
 
 //	std::cout << "res " << alib::StringDataFactory::toString ( grammar::Grammar ( res ) ) << std::endl << "comp " << alib::StringDataFactory::toString ( grammar::Grammar ( comp ) ) << std::endl;
 
@@ -68,15 +68,15 @@ void HandleFirstFollowConflict::testHandleFirstFollowConflict ( ) {
 	comp2.setNonterminalAlphabet ( { A, B, Ba, C } );
 	comp2.setInitialSymbol ( A );
 
-	comp2.addRule ( A, ext::vector < DefaultSymbolType > { a, Ba, C } );
-	comp2.addRule ( A, ext::vector < DefaultSymbolType > { a, B, b, B } );
-	comp2.addRule ( A, ext::vector < DefaultSymbolType > { c, C } );
-	comp2.addRule ( B, ext::vector < DefaultSymbolType > { a, Ba, d } );
-	comp2.addRule ( B, ext::vector < DefaultSymbolType > { } );
-	comp2.addRule ( Ba, ext::vector < DefaultSymbolType > { a, Ba, d, a } );
-	comp2.addRule ( Ba, ext::vector < DefaultSymbolType > { a } );
-	comp2.addRule ( C, ext::vector < DefaultSymbolType > { a, C } );
-	comp2.addRule ( C, ext::vector < DefaultSymbolType > { b, B } );
+	comp2.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, Ba, C } );
+	comp2.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, B, b, B } );
+	comp2.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, C } );
+	comp2.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, Ba, d } );
+	comp2.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { } );
+	comp2.addRule ( Ba, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, Ba, d, a } );
+	comp2.addRule ( Ba, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a } );
+	comp2.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C } );
+	comp2.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, B } );
 
 //	std::cout << "res2 " << alib::StringDataFactory::toString ( grammar::Grammar ( res ) ) << std::endl << "comp2 " << alib::StringDataFactory::toString ( grammar::Grammar ( comp2 ) ) << std::endl;
 
@@ -103,13 +103,13 @@ void HandleFirstFollowConflict::testHandleFirstFollowConflict2 ( ) {
 	grammar.setNonterminalAlphabet ( { A, B, C, X } );
 	grammar.setInitialSymbol ( A );
 
-	grammar.addRule ( A, ext::vector < DefaultSymbolType > { a, X, C, a } );
-	grammar.addRule ( A, ext::vector < DefaultSymbolType > { c, C } );
+	grammar.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, X, C, a } );
+	grammar.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, C } );
 	grammar.addRule ( X, { c, B });
-	grammar.addRule ( B, ext::vector < DefaultSymbolType > { a, B, a, d } );
-	grammar.addRule ( B, ext::vector < DefaultSymbolType > { } );
-	grammar.addRule ( C, ext::vector < DefaultSymbolType > { a, C } );
-	grammar.addRule ( C, ext::vector < DefaultSymbolType > { b, B, c } );
+	grammar.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, B, a, d } );
+	grammar.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { } );
+	grammar.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C } );
+	grammar.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, B, c } );
 
 	grammar::CFG < > res = grammar;
 	grammar::parsing::HandleFirstFollowConflict::handleFirstFollowConflict ( res, a, B, { { a, B, C }, { } } );
@@ -120,14 +120,14 @@ void HandleFirstFollowConflict::testHandleFirstFollowConflict2 ( ) {
 	comp.setNonterminalAlphabet ( { A, B, C, X } );
 	comp.setInitialSymbol ( A );
 
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { a, X, a, C, a } );
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { a, X, b, B, c, a } );
-	comp.addRule ( A, ext::vector < DefaultSymbolType > { c, C } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, X, a, C, a } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, X, b, B, c, a } );
+	comp.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, C } );
 	comp.addRule ( X, { c, B } );
-	comp.addRule ( B, ext::vector < DefaultSymbolType > { a, B, a, d } );
-	comp.addRule ( B, ext::vector < DefaultSymbolType > { } );
-	comp.addRule ( C, ext::vector < DefaultSymbolType > { a, C } );
-	comp.addRule ( C, ext::vector < DefaultSymbolType > { b, B, c } );
+	comp.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, B, a, d } );
+	comp.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { } );
+	comp.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C } );
+	comp.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, B, c } );
 
 //	std::cout << "res " << alib::StringDataFactory::toString ( grammar::Grammar ( res ) ) << std::endl << "comp " << alib::StringDataFactory::toString ( grammar::Grammar ( comp ) ) << std::endl;
 
@@ -141,17 +141,17 @@ void HandleFirstFollowConflict::testHandleFirstFollowConflict2 ( ) {
 	comp2.setNonterminalAlphabet ( { A, B, Ba, C, X, Xa } );
 	comp2.setInitialSymbol ( A );
 
-	comp2.addRule ( A, ext::vector < DefaultSymbolType > { a, Xa, C, a } );
-	comp2.addRule ( A, ext::vector < DefaultSymbolType > { a, X, b, B, c, a } );
-	comp2.addRule ( A, ext::vector < DefaultSymbolType > { c, C } );
+	comp2.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, Xa, C, a } );
+	comp2.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, X, b, B, c, a } );
+	comp2.addRule ( A, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, C } );
 	comp2.addRule ( X, { c, B } );
 	comp2.addRule ( Xa, { c, Ba } );
-	comp2.addRule ( B, ext::vector < DefaultSymbolType > { a, Ba, d } );
-	comp2.addRule ( B, ext::vector < DefaultSymbolType > { } );
-	comp2.addRule ( Ba, ext::vector < DefaultSymbolType > { a, Ba, d, a } );
-	comp2.addRule ( Ba, ext::vector < DefaultSymbolType > { a } );
-	comp2.addRule ( C, ext::vector < DefaultSymbolType > { a, C } );
-	comp2.addRule ( C, ext::vector < DefaultSymbolType > { b, B, c } );
+	comp2.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, Ba, d } );
+	comp2.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { } );
+	comp2.addRule ( Ba, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, Ba, d, a } );
+	comp2.addRule ( Ba, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a } );
+	comp2.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C } );
+	comp2.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, B, c } );
 
 //	std::cout << "res2 " << alib::StringDataFactory::toString ( grammar::Grammar ( res ) ) << std::endl << "comp2 " << alib::StringDataFactory::toString ( grammar::Grammar ( comp2 ) ) << std::endl;
 
diff --git a/alib2algo_experimental/test-src/grammar/parsing/LL1ParseTable.cpp b/alib2algo_experimental/test-src/grammar/parsing/LL1ParseTable.cpp
index 17484041bb..3242e53926 100644
--- a/alib2algo_experimental/test-src/grammar/parsing/LL1ParseTable.cpp
+++ b/alib2algo_experimental/test-src/grammar/parsing/LL1ParseTable.cpp
@@ -31,57 +31,44 @@ void LL1ParseTable::testLL1Table ( ) {
 		grammar.setTerminalAlphabet ( ext::set < DefaultSymbolType > { tP, tS, tL, tR, tA } );
 		grammar.setNonterminalAlphabet ( ext::set < DefaultSymbolType > { nE, nEp, nT, nTp, nF } );
 
-		{
-			ext::vector < DefaultSymbolType > rhsE1 ( { nT, nEp } );
-			ext::vector < DefaultSymbolType > rhsEp1 ( { tP, nT, nEp } );
-			ext::vector < DefaultSymbolType > rhsEp2 ( { } );
-			ext::vector < DefaultSymbolType > rhsT1 ( { nF, nTp } );
-			ext::vector < DefaultSymbolType > rhsTp1 ( { tS, nF, nTp } );
-			ext::vector < DefaultSymbolType > rhsTp2 ( { } );
-			ext::vector < DefaultSymbolType > rhsF1 ( { tA } );
-			ext::vector < DefaultSymbolType > rhsF2 ( { tL, nE, tR } );
-
-			grammar.addRule ( nE, rhsE1 );
-			grammar.addRule ( nEp, rhsEp1 );
-			grammar.addRule ( nEp, rhsEp2 );
-			grammar.addRule ( nT, rhsT1 );
-			grammar.addRule ( nTp, rhsTp1 );
-			grammar.addRule ( nTp, rhsTp2 );
-			grammar.addRule ( nF, rhsF1 );
-			grammar.addRule ( nF, rhsF2 );
-		}
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsE1 ( { nT, nEp } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsEp1 ( { tP, nT, nEp } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsEp2 ( { } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsT1 ( { nF, nTp } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsTp1 ( { tS, nF, nTp } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsTp2 ( { } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsF1 ( { tA } );
+		ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsF2 ( { tL, nE, tR } );
+
+		grammar.addRule ( nE, rhsE1 );
+		grammar.addRule ( nEp, rhsEp1 );
+		grammar.addRule ( nEp, rhsEp2 );
+		grammar.addRule ( nT, rhsT1 );
+		grammar.addRule ( nTp, rhsTp1 );
+		grammar.addRule ( nTp, rhsTp2 );
+		grammar.addRule ( nF, rhsF1 );
+		grammar.addRule ( nF, rhsF2 );
 
 		 // --------------------------------------------------
 		ext::map < ext::pair < ext::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, ext::set < ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > > parseTable;
 
-		{
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsE1 ( { nT, nEp } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsEp1 ( { tP, nT, nEp } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsEp2 ( { } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsT1 ( { nF, nTp } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsTp1 ( { tS, nF, nTp } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsTp2 ( { } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsF1 ( { tA } );
-			ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > rhsF2 ( { tL, nE, tR } );
-
-			parseTable[ext::make_pair ( tA, nE )].insert ( rhsE1 );
-			parseTable[ext::make_pair ( tL, nE )].insert ( rhsE1 );
-
-			parseTable[ext::make_pair ( tP, nEp )].insert ( rhsEp1 );
-			parseTable[ext::make_pair ( tR, nEp )].insert ( rhsEp2 );
-			parseTable[ext::make_pair ( string::Epsilon < >::EPSILON, nEp )].insert ( rhsEp2 );
-
-			parseTable[ext::make_pair ( tA, nT )].insert ( rhsT1 );
-			parseTable[ext::make_pair ( tL, nT )].insert ( rhsT1 );
-
-			parseTable[ext::make_pair ( tS, nTp )].insert ( rhsTp1 );
-			parseTable[ext::make_pair ( tP, nTp )].insert ( rhsTp2 );
-			parseTable[ext::make_pair ( tR, nTp )].insert ( rhsTp2 );
-			parseTable[ext::make_pair ( string::Epsilon < >::EPSILON, nTp )].insert ( rhsTp2 );
-
-			parseTable[ext::make_pair ( tA, nF )].insert ( rhsF1 );
-			parseTable[ext::make_pair ( tL, nF )].insert ( rhsF2 );
-		}
+		parseTable[ext::make_pair ( tA, nE )].insert ( rhsE1 );
+		parseTable[ext::make_pair ( tL, nE )].insert ( rhsE1 );
+
+		parseTable[ext::make_pair ( tP, nEp )].insert ( rhsEp1 );
+		parseTable[ext::make_pair ( tR, nEp )].insert ( rhsEp2 );
+		parseTable[ext::make_pair ( string::Epsilon < >::EPSILON, nEp )].insert ( rhsEp2 );
+
+		parseTable[ext::make_pair ( tA, nT )].insert ( rhsT1 );
+		parseTable[ext::make_pair ( tL, nT )].insert ( rhsT1 );
+
+		parseTable[ext::make_pair ( tS, nTp )].insert ( rhsTp1 );
+		parseTable[ext::make_pair ( tP, nTp )].insert ( rhsTp2 );
+		parseTable[ext::make_pair ( tR, nTp )].insert ( rhsTp2 );
+		parseTable[ext::make_pair ( string::Epsilon < >::EPSILON, nTp )].insert ( rhsTp2 );
+
+		parseTable[ext::make_pair ( tA, nF )].insert ( rhsF1 );
+		parseTable[ext::make_pair ( tL, nF )].insert ( rhsF2 );
 
 		// --------------------------------------------------
 
diff --git a/alib2algo_experimental/test-src/grammar/parsing/LR0Parser.cpp b/alib2algo_experimental/test-src/grammar/parsing/LR0Parser.cpp
index ed9f3b0e1b..457e4dda2b 100644
--- a/alib2algo_experimental/test-src/grammar/parsing/LR0Parser.cpp
+++ b/alib2algo_experimental/test-src/grammar/parsing/LR0Parser.cpp
@@ -304,48 +304,45 @@ void LR0Parser::testAutomaton ( ) {
 		}
 	};
 	
-	ext::vector < DefaultStateType > states;
-	for (const grammar::parsing::LR0Items & currentItems : items) {
-		states.emplace_back( DefaultStateType ( label::LR0ItemsLabel ( currentItems ) ) );
-	}
-	
-	automaton::DFA<> parsingAutomaton ( states[0] );
-	parsingAutomaton.addInputSymbols ( augmentedExpressionGrammar.getNonterminalAlphabet ( ) );
-	parsingAutomaton.addInputSymbols ( augmentedExpressionGrammar.getTerminalAlphabet ( ) );
+	automaton::DFA < ext::variant < DefaultSymbolType, DefaultSymbolType >, grammar::parsing::LR0Items > parsingAutomaton ( items[0] );
+	for ( const DefaultSymbolType & nonterminal : augmentedExpressionGrammar.getNonterminalAlphabet ( ) )
+		parsingAutomaton.addInputSymbol ( nonterminal );
+	for ( const DefaultSymbolType & terminal : augmentedExpressionGrammar.getTerminalAlphabet ( ) )
+		parsingAutomaton.addInputSymbol ( terminal );
 	
-	for (const DefaultStateType & state : states) {
+	for (const grammar::parsing::LR0Items & state : items) {
 		parsingAutomaton.addState(state);
 	}
 	
-	parsingAutomaton.addTransition(states[0], E, states[1]);
-	parsingAutomaton.addTransition(states[0], T, states[2]);
-	parsingAutomaton.addTransition(states[0], identifier, states[5]);
-	parsingAutomaton.addTransition(states[0], leftParenthesis, states[4]);
-	parsingAutomaton.addTransition(states[0], F, states[3]);
+	parsingAutomaton.addTransition(items[0], E, items[1]);
+	parsingAutomaton.addTransition(items[0], T, items[2]);
+	parsingAutomaton.addTransition(items[0], identifier, items[5]);
+	parsingAutomaton.addTransition(items[0], leftParenthesis, items[4]);
+	parsingAutomaton.addTransition(items[0], F, items[3]);
 
-	parsingAutomaton.addTransition(states[1], plus, states[6]);
+	parsingAutomaton.addTransition(items[1], plus, items[6]);
 	
-	parsingAutomaton.addTransition(states[2], times, states[7]);
+	parsingAutomaton.addTransition(items[2], times, items[7]);
 	
-	parsingAutomaton.addTransition(states[4], E, states[8]);
-	parsingAutomaton.addTransition(states[4], F, states[3]);
-	parsingAutomaton.addTransition(states[4], T, states[2]);
-	parsingAutomaton.addTransition(states[4], leftParenthesis, states[4]);
-	parsingAutomaton.addTransition(states[4], identifier, states[5]);
+	parsingAutomaton.addTransition(items[4], E, items[8]);
+	parsingAutomaton.addTransition(items[4], F, items[3]);
+	parsingAutomaton.addTransition(items[4], T, items[2]);
+	parsingAutomaton.addTransition(items[4], leftParenthesis, items[4]);
+	parsingAutomaton.addTransition(items[4], identifier, items[5]);
 	
-	parsingAutomaton.addTransition(states[6], T, states[9]);
-	parsingAutomaton.addTransition(states[6], F, states[3]);
-	parsingAutomaton.addTransition(states[6], leftParenthesis, states[4]);
-	parsingAutomaton.addTransition(states[6], identifier, states[5]);
+	parsingAutomaton.addTransition(items[6], T, items[9]);
+	parsingAutomaton.addTransition(items[6], F, items[3]);
+	parsingAutomaton.addTransition(items[6], leftParenthesis, items[4]);
+	parsingAutomaton.addTransition(items[6], identifier, items[5]);
 
-	parsingAutomaton.addTransition(states[7], F, states[10]);
-	parsingAutomaton.addTransition(states[7], leftParenthesis, states[4]);
-	parsingAutomaton.addTransition(states[7], identifier, states[5]);
+	parsingAutomaton.addTransition(items[7], F, items[10]);
+	parsingAutomaton.addTransition(items[7], leftParenthesis, items[4]);
+	parsingAutomaton.addTransition(items[7], identifier, items[5]);
 
-	parsingAutomaton.addTransition(states[8], rightParenthesis, states[11]);
-	parsingAutomaton.addTransition(states[8], plus, states[6]);
+	parsingAutomaton.addTransition(items[8], rightParenthesis, items[11]);
+	parsingAutomaton.addTransition(items[8], plus, items[6]);
 
-	parsingAutomaton.addTransition(states[9], times, states[7]);
+	parsingAutomaton.addTransition(items[9], times, items[7]);
 	
 	CPPUNIT_ASSERT ( grammar::parsing::LR0Parser::getAutomaton(getExpressionGrammar()) == parsingAutomaton );
 }
diff --git a/alib2algo_experimental/test-src/grammar/parsing/LRParser.cpp b/alib2algo_experimental/test-src/grammar/parsing/LRParser.cpp
index 1921562740..1d7c11cb71 100644
--- a/alib2algo_experimental/test-src/grammar/parsing/LRParser.cpp
+++ b/alib2algo_experimental/test-src/grammar/parsing/LRParser.cpp
@@ -52,7 +52,7 @@ void LRParser::testEndOfInputSymbol ( ) {
 void LRParser::testParseCorrectInput ( ) {
 	grammar::CFG < > augmentedExpressionGrammar = grammar::parsing::LRParser::getAugmentedGrammar ( getExpressionGrammar ( ) );
 	
-	DefaultStateType initialState ( DefaultStateType ( label::LR0ItemsLabel ( {
+	grammar::parsing::LR0Items initialState {
 		{
 			augmentedExpressionGrammar.getInitialSymbol(),
 			{
@@ -80,7 +80,7 @@ void LRParser::testParseCorrectInput ( ) {
 				{ 0 , { identifier } }
 			}
 		}
-	} ) ) );
+	};
 
 	ext::vector < DefaultSymbolType > correctInput {
 		leftParenthesis,
@@ -107,8 +107,8 @@ void LRParser::testParseCorrectInput ( ) {
 
 void LRParser::testParseIncorrectInput ( ) {
 	grammar::CFG < > augmentedExpressionGrammar = grammar::parsing::LRParser::getAugmentedGrammar ( getExpressionGrammar ( ) );
-	
-	DefaultStateType initialState ( DefaultStateType ( label::LR0ItemsLabel ( {
+
+	grammar::parsing::LR0Items initialState {
 		{
 			augmentedExpressionGrammar.getInitialSymbol(),
 			{
@@ -136,7 +136,7 @@ void LRParser::testParseIncorrectInput ( ) {
 				{ 0 , { identifier } }
 			}
 		}
-	} ) ) );
+	};
 
 	ext::vector < DefaultSymbolType > incorrectInput {
 		leftParenthesis,
diff --git a/alib2algo_experimental/test-src/grammar/parsing/LeftFactorize.cpp b/alib2algo_experimental/test-src/grammar/parsing/LeftFactorize.cpp
index 0fe206323b..5f722fe6a2 100644
--- a/alib2algo_experimental/test-src/grammar/parsing/LeftFactorize.cpp
+++ b/alib2algo_experimental/test-src/grammar/parsing/LeftFactorize.cpp
@@ -30,12 +30,12 @@ void LeftFactorize::testLeftFactorize ( ) {
 	grammar.setNonterminalAlphabet ( { S, B, C } );
 	grammar.setInitialSymbol ( S );
 
-	grammar.addRule ( S, ext::vector < DefaultSymbolType > { a, B } );
-	grammar.addRule ( S, ext::vector < DefaultSymbolType > { a, C } );
-	grammar.addRule ( B, ext::vector < DefaultSymbolType > { b, B } );
-	grammar.addRule ( B, ext::vector < DefaultSymbolType > { b } );
-	grammar.addRule ( C, ext::vector < DefaultSymbolType > { c, C } );
-	grammar.addRule ( C, ext::vector < DefaultSymbolType > { c } );
+	grammar.addRule ( S, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, B } );
+	grammar.addRule ( S, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C } );
+	grammar.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, B } );
+	grammar.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b } );
+	grammar.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, C } );
+	grammar.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c } );
 
 	grammar::CFG < > res = grammar;
 	grammar::parsing::LeftFactorize::leftFactorize ( res, a, S);
@@ -48,15 +48,15 @@ void LeftFactorize::testLeftFactorize ( ) {
 	comp.setNonterminalAlphabet ( { S, Sp, B, Bp, C, Cp } );
 	comp.setInitialSymbol ( S );
 
-	comp.addRule ( S, ext::vector < DefaultSymbolType > { a, Sp } );
-	comp.addRule ( Sp, ext::vector < DefaultSymbolType > { B } );
-	comp.addRule ( Sp, ext::vector < DefaultSymbolType > { C } );
-	comp.addRule ( B, ext::vector < DefaultSymbolType > { b, Bp } );
-	comp.addRule ( Bp, ext::vector < DefaultSymbolType > { B } );
-	comp.addRule ( Bp, ext::vector < DefaultSymbolType > { } );
-	comp.addRule ( C, ext::vector < DefaultSymbolType > { c, Cp } );
-	comp.addRule ( Cp, ext::vector < DefaultSymbolType > { C } );
-	comp.addRule ( Cp, ext::vector < DefaultSymbolType > { } );
+	comp.addRule ( S, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, Sp } );
+	comp.addRule ( Sp, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { B } );
+	comp.addRule ( Sp, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { C } );
+	comp.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, Bp } );
+	comp.addRule ( Bp, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { B } );
+	comp.addRule ( Bp, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { } );
+	comp.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, Cp } );
+	comp.addRule ( Cp, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { C } );
+	comp.addRule ( Cp, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { } );
 
 //	std::cout << res << std::endl << comp << std::endl;
 
@@ -83,15 +83,15 @@ void LeftFactorize::testLeftFactorize2 ( ) {
 	grammar.setNonterminalAlphabet ( { S, B, C, D } );
 	grammar.setInitialSymbol ( S );
 
-	grammar.addRule ( S, ext::vector < DefaultSymbolType > { a, B } );
-	grammar.addRule ( S, ext::vector < DefaultSymbolType > { a, C } );
-	grammar.addRule ( S, ext::vector < DefaultSymbolType > { D } );
-	grammar.addRule ( B, ext::vector < DefaultSymbolType > { b, B } );
-	grammar.addRule ( B, ext::vector < DefaultSymbolType > { b } );
-	grammar.addRule ( C, ext::vector < DefaultSymbolType > { c, C } );
-	grammar.addRule ( C, ext::vector < DefaultSymbolType > { c } );
-	grammar.addRule ( C, ext::vector < DefaultSymbolType > { b } );
-	grammar.addRule ( D, ext::vector < DefaultSymbolType > { d } );
+	grammar.addRule ( S, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, B } );
+	grammar.addRule ( S, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, C } );
+	grammar.addRule ( S, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { D } );
+	grammar.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, B } );
+	grammar.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b } );
+	grammar.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, C } );
+	grammar.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c } );
+	grammar.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b } );
+	grammar.addRule ( D, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { d } );
 
 	grammar::CFG < > res = grammar;
 	grammar::parsing::LeftFactorize::leftFactorize ( res, a, S);
@@ -104,18 +104,18 @@ void LeftFactorize::testLeftFactorize2 ( ) {
 	comp.setNonterminalAlphabet ( { S, Sp, B, Bp, C, Cp, D} );
 	comp.setInitialSymbol ( S );
 
-	comp.addRule ( S, ext::vector < DefaultSymbolType > { a, Sp } );
-	comp.addRule ( S, ext::vector < DefaultSymbolType > { D } );
-	comp.addRule ( Sp, ext::vector < DefaultSymbolType > { B } );
-	comp.addRule ( Sp, ext::vector < DefaultSymbolType > { C } );
-	comp.addRule ( B, ext::vector < DefaultSymbolType > { b, Bp } );
-	comp.addRule ( Bp, ext::vector < DefaultSymbolType > { B } );
-	comp.addRule ( Bp, ext::vector < DefaultSymbolType > { } );
-	comp.addRule ( C, ext::vector < DefaultSymbolType > { c, Cp } );
-	comp.addRule ( C, ext::vector < DefaultSymbolType > { b } );
-	comp.addRule ( Cp, ext::vector < DefaultSymbolType > { C } );
-	comp.addRule ( Cp, ext::vector < DefaultSymbolType > { } );
-	comp.addRule ( D, ext::vector < DefaultSymbolType > { d } );
+	comp.addRule ( S, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { a, Sp } );
+	comp.addRule ( S, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { D } );
+	comp.addRule ( Sp, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { B } );
+	comp.addRule ( Sp, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { C } );
+	comp.addRule ( B, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b, Bp } );
+	comp.addRule ( Bp, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { B } );
+	comp.addRule ( Bp, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { } );
+	comp.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { c, Cp } );
+	comp.addRule ( C, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { b } );
+	comp.addRule ( Cp, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { C } );
+	comp.addRule ( Cp, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { } );
+	comp.addRule ( D, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { d } );
 
 //	std::cout << res << std::endl << comp << std::endl;
 
diff --git a/alib2algo_experimental/test-src/grammar/parsing/SLR1ParseTable.cpp b/alib2algo_experimental/test-src/grammar/parsing/SLR1ParseTable.cpp
index ac24ce337a..59dc916c51 100644
--- a/alib2algo_experimental/test-src/grammar/parsing/SLR1ParseTable.cpp
+++ b/alib2algo_experimental/test-src/grammar/parsing/SLR1ParseTable.cpp
@@ -229,62 +229,57 @@ void SLR1ParseTable::testActionTable ( ) {
 		}
 	};
 	
-	ext::vector < DefaultStateType > states;
-	for (const grammar::parsing::LR0Items & currentItems : items) {
-		states.emplace_back( DefaultStateType ( label::LR0ItemsLabel ( currentItems ) ) );
-	}
-	
 	DefaultSymbolType endOfInput = grammar::parsing::LRParser::getEndOfInputSymbol ( getExpressionGrammar ( ) );
 	grammar::parsing::LRActionTable correctActionTable {
-		{ { states[0], identifier }, { grammar::parsing::LRAction::Shift, states[5] } },
-		{ { states[0], leftParenthesis }, { grammar::parsing::LRAction::Shift, states[4] } },
-		{ { states[1], plus }, { grammar::parsing::LRAction::Shift, states[6] } },
-		{ { states[1], endOfInput }, { grammar::parsing::LRAction::Accept, states[0] } },
-		{ { states[2], times }, { grammar::parsing::LRAction::Shift, states[7] } },
-		{ { states[4], identifier }, { grammar::parsing::LRAction::Shift, states[5] } },
-		{ { states[4], leftParenthesis }, { grammar::parsing::LRAction::Shift, states[4] } },
-		{ { states[6], identifier }, { grammar::parsing::LRAction::Shift, states[5] } },
-		{ { states[6], leftParenthesis }, { grammar::parsing::LRAction::Shift, states[4] } },
-		{ { states[7], identifier }, { grammar::parsing::LRAction::Shift, states[5] } },
-		{ { states[7], leftParenthesis }, { grammar::parsing::LRAction::Shift, states[4] } },
-		{ { states[8], plus }, { grammar::parsing::LRAction::Shift, states[6] } },
-		{ { states[8], rightParenthesis }, { grammar::parsing::LRAction::Shift, states[11] } },
-		{ { states[9], times }, { grammar::parsing::LRAction::Shift, states[7] } }
+		{ { items[0], identifier }, { grammar::parsing::LRAction::Shift, items[5] } },
+		{ { items[0], leftParenthesis }, { grammar::parsing::LRAction::Shift, items[4] } },
+		{ { items[1], plus }, { grammar::parsing::LRAction::Shift, items[6] } },
+		{ { items[1], endOfInput }, { grammar::parsing::LRAction::Accept, items[0] } },
+		{ { items[2], times }, { grammar::parsing::LRAction::Shift, items[7] } },
+		{ { items[4], identifier }, { grammar::parsing::LRAction::Shift, items[5] } },
+		{ { items[4], leftParenthesis }, { grammar::parsing::LRAction::Shift, items[4] } },
+		{ { items[6], identifier }, { grammar::parsing::LRAction::Shift, items[5] } },
+		{ { items[6], leftParenthesis }, { grammar::parsing::LRAction::Shift, items[4] } },
+		{ { items[7], identifier }, { grammar::parsing::LRAction::Shift, items[5] } },
+		{ { items[7], leftParenthesis }, { grammar::parsing::LRAction::Shift, items[4] } },
+		{ { items[8], plus }, { grammar::parsing::LRAction::Shift, items[6] } },
+		{ { items[8], rightParenthesis }, { grammar::parsing::LRAction::Shift, items[11] } },
+		{ { items[9], times }, { grammar::parsing::LRAction::Shift, items[7] } }
 	};
 	
-	ext::pair < DefaultSymbolType, ext::vector < DefaultSymbolType > > reduceBy = ext::make_pair ( E, ext::vector < DefaultSymbolType > { T } );
-	correctActionTable.insert ( { { states[2], plus },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
-	correctActionTable.insert ( { { states[2], rightParenthesis },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
-	correctActionTable.insert ( { { states[2], endOfInput },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	ext::pair < DefaultSymbolType, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > reduceBy = ext::make_pair ( E, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { T } );
+	correctActionTable.insert ( { { items[2], plus },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	correctActionTable.insert ( { { items[2], rightParenthesis },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	correctActionTable.insert ( { { items[2], endOfInput },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
 	
-	reduceBy = ext::make_pair ( T, ext::vector < DefaultSymbolType > { F } );
-	correctActionTable.insert ( { { states[3], plus },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
-	correctActionTable.insert ( { { states[3], times },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
-	correctActionTable.insert ( { { states[3], rightParenthesis },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
-	correctActionTable.insert ( { { states[3], endOfInput },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	reduceBy = ext::make_pair ( T, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { F } );
+	correctActionTable.insert ( { { items[3], plus },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	correctActionTable.insert ( { { items[3], times },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	correctActionTable.insert ( { { items[3], rightParenthesis },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	correctActionTable.insert ( { { items[3], endOfInput },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
 
-	reduceBy = ext::make_pair (  F, ext::vector < DefaultSymbolType > { identifier } );
-	correctActionTable.insert ( { { states[5], plus },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
-	correctActionTable.insert ( { { states[5], times },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
-	correctActionTable.insert ( { { states[5], rightParenthesis },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
-	correctActionTable.insert ( { { states[5], endOfInput },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
-	
-	reduceBy = ext::make_pair ( E, ext::vector < DefaultSymbolType > { E, plus, T } );
-	correctActionTable.insert ( { { states[9], plus },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
-	correctActionTable.insert ( { { states[9], rightParenthesis },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
-	correctActionTable.insert ( { { states[9], endOfInput },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
-	
-	reduceBy = ext::make_pair ( T, ext::vector < DefaultSymbolType > { T, times, F } );
-	correctActionTable.insert ( { { states[10], plus },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
-	correctActionTable.insert ( { { states[10], times },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
-	correctActionTable.insert ( { { states[10], rightParenthesis },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
-	correctActionTable.insert ( { { states[10], endOfInput },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
-	
-	reduceBy = ext::make_pair ( F, ext::vector < DefaultSymbolType > { leftParenthesis, E, rightParenthesis } );
-	correctActionTable.insert ( { { states[11], plus },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
-	correctActionTable.insert ( { { states[11], times },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
-	correctActionTable.insert ( { { states[11], rightParenthesis },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
-	correctActionTable.insert ( { { states[11], endOfInput },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	reduceBy = ext::make_pair (  F, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { identifier } );
+	correctActionTable.insert ( { { items[5], plus },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	correctActionTable.insert ( { { items[5], times },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	correctActionTable.insert ( { { items[5], rightParenthesis },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	correctActionTable.insert ( { { items[5], endOfInput },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	
+	reduceBy = ext::make_pair ( E, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { E, plus, T } );
+	correctActionTable.insert ( { { items[9], plus },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	correctActionTable.insert ( { { items[9], rightParenthesis },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	correctActionTable.insert ( { { items[9], endOfInput },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	
+	reduceBy = ext::make_pair ( T, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { T, times, F } );
+	correctActionTable.insert ( { { items[10], plus },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	correctActionTable.insert ( { { items[10], times },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	correctActionTable.insert ( { { items[10], rightParenthesis },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	correctActionTable.insert ( { { items[10], endOfInput },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	
+	reduceBy = ext::make_pair ( F, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > { leftParenthesis, E, rightParenthesis } );
+	correctActionTable.insert ( { { items[11], plus },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	correctActionTable.insert ( { { items[11], times },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	correctActionTable.insert ( { { items[11], rightParenthesis },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
+	correctActionTable.insert ( { { items[11], endOfInput },  { grammar::parsing::LRAction::Reduce, reduceBy } } );
 	
 	grammar::parsing::LRActionTable actionTable = grammar::parsing::SLR1ParseTable::getActionTable ( getExpressionGrammar ( ) );
 	
@@ -304,13 +299,13 @@ void SLR1ParseTable::testActionTable ( ) {
 		bool correctContent = true;
 		switch ( actionTablePair.second.first ) {
 			case grammar::parsing::LRAction::Shift:
-				if ( actionTablePair.second.second.get < DefaultStateType > ( ) != value->second.second.get < DefaultStateType > ( ) ) {
+				if ( actionTablePair.second.second.get < grammar::parsing::LR0Items > ( ) != value->second.second.get < grammar::parsing::LR0Items > ( ) ) {
 					correctContent = false;
 				}
 				break;
 
 			case grammar::parsing::LRAction::Reduce:
-				if ( actionTablePair.second.second.get < ext::pair < DefaultSymbolType, ext::vector < DefaultSymbolType > > > ( ) != value->second.second.get < ext::pair < DefaultSymbolType, ext::vector < DefaultSymbolType > > > ( ) ) {
+				if ( actionTablePair.second.second.get < ext::pair < DefaultSymbolType, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > > ( ) != value->second.second.get < ext::pair < DefaultSymbolType, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > > ( ) ) {
 					correctContent = false;
 				}
 				break;
@@ -527,21 +522,16 @@ void SLR1ParseTable::testGotoTable ( ) {
 		}
 	};
 	
-	ext::vector < DefaultStateType > states;
-	for (const grammar::parsing::LR0Items & currentItems : items) {
-		states.emplace_back( DefaultStateType ( label::LR0ItemsLabel ( currentItems ) ) );
-	}
-	
 	grammar::parsing::LRGotoTable gotoTable {
-		{ { states[0], E }, states[1] },
-		{ { states[0], T }, states[2] },
-		{ { states[0], F }, states[3] },
-		{ { states[4], E }, states[8] },
-		{ { states[4], T }, states[2] },
-		{ { states[4], F }, states[3] },
-		{ { states[6], T }, states[9] },
-		{ { states[6], F }, states[3] },
-		{ { states[7], F }, states[10] }
+		{ { items[0], E }, items[1] },
+		{ { items[0], T }, items[2] },
+		{ { items[0], F }, items[3] },
+		{ { items[4], E }, items[8] },
+		{ { items[4], T }, items[2] },
+		{ { items[4], F }, items[3] },
+		{ { items[6], T }, items[9] },
+		{ { items[6], F }, items[3] },
+		{ { items[7], F }, items[10] }
 	};
 	
 	CPPUNIT_ASSERT ( grammar::parsing::SLR1ParseTable::getGotoTable ( getExpressionGrammar ( ) ) == gotoTable );
diff --git a/alib2data/src/PrimitiveRegistrator.cpp b/alib2data/src/PrimitiveRegistrator.cpp
index e55f1c011c..0099f20b6f 100644
--- a/alib2data/src/PrimitiveRegistrator.cpp
+++ b/alib2data/src/PrimitiveRegistrator.cpp
@@ -73,6 +73,7 @@ public:
 		core::xmlApi < object::Object >::template registerXmlWriter < object::AnyObject < ext::pair < ext::set < ext::pair < object::Object, object::Object > >, ext::variant < string::Epsilon < object::Object >, object::Object > > > > ( );
 		core::xmlApi < object::Object >::template registerXmlWriter < object::AnyObject < ext::pair < object::Object, ext::variant < string::Epsilon < object::Object >, object::Object > > > > ( );
 		core::xmlApi < object::Object >::template registerXmlWriter < object::AnyObject < ext::vector < object::Object > > > ( );
+		core::xmlApi < object::Object >::template registerXmlWriter < object::AnyObject < ext::vector < ext::variant < object::Object, object::Object > > > > ( );
 		core::xmlApi < object::Object >::template registerXmlWriter < object::AnyObject < ext::set < object::Object > > > ( );
 		core::xmlApi < object::Object >::template registerXmlWriter < object::AnyObject < unsigned int > > ( );
 		core::xmlApi < object::Object >::template registerXmlWriter < container::ObjectsPair < object::Object, unsigned > > ( );
diff --git a/alib2data/src/alphabet/common/SymbolNormalize.h b/alib2data/src/alphabet/common/SymbolNormalize.h
index 42476ee358..20fe47f86b 100644
--- a/alib2data/src/alphabet/common/SymbolNormalize.h
+++ b/alib2data/src/alphabet/common/SymbolNormalize.h
@@ -31,12 +31,18 @@ public:
 	template < class SymbolType >
 	static DefaultSymbolType normalizeSymbol ( SymbolType && symbol );
 
+	template < class FirstSymbolType, class SecondSymbolType >
+	static ext::variant < DefaultSymbolType, DefaultSymbolType > normalizeVariantSymbol ( ext::variant < FirstSymbolType, SecondSymbolType > && symbol );
+
 	template < class SymbolType, class RankType >
 	static common::ranked_symbol < DefaultSymbolType, DefaultRankType > normalizeRankedSymbol ( common::ranked_symbol < SymbolType, RankType > && symbol );
 
 	template < class SymbolType >
 	static ext::vector < DefaultSymbolType > normalizeSymbols ( ext::vector < SymbolType > && symbols );
 
+	template < class FirstSymbolType, class SecondSymbolType >
+	static ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > normalizeVariantSymbols ( ext::vector < ext::variant < FirstSymbolType, SecondSymbolType > > && symbols );
+
 	template < class SymbolType, class RankType >
 	static ext::vector < common::ranked_symbol < DefaultSymbolType, DefaultRankType > > normalizeRankedSymbols ( ext::vector < common::ranked_symbol < SymbolType, RankType > > && symbols );
 };
@@ -64,6 +70,14 @@ DefaultSymbolType SymbolNormalize::normalizeSymbol ( SymbolType && symbol ) {
 	return object::ObjectFactory::make ( std::move ( symbol ) );
 }
 
+template < class FirstSymbolType, class SecondSymbolType >
+ext::variant < DefaultSymbolType, DefaultSymbolType > SymbolNormalize::normalizeVariantSymbol ( ext::variant < FirstSymbolType, SecondSymbolType > && symbol ) {
+	if ( symbol.template is < FirstSymbolType > ( ) )
+		return ext::variant < DefaultSymbolType, DefaultSymbolType > ( object::ObjectFactory::make ( std::move ( symbol.template get < FirstSymbolType > ( ) ) ) );
+	else
+		return ext::variant < DefaultSymbolType, DefaultSymbolType > ( object::ObjectFactory::make ( std::move ( symbol.template get < SecondSymbolType > ( ) ) ) );
+}
+
 template < class SymbolType, class RankType >
 common::ranked_symbol < DefaultSymbolType, DefaultRankType > SymbolNormalize::normalizeRankedSymbol ( common::ranked_symbol < SymbolType, RankType > && symbol ) {
 	return common::ranked_symbol < DefaultSymbolType, DefaultRankType > ( normalizeSymbol ( std::move ( symbol ).getSymbol ( ) ), DefaultRankType ( std::move ( symbol ).getRank ( ) ) );
@@ -78,6 +92,15 @@ ext::vector < DefaultSymbolType > SymbolNormalize::normalizeSymbols ( ext::vecto
 	return res;
 }
 
+template < class FirstSymbolType, class SecondSymbolType >
+ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > SymbolNormalize::normalizeVariantSymbols ( ext::vector < ext::variant < FirstSymbolType, SecondSymbolType > > && symbols ) {
+	ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > res;
+	for ( ext::variant < FirstSymbolType, SecondSymbolType > & symbol : symbols ) {
+		res.push_back ( normalizeVariantSymbol ( std::move ( symbol ) ) );
+	}
+	return res;
+}
+
 template < class SymbolType, class RankType >
 ext::vector < common::ranked_symbol < DefaultSymbolType, DefaultRankType > > SymbolNormalize::normalizeRankedSymbols ( ext::vector < common::ranked_symbol < SymbolType, RankType > > && symbols ) {
 	ext::vector < common::ranked_symbol < DefaultSymbolType, DefaultRankType > > res;
diff --git a/alib2data/src/grammar/AddRawRule.h b/alib2data/src/grammar/AddRawRule.h
index 9814d66953..c14dd6d014 100644
--- a/alib2data/src/grammar/AddRawRule.h
+++ b/alib2data/src/grammar/AddRawRule.h
@@ -45,26 +45,26 @@ public:
 	/**
 	 * \override
 	 */
-	template < class SymbolType, class TerminalSymbolType, class NonterminalSymbolType >
-	static bool addRawRule ( GNF < SymbolType > & grammar, NonterminalSymbolType leftHandSide, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rightHandSide );
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static bool addRawRule ( GNF < TerminalSymbolType, NonterminalSymbolType > & grammar, NonterminalSymbolType leftHandSide, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rightHandSide );
 
 	/**
 	 * \override
 	 */
-	template < class SymbolType, class TerminalSymbolType, class NonterminalSymbolType >
-	static bool addRawRule ( EpsilonFreeCFG < SymbolType > & grammar, NonterminalSymbolType leftHandSide, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rightHandSide );
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static bool addRawRule ( EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & grammar, NonterminalSymbolType leftHandSide, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rightHandSide );
 
 	/**
 	 * \override
 	 */
-	template < class SymbolType, class TerminalSymbolType, class NonterminalSymbolType >
-	static bool addRawRule ( CNF < SymbolType > & grammar, NonterminalSymbolType leftHandSide, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rightHandSide );
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static bool addRawRule ( CNF < TerminalSymbolType, NonterminalSymbolType > & grammar, NonterminalSymbolType leftHandSide, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rightHandSide );
 
 	/**
 	 * \override
 	 */
-	template < class SymbolType, class TerminalSymbolType, class NonterminalSymbolType >
-	static bool addRawRule ( CFG < SymbolType > & grammar, NonterminalSymbolType leftHandSide, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rightHandSide );
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static bool addRawRule ( CFG < TerminalSymbolType, NonterminalSymbolType > & grammar, NonterminalSymbolType leftHandSide, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rightHandSide );
 
 	/**
 	 * \override
@@ -118,8 +118,8 @@ bool AddRawRule::addRawRule ( LG < TerminalSymbolType, NonterminalSymbolType > &
 	}
 }
 
-template < class SymbolType, class TerminalSymbolType, class NonterminalSymbolType >
-bool AddRawRule::addRawRule ( GNF < SymbolType > & grammar, NonterminalSymbolType leftHandSide, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rightHandSide ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+bool AddRawRule::addRawRule ( GNF < TerminalSymbolType, NonterminalSymbolType > & grammar, NonterminalSymbolType leftHandSide, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rightHandSide ) {
 	if ( rightHandSide.size ( ) == 0 ) {
 		if ( leftHandSide != grammar.getInitialSymbol ( ) )
 			throw GrammarException ( "Illegal left hand side of epsilon rule" );
@@ -138,8 +138,8 @@ bool AddRawRule::addRawRule ( GNF < SymbolType > & grammar, NonterminalSymbolTyp
 	}
 }
 
-template < class SymbolType, class TerminalSymbolType, class NonterminalSymbolType >
-bool AddRawRule::addRawRule ( EpsilonFreeCFG < SymbolType > & grammar, NonterminalSymbolType leftHandSide, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rightHandSide ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+bool AddRawRule::addRawRule ( EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & grammar, NonterminalSymbolType leftHandSide, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rightHandSide ) {
 	if ( rightHandSide.size ( ) == 0 ) {
 		if ( leftHandSide != grammar.getInitialSymbol ( ) )
 			throw GrammarException ( "Illegal left hand side of epsilon rule" );
@@ -148,16 +148,12 @@ bool AddRawRule::addRawRule ( EpsilonFreeCFG < SymbolType > & grammar, Nontermin
 		grammar.setGeneratesEpsilon ( true );
 		return ! res;
 	} else {
-		ext::vector < SymbolType > rhs;
-		for ( ext::variant < TerminalSymbolType, NonterminalSymbolType > & element : ext::make_iterator_range ( rightHandSide.begin ( ), rightHandSide.end ( ) ) )
-			rhs.push_back ( std::move ( element.template get < SymbolType > ( ) ) );
-
-		return grammar.addRule ( std::move ( leftHandSide ), std::move ( rhs ) );
+		return grammar.addRule ( std::move ( leftHandSide ), std::move ( rightHandSide ) );
 	}
 }
 
-template < class SymbolType, class TerminalSymbolType, class NonterminalSymbolType >
-bool AddRawRule::addRawRule ( CNF < SymbolType > & grammar, NonterminalSymbolType leftHandSide, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rightHandSide ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+bool AddRawRule::addRawRule ( CNF < TerminalSymbolType, NonterminalSymbolType > & grammar, NonterminalSymbolType leftHandSide, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rightHandSide ) {
 	if ( rightHandSide.size ( ) == 0 ) {
 		if ( leftHandSide != grammar.getInitialSymbol ( ) )
 			throw GrammarException ( "Illegal left hand side of epsilon rule" );
@@ -174,13 +170,9 @@ bool AddRawRule::addRawRule ( CNF < SymbolType > & grammar, NonterminalSymbolTyp
 	}
 }
 
-template < class SymbolType, class TerminalSymbolType, class NonterminalSymbolType >
-bool AddRawRule::addRawRule ( CFG < SymbolType > & grammar, NonterminalSymbolType leftHandSide, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rightHandSide ) {
-	ext::vector < SymbolType > rhs;
-	for ( ext::variant < TerminalSymbolType, NonterminalSymbolType > & element : ext::make_iterator_range ( rightHandSide.begin ( ), rightHandSide.end ( ) ) )
-		rhs.push_back ( std::move ( element.template get < SymbolType > ( ) ) );
-
-	return grammar.addRule ( std::move ( leftHandSide ), std::move ( rhs ) );
+template < class TerminalSymbolType, class NonterminalSymbolType >
+bool AddRawRule::addRawRule ( CFG < TerminalSymbolType, NonterminalSymbolType > & grammar, NonterminalSymbolType leftHandSide, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rightHandSide ) {
+	return grammar.addRule ( std::move ( leftHandSide ), std::move ( rightHandSide ) );
 }
 
 template < class TerminalSymbolType, class NonterminalSymbolType >
diff --git a/alib2data/src/grammar/ContextFree/CFG.h b/alib2data/src/grammar/ContextFree/CFG.h
index 5bb00f51e2..ace9d8630d 100644
--- a/alib2data/src/grammar/ContextFree/CFG.h
+++ b/alib2data/src/grammar/ContextFree/CFG.h
@@ -62,14 +62,15 @@ class InitialSymbol;
  * P = set of production rules of the form A -> B, where A \in N and B \in ( N \cup T )*,
  * S (InitialSymbol) = initial nonterminal symbol,
  *
- * \tparam SymbolType used for the terminal alphabet, the nonterminal alphabet, and the initial symbol of the grammar.
+ * \tparam TerminalSymbolType used for the terminal alphabet of the grammar.
+ * \tparam NonterminalSymbolType used for the nonterminal alphabet, and the initial symbol of the grammar.
  */
-template < class SymbolType = DefaultSymbolType >
-class CFG final : public GrammarBase, public core::Components < CFG < SymbolType >, ext::set < SymbolType >, component::Set, std::tuple < TerminalAlphabet, NonterminalAlphabet >, SymbolType, component::Value, InitialSymbol > {
+template < class TerminalSymbolType = DefaultSymbolType, class NonterminalSymbolType = DefaultSymbolType >
+class CFG final : public GrammarBase, public core::Components < CFG < TerminalSymbolType, NonterminalSymbolType >, ext::set < TerminalSymbolType >, component::Set, TerminalAlphabet, ext::set < NonterminalSymbolType >, component::Set, NonterminalAlphabet, NonterminalSymbolType, component::Value, InitialSymbol > {
 	/**
 	 * Rules function as mapping from nonterminal symbol on the left hand side to a set of sequences of terminal and nonterminal symbols.
 	 */
-	ext::map < SymbolType, ext::set < ext::vector < SymbolType > > > rules;
+	ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > rules;
 
 public:
 	/**
@@ -77,7 +78,7 @@ public:
 	 *
 	 * \param initialSymbol the initial symbol of the grammar
 	 */
-	explicit CFG ( SymbolType initialSymbol );
+	explicit CFG ( NonterminalSymbolType initialSymbol );
 
 	/**
 	 * \brief Creates a new instance of the grammar with a concrete nonterminal alphabet, terminal alphabet and initial symbol.
@@ -86,14 +87,14 @@ public:
 	 * \param terminalSymbols the initial terminal alphabet
 	 * \param initialSymbol the initial symbol of the grammar
 	 */
-	explicit CFG ( ext::set < SymbolType > nonTerminalSymbols, ext::set < SymbolType > terminalSymbols, SymbolType initialSymbol );
+	explicit CFG ( ext::set < NonterminalSymbolType > nonTerminalSymbols, ext::set < TerminalSymbolType > terminalSymbols, NonterminalSymbolType initialSymbol );
 
 	/*
 	 * \brief Creates a new instance of the automaton based on the Epsilon free context free grammar.
 	 *
 	 * \param other the Epsilon free context free grammar
 	 */
-	explicit CFG ( const EpsilonFreeCFG < SymbolType > & other );
+	explicit CFG ( const EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & other );
 
 	/**
 	 * @copydoc grammar::GrammarBase::clone()
@@ -115,7 +116,7 @@ public:
 	 *
 	 * \returns true if the rule was indeed added, false othervise
 	 */
-	bool addRule ( SymbolType leftHandSide, ext::vector < SymbolType > rightHandSide );
+	bool addRule ( NonterminalSymbolType leftHandSide, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rightHandSide );
 
 	/**
 	 * \brief Add new rules of a grammar.
@@ -125,21 +126,21 @@ public:
 	 * \param leftHandSide the left hand side of the rule
 	 * \param rightHandSide a set of right hand sides of the rule
 	 */
-	void addRules ( SymbolType leftHandSide, ext::set < ext::vector < SymbolType > > rightHandSide );
+	void addRules ( NonterminalSymbolType leftHandSide, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > rightHandSide );
 
 	/**
 	 * Get rules of the grammar.
 	 *
 	 * \returns rules of the grammar
 	 */
-	const ext::map < SymbolType, ext::set < ext::vector < SymbolType > > > & getRules ( ) const &;
+	const ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > & getRules ( ) const &;
 
 	/**
 	 * Get rules of the grammar.
 	 *
 	 * \returns rules of the grammar
 	 */
-	ext::map < SymbolType, ext::set < ext::vector < SymbolType > > > && getRules ( ) &&;
+	ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > && getRules ( ) &&;
 
 	/**
 	 * Remove a rule of a grammar in form of A -> B, where A \in N and B \in (N \cup T)*.
@@ -149,14 +150,14 @@ public:
 	 *
 	 * \returns true if the rule was indeed removed, false othervise
 	 */
-	bool removeRule ( const SymbolType & leftHandSide, const ext::vector < SymbolType > & rightHandSide );
+	bool removeRule ( const NonterminalSymbolType & leftHandSide, const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rightHandSide );
 
 	/**
 	 * Getter of initial symbol.
 	 *
 	 * \returns the initial symbol of the grammar
 	 */
-	const SymbolType & getInitialSymbol ( ) const & {
+	const NonterminalSymbolType & getInitialSymbol ( ) const & {
 		return this->template accessComponent < InitialSymbol > ( ).get ( );
 	}
 
@@ -165,7 +166,7 @@ public:
 	 *
 	 * \returns the initial symbol of the grammar
 	 */
-	SymbolType && getInitialSymbol ( ) && {
+	NonterminalSymbolType && getInitialSymbol ( ) && {
 		return std::move ( this->template accessComponent < InitialSymbol > ( ).get ( ) );
 	}
 
@@ -176,7 +177,7 @@ public:
 	 *
 	 * \returns true if the initial symbol was indeed changed
 	 */
-	bool setInitialSymbol ( SymbolType symbol ) {
+	bool setInitialSymbol ( NonterminalSymbolType symbol ) {
 		return this->template accessComponent < InitialSymbol > ( ).set ( std::move ( symbol ) );
 	}
 
@@ -185,7 +186,7 @@ public:
 	 *
 	 * \returns the nonterminal alphabet of the grammar
 	 */
-	const ext::set < SymbolType > & getNonterminalAlphabet ( ) const & {
+	const ext::set < NonterminalSymbolType > & getNonterminalAlphabet ( ) const & {
 		return this->template accessComponent < NonterminalAlphabet > ( ).get ( );
 	}
 
@@ -194,7 +195,7 @@ public:
 	 *
 	 * \returns the nonterminal alphabet of the grammar
 	 */
-	ext::set < SymbolType > && getNonterminalAlphabet ( ) && {
+	ext::set < NonterminalSymbolType > && getNonterminalAlphabet ( ) && {
 		return std::move ( this->template accessComponent < NonterminalAlphabet > ( ).get ( ) );
 	}
 
@@ -205,7 +206,7 @@ public:
 	 *
 	 * \returns true if the symbol was indeed added
 	 */
-	bool addNonterminalSymbol ( SymbolType symbol ) {
+	bool addNonterminalSymbol ( NonterminalSymbolType symbol ) {
 		return this->template accessComponent < NonterminalAlphabet > ( ).add ( std::move ( symbol ) );
 	}
 
@@ -214,7 +215,7 @@ public:
 	 *
 	 * \param symbols completely new nonterminal alphabet
 	 */
-	void setNonterminalAlphabet ( ext::set < SymbolType > symbols ) {
+	void setNonterminalAlphabet ( ext::set < NonterminalSymbolType > symbols ) {
 		this->template accessComponent < NonterminalAlphabet > ( ).set ( std::move ( symbols ) );
 	}
 
@@ -223,7 +224,7 @@ public:
 	 *
 	 * \returns the terminal alphabet of the grammar
 	 */
-	const ext::set < SymbolType > & getTerminalAlphabet ( ) const & {
+	const ext::set < TerminalSymbolType > & getTerminalAlphabet ( ) const & {
 		return this->template accessComponent < TerminalAlphabet > ( ).get ( );
 	}
 
@@ -232,7 +233,7 @@ public:
 	 *
 	 * \returns the terminal alphabet of the grammar
 	 */
-	ext::set < SymbolType > && getTerminalAlphabet ( ) && {
+	ext::set < TerminalSymbolType > && getTerminalAlphabet ( ) && {
 		return std::move ( this->template accessComponent < TerminalAlphabet > ( ).get ( ) );
 	}
 
@@ -243,7 +244,7 @@ public:
 	 *
 	 * \returns true if the symbol was indeed added
 	 */
-	bool addTerminalSymbol ( SymbolType symbol ) {
+	bool addTerminalSymbol ( TerminalSymbolType symbol ) {
 		return this->template accessComponent < TerminalAlphabet > ( ).add ( std::move ( symbol ) );
 	}
 
@@ -252,7 +253,7 @@ public:
 	 *
 	 * \param symbol completely new nontemrinal alphabet
 	 */
-	void setTerminalAlphabet ( ext::set < SymbolType > symbols ) {
+	void setTerminalAlphabet ( ext::set < TerminalSymbolType > symbols ) {
 		this->template accessComponent < TerminalAlphabet > ( ).set ( std::move ( symbols ) );
 	}
 
@@ -290,76 +291,76 @@ public:
 	virtual object::ObjectBase * inc ( ) && override;
 };
 
-template < class SymbolType >
-CFG < SymbolType >::CFG ( SymbolType initialSymbol ) : CFG ( ext::set < SymbolType > { initialSymbol }, ext::set < SymbolType > ( ), initialSymbol ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+CFG < TerminalSymbolType, NonterminalSymbolType >::CFG ( NonterminalSymbolType initialSymbol ) : CFG ( ext::set < NonterminalSymbolType > { initialSymbol }, ext::set < TerminalSymbolType > ( ), initialSymbol ) {
 }
 
-template < class SymbolType >
-CFG < SymbolType >::CFG ( ext::set < SymbolType > nonterminalAlphabet, ext::set < SymbolType > terminalAlphabet, SymbolType initialSymbol ) : core::Components < CFG, ext::set < SymbolType >, component::Set, std::tuple < TerminalAlphabet, NonterminalAlphabet >, SymbolType, component::Value, InitialSymbol > ( std::move ( terminalAlphabet), std::move ( nonterminalAlphabet ), std::move ( initialSymbol ) ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+CFG < TerminalSymbolType, NonterminalSymbolType >::CFG ( ext::set < NonterminalSymbolType > nonterminalAlphabet, ext::set < TerminalSymbolType > terminalAlphabet, NonterminalSymbolType initialSymbol ) : core::Components < CFG, ext::set < TerminalSymbolType >, component::Set, TerminalAlphabet, ext::set < NonterminalSymbolType >, component::Set, NonterminalAlphabet, NonterminalSymbolType, component::Value, InitialSymbol > ( std::move ( terminalAlphabet), std::move ( nonterminalAlphabet ), std::move ( initialSymbol ) ) {
 }
 
-template < class SymbolType >
-CFG < SymbolType >::CFG ( const EpsilonFreeCFG < SymbolType > & other ) : CFG ( other.getNonterminalAlphabet ( ), other.getTerminalAlphabet ( ), other.getInitialSymbol ( ) ) {
-	for ( const std::pair < const SymbolType, ext::set < ext::vector < SymbolType > > > & rule : other.getRules ( ) ) {
-		const SymbolType & lhs = rule.first;
+template < class TerminalSymbolType, class NonterminalSymbolType >
+CFG < TerminalSymbolType, NonterminalSymbolType >::CFG ( const EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & other ) : CFG ( other.getNonterminalAlphabet ( ), other.getTerminalAlphabet ( ), other.getInitialSymbol ( ) ) {
+	for ( const std::pair < const NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > & rule : other.getRules ( ) ) {
+		const NonterminalSymbolType & lhs = rule.first;
 
-		for ( const ext::vector < SymbolType > & rhs : rule.second )
+		for ( const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rhs : rule.second )
 			addRule ( lhs, rhs );
 	}
 }
 
-template < class SymbolType >
-GrammarBase * CFG < SymbolType >::clone ( ) const & {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+GrammarBase * CFG < TerminalSymbolType, NonterminalSymbolType >::clone ( ) const & {
 	return new CFG ( * this );
 }
 
-template < class SymbolType >
-GrammarBase * CFG < SymbolType >::clone ( ) && {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+GrammarBase * CFG < TerminalSymbolType, NonterminalSymbolType >::clone ( ) && {
 	return new CFG ( std::move ( * this ) );
 }
 
-template < class SymbolType >
-bool CFG < SymbolType >::addRule ( SymbolType leftHandSide, ext::vector < SymbolType > rightHandSide ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+bool CFG < TerminalSymbolType, NonterminalSymbolType >::addRule ( NonterminalSymbolType leftHandSide, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rightHandSide ) {
 	if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) )
 		throw GrammarException ( "Rule must rewrite nonterminal symbol" );
 
-	for ( const SymbolType & symbol : rightHandSide )
+	for ( const ext::variant < TerminalSymbolType, NonterminalSymbolType > & symbol : rightHandSide )
 		if ( !getTerminalAlphabet ( ).count ( symbol ) && !getNonterminalAlphabet ( ).count ( symbol ) )
 			throw GrammarException ( "Symbol \"" + ext::to_string ( symbol ) + "\" is not neither terminal nor nonterminal symbol" );
 
 	return rules[std::move ( leftHandSide )].insert ( std::move ( rightHandSide ) ).second;
 }
 
-template < class SymbolType >
-void CFG < SymbolType >::addRules ( SymbolType leftHandSide, ext::set < ext::vector < SymbolType > > rightHandSide ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void CFG < TerminalSymbolType, NonterminalSymbolType >::addRules ( NonterminalSymbolType leftHandSide, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > rightHandSide ) {
 	if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) )
 		throw GrammarException ( "Rule must rewrite nonterminal symbol" );
 
-	for ( const ext::vector < SymbolType > & rhs : rightHandSide )
-		for ( const SymbolType & symbol : rhs )
+	for ( const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rhs : rightHandSide )
+		for ( const ext::variant < TerminalSymbolType, NonterminalSymbolType > & symbol : rhs )
 			if ( ! getTerminalAlphabet ( ).count ( symbol ) && ! getNonterminalAlphabet ( ).count ( symbol ) )
 				throw GrammarException ( "Symbol \"" + ext::to_string ( symbol ) + "\" is not neither terminal nor nonterminal symbol" );
 
 	rules [ std::move ( leftHandSide ) ].insert ( ext::make_mover ( rightHandSide ).begin ( ), ext::make_mover ( rightHandSide ).end ( ) );
 }
 
-template < class SymbolType >
-const ext::map < SymbolType, ext::set < ext::vector < SymbolType > > > & CFG < SymbolType >::getRules ( ) const & {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+const ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > & CFG < TerminalSymbolType, NonterminalSymbolType >::getRules ( ) const & {
 	return rules;
 }
 
-template < class SymbolType >
-ext::map < SymbolType, ext::set < ext::vector < SymbolType > > > && CFG < SymbolType >::getRules ( ) && {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > && CFG < TerminalSymbolType, NonterminalSymbolType >::getRules ( ) && {
 	return std::move ( rules );
 }
 
-template < class SymbolType >
-bool CFG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const ext::vector < SymbolType > & rightHandSide ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+bool CFG < TerminalSymbolType, NonterminalSymbolType >::removeRule ( const NonterminalSymbolType & leftHandSide, const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rightHandSide ) {
 	return rules[leftHandSide].erase ( rightHandSide );
 }
 
-template < class SymbolType >
-int CFG < SymbolType >::compare ( const CFG & other ) const {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+int CFG < TerminalSymbolType, NonterminalSymbolType >::compare ( const CFG & other ) const {
 	auto first = ext::tie ( getTerminalAlphabet ( ), getNonterminalAlphabet ( ), getInitialSymbol ( ), rules );
 	auto second = ext::tie ( other.getTerminalAlphabet ( ), other.getNonterminalAlphabet ( ), other.getInitialSymbol ( ), other.rules );
 
@@ -368,8 +369,8 @@ int CFG < SymbolType >::compare ( const CFG & other ) const {
 	return comp ( first, second );
 }
 
-template < class SymbolType >
-void CFG < SymbolType >::operator >>( std::ostream & out ) const {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void CFG < TerminalSymbolType, NonterminalSymbolType >::operator >>( std::ostream & out ) const {
 	out << "(CFG "
 	    << "nonterminalAlphabet = " << getNonterminalAlphabet ( )
 	    << "terminalAlphabet = " << getTerminalAlphabet ( )
@@ -377,15 +378,15 @@ void CFG < SymbolType >::operator >>( std::ostream & out ) const {
 	    << "rules = " << rules << ")";
 }
 
-template < class SymbolType >
-CFG < SymbolType >::operator std::string ( ) const {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+CFG < TerminalSymbolType, NonterminalSymbolType >::operator std::string ( ) const {
 	std::stringstream ss;
 	ss << * this;
 	return ss.str ( );
 }
 
-template < class SymbolType >
-object::ObjectBase* CFG < SymbolType >::inc() && {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+object::ObjectBase* CFG < TerminalSymbolType, NonterminalSymbolType >::inc() && {
 	return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0));
 }
 
@@ -396,10 +397,11 @@ namespace core {
 /**
  * Helper class specifying constraints for the grammar's internal terminal alphabet component.
  *
- * \tparam SymbolType used for the terminal alphabet of the grammar.
+ * \tparam TerminalSymbolType used for the terminal alphabet of the grammar.
+ * \tparam NonterminalSymbolType used for the nonterminal alphabet, and the initial symbol of the grammar.
  */
-template < class SymbolType >
-class SetConstraint< grammar::CFG < SymbolType >, SymbolType, grammar::TerminalAlphabet > {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+class SetConstraint< grammar::CFG < TerminalSymbolType, NonterminalSymbolType >, TerminalSymbolType, grammar::TerminalAlphabet > {
 public:
 	/**
 	 * Returns true if the terminal symbol is still used in some rule of the grammar.
@@ -409,9 +411,9 @@ public:
 	 *
 	 * \returns true if the symbol is used, false othervise
 	 */
-	static bool used ( const grammar::CFG < SymbolType > & grammar, const SymbolType & symbol ) {
-		for ( const std::pair < const SymbolType, ext::set < ext::vector < SymbolType > > > & rule : grammar.getRules ( ) )
-			for ( const ext::vector < SymbolType > & rhs : rule.second )
+	static bool used ( const grammar::CFG < TerminalSymbolType, NonterminalSymbolType > & grammar, const TerminalSymbolType & symbol ) {
+		for ( const std::pair < const NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > & rule : grammar.getRules ( ) )
+			for ( const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rhs : rule.second )
 				if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.end ( ) )
 					return true;
 
@@ -426,7 +428,7 @@ public:
 	 *
 	 * \returns true
 	 */
-	static bool available ( const grammar::CFG < SymbolType > &, const SymbolType & ) {
+	static bool available ( const grammar::CFG < TerminalSymbolType, NonterminalSymbolType > &, const TerminalSymbolType & ) {
 		return true;
 	}
 
@@ -438,7 +440,7 @@ public:
 	 *
 	 * \throws grammar::GrammarException of the tested symbol is in nonterminal alphabet
 	 */
-	static void valid ( const grammar::CFG < SymbolType > & grammar, const SymbolType & symbol ) {
+	static void valid ( const grammar::CFG < TerminalSymbolType, NonterminalSymbolType > & grammar, const TerminalSymbolType & symbol ) {
 		if ( grammar.template accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ) )
 			throw grammar::GrammarException ( "Symbol " + ext::to_string ( symbol ) + "cannot be in terminal alphabet since it is already nonterminal alphabet" );
 	}
@@ -447,10 +449,11 @@ public:
 /**
  * Helper class specifying constraints for the grammar's internal nonterminal alphabet component.
  *
- * \tparam SymbolType used for the nonterminal alphabet of the grammar.
+ * \tparam TerminalSymbolType used for the terminal alphabet of the grammar.
+ * \tparam NonterminalSymbolType used for the nonterminal alphabet, and the initial symbol of the grammar.
  */
-template < class SymbolType >
-class SetConstraint< grammar::CFG < SymbolType >, SymbolType, grammar::NonterminalAlphabet > {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+class SetConstraint< grammar::CFG < TerminalSymbolType, NonterminalSymbolType >, NonterminalSymbolType, grammar::NonterminalAlphabet > {
 public:
 	/**
 	 * Returns true if the nonterminal symbol is still used in some rule of the grammar or if it is the initial symbol of the grammar.
@@ -460,12 +463,12 @@ public:
 	 *
 	 * \returns true if the symbol is used, false othervise
 	 */
-	static bool used ( const grammar::CFG < SymbolType > & grammar, const SymbolType & symbol ) {
-		for ( const std::pair < const SymbolType, ext::set < ext::vector < SymbolType > > > & rule : grammar.getRules ( ) ) {
+	static bool used ( const grammar::CFG < TerminalSymbolType, NonterminalSymbolType > & grammar, const NonterminalSymbolType & symbol ) {
+		for ( const std::pair < const NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > & rule : grammar.getRules ( ) ) {
 			if ( rule.first == symbol )
 				return true;
 
-			for ( const ext::vector < SymbolType > & rhs : rule.second )
+			for ( const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rhs : rule.second )
 				if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.end ( ) )
 					return true;
 
@@ -485,7 +488,7 @@ public:
 	 *
 	 * \returns true
 	 */
-	static bool available ( const grammar::CFG < SymbolType > &, const SymbolType & ) {
+	static bool available ( const grammar::CFG < TerminalSymbolType, NonterminalSymbolType > &, const NonterminalSymbolType & ) {
 		return true;
 	}
 
@@ -497,7 +500,7 @@ public:
 	 *
 	 * \throws grammar::GrammarException of the tested symbol is in nonterminal alphabet
 	 */
-	static void valid ( const grammar::CFG < SymbolType > & grammar, const SymbolType & symbol ) {
+	static void valid ( const grammar::CFG < TerminalSymbolType, NonterminalSymbolType > & grammar, const NonterminalSymbolType & symbol ) {
 		if ( grammar.template accessComponent < grammar::TerminalAlphabet > ( ).get ( ).count ( symbol ) )
 			throw grammar::GrammarException ( "Symbol " + ext::to_string ( symbol ) + "cannot be in nonterminal alphabet since it is already in terminal alphabet" );
 	}
@@ -506,10 +509,11 @@ public:
 /**
  * Helper class specifying constraints for the grammar's internal initial symbol element.
  *
- * \tparam SymbolType used for the initial symbol of the grammar.
+ * \tparam TerminalSymbolType used for the terminal alphabet of the grammar.
+ * \tparam NonterminalSymbolType used for the nonterminal alphabet, and the initial symbol of the grammar.
  */
-template < class SymbolType >
-class ElementConstraint< grammar::CFG < SymbolType >, SymbolType, grammar::InitialSymbol > {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+class ElementConstraint< grammar::CFG < TerminalSymbolType, NonterminalSymbolType >, NonterminalSymbolType, grammar::InitialSymbol > {
 public:
 	/**
 	 * Returns true if the symbol requested to be initial is available in nonterminal alphabet.
@@ -519,7 +523,7 @@ public:
 	 *
 	 * \returns true if the tested symbol is in nonterminal alphabet
 	 */
-	static bool available ( const grammar::CFG < SymbolType > & grammar, const SymbolType & symbol ) {
+	static bool available ( const grammar::CFG < TerminalSymbolType, NonterminalSymbolType > & grammar, const NonterminalSymbolType & symbol ) {
 		return grammar.template accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol );
 	}
 
@@ -529,7 +533,7 @@ public:
 	 * \param grammar the tested grammar
 	 * \param symbol the tested symbol
 	 */
-	static void valid ( const grammar::CFG < SymbolType > &, const SymbolType & ) {
+	static void valid ( const grammar::CFG < TerminalSymbolType, NonterminalSymbolType > &, const NonterminalSymbolType & ) {
 	}
 };
 
@@ -538,20 +542,20 @@ public:
  *
  * \returns new instance of the grammar with default template parameters or unmodified instance if the template parameters were already default ones
  */
-template < class SymbolType >
-struct normalize < grammar::CFG < SymbolType > > {
-	static grammar::CFG < > eval ( grammar::CFG < SymbolType > && value ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+struct normalize < grammar::CFG < TerminalSymbolType, NonterminalSymbolType > > {
+	static grammar::CFG < > eval ( grammar::CFG < TerminalSymbolType, NonterminalSymbolType > && value ) {
 		ext::set < DefaultSymbolType > nonterminals = alphabet::SymbolNormalize::normalizeAlphabet ( std::move ( value ).getNonterminalAlphabet ( ) );
 		ext::set < DefaultSymbolType > terminals = alphabet::SymbolNormalize::normalizeAlphabet ( std::move ( value ).getTerminalAlphabet ( ) );
 		DefaultSymbolType initialSymbol = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( value ).getInitialSymbol ( ) );
 
 		grammar::CFG < > res ( std::move ( nonterminals ), std::move ( terminals ), std::move ( initialSymbol ) );
 
-		for ( std::pair < SymbolType, ext::set < ext::vector < SymbolType > > > && rule : ext::make_mover ( std::move ( value ).getRules ( ) ) ) {
+		for ( std::pair < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > && rule : ext::make_mover ( std::move ( value ).getRules ( ) ) ) {
 
-			ext::set < ext::vector < DefaultSymbolType > > rhs;
-			for ( ext::vector < SymbolType > && target : ext::make_mover ( rule.second ) )
-				rhs.insert ( alphabet::SymbolNormalize::normalizeSymbols ( std::move ( target ) ) );
+			ext::set < ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > rhs;
+			for ( ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > && target : ext::make_mover ( rule.second ) )
+				rhs.insert ( alphabet::SymbolNormalize::normalizeVariantSymbols ( std::move ( target ) ) );
 
 			DefaultSymbolType lhs = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( rule.first ) );
 
diff --git a/alib2data/src/grammar/ContextFree/CNF.h b/alib2data/src/grammar/ContextFree/CNF.h
index 2c23c845e1..0d80692849 100644
--- a/alib2data/src/grammar/ContextFree/CNF.h
+++ b/alib2data/src/grammar/ContextFree/CNF.h
@@ -61,14 +61,15 @@ class InitialSymbol;
  * P = set of production rules of the form A -> BC or A -> a, where A, B, C \in N and a \in T,
  * S (InitialSymbol) = initial nonterminal symbol,
  *
- * \tparam SymbolType used for the terminal alphabet, the nonterminal alphabet, and the initial symbol of the grammar.
+ * \tparam TerminalSymbolType used for the terminal alphabet of the grammar.
+ * \tparam NonterminalSymbolType used for the nonterminal alphabet, and the initial symbol of the grammar.
  */
-template < class SymbolType = DefaultSymbolType >
-class CNF final : public GrammarBase, public core::Components < CNF < SymbolType >, ext::set < SymbolType >, component::Set, std::tuple < TerminalAlphabet, NonterminalAlphabet >, SymbolType, component::Value, InitialSymbol > {
+template < class TerminalSymbolType = DefaultSymbolType, class NonterminalSymbolType = DefaultSymbolType >
+class CNF final : public GrammarBase, public core::Components < CNF < TerminalSymbolType, NonterminalSymbolType >, ext::set < TerminalSymbolType >, component::Set, TerminalAlphabet, ext::set < NonterminalSymbolType >, component::Set, NonterminalAlphabet, NonterminalSymbolType, component::Value, InitialSymbol > {
 	/**
 	 * Rules function as mapping from nonterminal symbol on the left hand side to a set of sequences of terminal and nonterminal symbols.
 	 */
-	ext::map < SymbolType, ext::set < ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > > > rules;
+	ext::map < NonterminalSymbolType, ext::set < ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > > > rules;
 
 	/**
 	 * Boolean signaling whether grammar generates empty string or don't.
@@ -81,7 +82,7 @@ public:
 	 *
 	 * \param initialSymbol the initial symbol of the grammar
 	 */
-	explicit CNF ( SymbolType initialSymbol );
+	explicit CNF ( NonterminalSymbolType initialSymbol );
 
 	/**
 	 * \brief Creates a new instance of the grammar with a concrete nonterminal alphabet, terminal alphabet and initial symbol.
@@ -90,7 +91,7 @@ public:
 	 * \param terminalSymbols the initial terminal alphabet
 	 * \param initialSymbol the initial symbol of the grammar
 	 */
-	explicit CNF ( ext::set < SymbolType > nonTerminalSymbols, ext::set < SymbolType > terminalSymbols, SymbolType initialSymbol );
+	explicit CNF ( ext::set < NonterminalSymbolType > nonTerminalSymbols, ext::set < TerminalSymbolType > terminalSymbols, NonterminalSymbolType initialSymbol );
 
 	/**
 	 * @copydoc grammar::GrammarBase::clone()
@@ -112,7 +113,7 @@ public:
 	 *
 	 * \returns true if the rule was indeed added, false othervise
 	 */
-	bool addRule ( SymbolType leftHandSide, ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > rightHandSide );
+	bool addRule ( NonterminalSymbolType leftHandSide, ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > rightHandSide );
 
 	/**
 	 * \brief Add a new rule of a grammar.
@@ -124,7 +125,7 @@ public:
 	 *
 	 * \returns true if the rule was indeed added, false othervise
 	 */
-	bool addRule ( SymbolType leftHandSide, SymbolType rightHandSide );
+	bool addRule ( NonterminalSymbolType leftHandSide, TerminalSymbolType rightHandSide );
 
 	/**
 	 * \brief Add a new rule of a grammar.
@@ -136,7 +137,7 @@ public:
 	 *
 	 * \returns true if the rule was indeed added, false othervise
 	 */
-	bool addRule ( SymbolType leftHandSide, ext::pair < SymbolType, SymbolType > rightHandSide );
+	bool addRule ( NonterminalSymbolType leftHandSide, ext::pair < NonterminalSymbolType, NonterminalSymbolType > rightHandSide );
 
 	/**
 	 * \brief Add new rules of a grammar.
@@ -146,21 +147,21 @@ public:
 	 * \param leftHandSide the left hand side of the rule
 	 * \param rightHandSide a set of right hand sides of the rule
 	 */
-	void addRules ( SymbolType leftHandSide, ext::set < ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > > rightHandSide );
+	void addRules ( NonterminalSymbolType leftHandSide, ext::set < ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > > rightHandSide );
 
 	/**
 	 * Get rules of the grammar.
 	 *
 	 * \returns rules of the grammar
 	 */
-	const ext::map < SymbolType, ext::set < ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > > > & getRules ( ) const &;
+	const ext::map < NonterminalSymbolType, ext::set < ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > > > & getRules ( ) const &;
 
 	/**
 	 * Get rules of the grammar.
 	 *
 	 * \returns rules of the grammar
 	 */
-	ext::map < SymbolType, ext::set < ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > > > && getRules ( ) &&;
+	ext::map < NonterminalSymbolType, ext::set < ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > > > && getRules ( ) &&;
 
 	/**
 	 * Remove a rule of a grammar in form of A -> BC or A -> a, where A, B, C \in N and a \in T.
@@ -170,7 +171,7 @@ public:
 	 *
 	 * \returns true if the rule was indeed removed, false othervise
 	 */
-	bool removeRule ( const SymbolType & leftHandSide, const ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > & rightHandSide );
+	bool removeRule ( const NonterminalSymbolType & leftHandSide, const ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > & rightHandSide );
 
 	/**
 	 * Remove a rule of a grammar in form of A -> a, where A \in N and a \in T.
@@ -180,7 +181,7 @@ public:
 	 *
 	 * \returns true if the rule was indeed removed, false othervise
 	 */
-	bool removeRule ( const SymbolType & leftHandSide, const SymbolType & rightHandSide );
+	bool removeRule ( const NonterminalSymbolType & leftHandSide, const TerminalSymbolType & rightHandSide );
 
 	/**
 	 * Remove a rule of a grammar in form of A -> BC, where A, B, C.
@@ -190,14 +191,14 @@ public:
 	 *
 	 * \returns true if the rule was indeed removed, false othervise
 	 */
-	bool removeRule ( const SymbolType & leftHandSide, const ext::pair < SymbolType, SymbolType > & rightHandSide );
+	bool removeRule ( const NonterminalSymbolType & leftHandSide, const ext::pair < NonterminalSymbolType, NonterminalSymbolType > & rightHandSide );
 
 	/**
 	 * Getter of initial symbol.
 	 *
 	 * \returns the initial symbol of the grammar
 	 */
-	const SymbolType & getInitialSymbol ( ) const & {
+	const NonterminalSymbolType & getInitialSymbol ( ) const & {
 		return this->template accessComponent < InitialSymbol > ( ).get ( );
 	}
 
@@ -206,7 +207,7 @@ public:
 	 *
 	 * \returns the initial symbol of the grammar
 	 */
-	SymbolType && getInitialSymbol ( ) && {
+	NonterminalSymbolType && getInitialSymbol ( ) && {
 		return std::move ( this->template accessComponent < InitialSymbol > ( ).get ( ) );
 	}
 
@@ -217,7 +218,7 @@ public:
 	 *
 	 * \returns true if the initial symbol was indeed changed
 	 */
-	bool setInitialSymbol ( SymbolType symbol ) {
+	bool setInitialSymbol ( NonterminalSymbolType symbol ) {
 		return this->template accessComponent < InitialSymbol > ( ).set ( std::move ( symbol ) );
 	}
 
@@ -226,7 +227,7 @@ public:
 	 *
 	 * \returns the nonterminal alphabet of the grammar
 	 */
-	const ext::set < SymbolType > & getNonterminalAlphabet ( ) const & {
+	const ext::set < NonterminalSymbolType > & getNonterminalAlphabet ( ) const & {
 		return this->template accessComponent < NonterminalAlphabet > ( ).get ( );
 	}
 
@@ -235,7 +236,7 @@ public:
 	 *
 	 * \returns the nonterminal alphabet of the grammar
 	 */
-	ext::set < SymbolType > && getNonterminalAlphabet ( ) && {
+	ext::set < NonterminalSymbolType > && getNonterminalAlphabet ( ) && {
 		return std::move ( this->template accessComponent < NonterminalAlphabet > ( ).get ( ) );
 	}
 
@@ -246,7 +247,7 @@ public:
 	 *
 	 * \returns true if the symbol was indeed added
 	 */
-	bool addNonterminalSymbol ( SymbolType symbol ) {
+	bool addNonterminalSymbol ( NonterminalSymbolType symbol ) {
 		return this->template accessComponent < NonterminalAlphabet > ( ).add ( std::move ( symbol ) );
 	}
 
@@ -255,7 +256,7 @@ public:
 	 *
 	 * \param symbols completely new nonterminal alphabet
 	 */
-	void setNonterminalAlphabet ( ext::set < SymbolType > symbols ) {
+	void setNonterminalAlphabet ( ext::set < NonterminalSymbolType > symbols ) {
 		this->template accessComponent < NonterminalAlphabet > ( ).set ( std::move ( symbols ) );
 	}
 
@@ -264,7 +265,7 @@ public:
 	 *
 	 * \returns the terminal alphabet of the grammar
 	 */
-	const ext::set < SymbolType > & getTerminalAlphabet ( ) const & {
+	const ext::set < TerminalSymbolType > & getTerminalAlphabet ( ) const & {
 		return this->template accessComponent < TerminalAlphabet > ( ).get ( );
 	}
 
@@ -273,7 +274,7 @@ public:
 	 *
 	 * \returns the terminal alphabet of the grammar
 	 */
-	ext::set < SymbolType > && getTerminalAlphabet ( ) && {
+	ext::set < TerminalSymbolType > && getTerminalAlphabet ( ) && {
 		return std::move ( this->template accessComponent < TerminalAlphabet > ( ).get ( ) );
 	}
 
@@ -284,7 +285,7 @@ public:
 	 *
 	 * \returns true if the symbol was indeed added
 	 */
-	bool addTerminalSymbol ( SymbolType symbol ) {
+	bool addTerminalSymbol ( TerminalSymbolType symbol ) {
 		return this->template accessComponent < TerminalAlphabet > ( ).add ( std::move ( symbol ) );
 	}
 
@@ -293,7 +294,7 @@ public:
 	 *
 	 * \param symbol completely new nontemrinal alphabet
 	 */
-	void setTerminalAlphabet ( ext::set < SymbolType > symbols ) {
+	void setTerminalAlphabet ( ext::set < TerminalSymbolType > symbols ) {
 		this->template accessComponent < TerminalAlphabet > ( ).set ( std::move ( symbols ) );
 	}
 
@@ -345,34 +346,34 @@ public:
 	virtual object::ObjectBase * inc ( ) && override;
 };
 
-template < class SymbolType >
-CNF < SymbolType >::CNF ( SymbolType initialSymbol ) : CNF ( ext::set < SymbolType > { initialSymbol }, ext::set < SymbolType > ( ), initialSymbol ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+CNF < TerminalSymbolType, NonterminalSymbolType >::CNF ( NonterminalSymbolType initialSymbol ) : CNF ( ext::set < NonterminalSymbolType > { initialSymbol }, ext::set < TerminalSymbolType > ( ), initialSymbol ) {
 }
 
-template < class SymbolType >
-CNF < SymbolType >::CNF ( ext::set < SymbolType > nonterminalAlphabet, ext::set < SymbolType > terminalAlphabet, SymbolType initialSymbol ) : core::Components < CNF, ext::set < SymbolType >, component::Set, std::tuple < TerminalAlphabet, NonterminalAlphabet >, SymbolType, component::Value, InitialSymbol > ( std::move ( terminalAlphabet), std::move ( nonterminalAlphabet ), std::move ( initialSymbol ) ), generatesEpsilon ( false ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+CNF < TerminalSymbolType, NonterminalSymbolType >::CNF ( ext::set < NonterminalSymbolType > nonterminalAlphabet, ext::set < TerminalSymbolType > terminalAlphabet, NonterminalSymbolType initialSymbol ) : core::Components < CNF, ext::set < TerminalSymbolType >, component::Set, TerminalAlphabet, ext::set < NonterminalSymbolType >, component::Set, NonterminalAlphabet, NonterminalSymbolType, component::Value, InitialSymbol > ( std::move ( terminalAlphabet), std::move ( nonterminalAlphabet ), std::move ( initialSymbol ) ), generatesEpsilon ( false ) {
 }
 
-template < class SymbolType >
-GrammarBase * CNF < SymbolType >::clone ( ) const & {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+GrammarBase * CNF < TerminalSymbolType, NonterminalSymbolType >::clone ( ) const & {
 	return new CNF ( * this );
 }
 
-template < class SymbolType >
-GrammarBase * CNF < SymbolType >::clone ( ) && {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+GrammarBase * CNF < TerminalSymbolType, NonterminalSymbolType >::clone ( ) && {
 	return new CNF ( std::move ( * this ) );
 }
 
-template < class SymbolType >
-bool CNF < SymbolType >::addRule ( SymbolType leftHandSide, ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > rightHandSide ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+bool CNF < TerminalSymbolType, NonterminalSymbolType >::addRule ( NonterminalSymbolType leftHandSide, ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > rightHandSide ) {
 	if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) )
 		throw GrammarException ( "Rule must rewrite nonterminal symbol" );
 
-	if ( rightHandSide.template is < SymbolType > ( ) ) {
-		if ( !getTerminalAlphabet ( ).count ( rightHandSide.template get < SymbolType > ( ) ) )
+	if ( rightHandSide.template is < TerminalSymbolType > ( ) ) {
+		if ( !getTerminalAlphabet ( ).count ( rightHandSide.template get < TerminalSymbolType > ( ) ) )
 			throw GrammarException ( "Rule must rewrite to terminal symbol" );
 	} else {
-		const ext::pair < SymbolType, SymbolType > rhs = rightHandSide.template get < ext::pair < SymbolType, SymbolType > > ( );
+		const ext::pair < NonterminalSymbolType, NonterminalSymbolType > rhs = rightHandSide.template get < ext::pair < NonterminalSymbolType, NonterminalSymbolType > > ( );
 
 		if ( !getNonterminalAlphabet ( ).count ( rhs.first ) )
 			throw GrammarException ( "Symbol \"" + ext::to_string ( rhs.first ) + "\" is not a nonterminal symbol" );
@@ -384,31 +385,31 @@ bool CNF < SymbolType >::addRule ( SymbolType leftHandSide, ext::variant < Symbo
 	return rules[std::move ( leftHandSide )].insert ( std::move ( rightHandSide ) ).second;
 }
 
-template < class SymbolType >
-bool CNF < SymbolType >::addRule ( SymbolType leftHandSide, SymbolType rightHandSide ) {
-	ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > rhs ( std::move ( rightHandSide ) );
+template < class TerminalSymbolType, class NonterminalSymbolType >
+bool CNF < TerminalSymbolType, NonterminalSymbolType >::addRule ( NonterminalSymbolType leftHandSide, TerminalSymbolType rightHandSide ) {
+	ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > rhs ( std::move ( rightHandSide ) );
 
 	return addRule ( std::move ( leftHandSide ), std::move ( rhs ) );
 }
 
-template < class SymbolType >
-bool CNF < SymbolType >::addRule ( SymbolType leftHandSide, ext::pair < SymbolType, SymbolType > rightHandSide ) {
-	ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > rhs ( std::move ( rightHandSide ) );
+template < class TerminalSymbolType, class NonterminalSymbolType >
+bool CNF < TerminalSymbolType, NonterminalSymbolType >::addRule ( NonterminalSymbolType leftHandSide, ext::pair < NonterminalSymbolType, NonterminalSymbolType > rightHandSide ) {
+	ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > rhs ( std::move ( rightHandSide ) );
 
 	return addRule ( std::move ( leftHandSide ), std::move ( rhs ) );
 }
 
-template < class SymbolType >
-void CNF < SymbolType >::addRules ( SymbolType leftHandSide, ext::set < ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > > rightHandSide ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void CNF < TerminalSymbolType, NonterminalSymbolType >::addRules ( NonterminalSymbolType leftHandSide, ext::set < ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > > rightHandSide ) {
 	if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) )
 		throw GrammarException ( "Rule must rewrite nonterminal symbol" );
 
-	for ( const ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > & element : rightHandSide ) {
-		if ( element.template is < SymbolType > ( ) ) {
-			if ( !getTerminalAlphabet ( ).count ( element.template get < SymbolType > ( ) ) )
+	for ( const ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > & element : rightHandSide ) {
+		if ( element.template is < TerminalSymbolType > ( ) ) {
+			if ( !getTerminalAlphabet ( ).count ( element.template get < TerminalSymbolType > ( ) ) )
 				throw GrammarException ( "Rule must rewrite to terminal symbol" );
 		} else {
-			const ext::pair < SymbolType, SymbolType > rhs = element.template get < ext::pair < SymbolType, SymbolType > > ( );
+			const ext::pair < NonterminalSymbolType, NonterminalSymbolType > rhs = element.template get < ext::pair < NonterminalSymbolType, NonterminalSymbolType > > ( );
 
 			if ( !getNonterminalAlphabet ( ).count ( rhs.first ) )
 				throw GrammarException ( "Symbol \"" + ext::to_string ( rhs.first ) + "\" is not a nonterminal symbol" );
@@ -421,47 +422,47 @@ void CNF < SymbolType >::addRules ( SymbolType leftHandSide, ext::set < ext::var
 	rules[std::move ( leftHandSide )].insert ( ext::make_mover ( rightHandSide ).begin ( ), ext::make_mover ( rightHandSide ).end ( ) );
 }
 
-template < class SymbolType >
-const ext::map < SymbolType, ext::set < ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > > > & CNF < SymbolType >::getRules ( ) const & {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+const ext::map < NonterminalSymbolType, ext::set < ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > > > & CNF < TerminalSymbolType, NonterminalSymbolType >::getRules ( ) const & {
 	return rules;
 }
 
-template < class SymbolType >
-ext::map < SymbolType, ext::set < ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > > > && CNF < SymbolType >::getRules ( ) && {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+ext::map < NonterminalSymbolType, ext::set < ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > > > && CNF < TerminalSymbolType, NonterminalSymbolType >::getRules ( ) && {
 	return std::move ( rules );
 }
 
-template < class SymbolType >
-bool CNF < SymbolType >::removeRule ( const SymbolType & leftHandSide, const ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > & rightHandSide ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+bool CNF < TerminalSymbolType, NonterminalSymbolType >::removeRule ( const NonterminalSymbolType & leftHandSide, const ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > & rightHandSide ) {
 	return rules[leftHandSide].erase ( rightHandSide );
 }
 
-template < class SymbolType >
-bool CNF < SymbolType >::removeRule ( const SymbolType & leftHandSide, const SymbolType & rightHandSide ) {
-	ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > rhs ( rightHandSide );
+template < class TerminalSymbolType, class NonterminalSymbolType >
+bool CNF < TerminalSymbolType, NonterminalSymbolType >::removeRule ( const NonterminalSymbolType & leftHandSide, const TerminalSymbolType & rightHandSide ) {
+	ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > rhs ( rightHandSide );
 
 	return removeRule ( leftHandSide, rhs );
 }
 
-template < class SymbolType >
-bool CNF < SymbolType >::removeRule ( const SymbolType & leftHandSide, const ext::pair < SymbolType, SymbolType > & rightHandSide ) {
-	ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > rhs ( rightHandSide );
+template < class TerminalSymbolType, class NonterminalSymbolType >
+bool CNF < TerminalSymbolType, NonterminalSymbolType >::removeRule ( const NonterminalSymbolType & leftHandSide, const ext::pair < NonterminalSymbolType, NonterminalSymbolType > & rightHandSide ) {
+	ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > rhs ( rightHandSide );
 
 	return removeRule ( leftHandSide, rhs );
 }
 
-template < class SymbolType >
-void CNF < SymbolType >::setGeneratesEpsilon ( bool genEps ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void CNF < TerminalSymbolType, NonterminalSymbolType >::setGeneratesEpsilon ( bool genEps ) {
 	generatesEpsilon = genEps;
 }
 
-template < class SymbolType >
-bool CNF < SymbolType >::getGeneratesEpsilon ( ) const {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+bool CNF < TerminalSymbolType, NonterminalSymbolType >::getGeneratesEpsilon ( ) const {
 	return generatesEpsilon;
 }
 
-template < class SymbolType >
-int CNF < SymbolType >::compare ( const CNF & other ) const {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+int CNF < TerminalSymbolType, NonterminalSymbolType >::compare ( const CNF & other ) const {
 	auto first = ext::tie ( getTerminalAlphabet ( ), getNonterminalAlphabet ( ), getInitialSymbol ( ), rules );
 	auto second = ext::tie ( other.getTerminalAlphabet ( ), other.getNonterminalAlphabet ( ), other.getInitialSymbol ( ), other.rules );
 
@@ -470,8 +471,8 @@ int CNF < SymbolType >::compare ( const CNF & other ) const {
 	return comp ( first, second );
 }
 
-template < class SymbolType >
-void CNF < SymbolType >::operator >>( std::ostream & out ) const {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void CNF < TerminalSymbolType, NonterminalSymbolType >::operator >>( std::ostream & out ) const {
 	out << "(CNF "
 	    << "nonterminalAlphabet = " << getNonterminalAlphabet ( )
 	    << "terminalAlphabet = " << getTerminalAlphabet ( )
@@ -480,15 +481,15 @@ void CNF < SymbolType >::operator >>( std::ostream & out ) const {
 	    << "generatesEpsilon = " << generatesEpsilon << ")";
 }
 
-template < class SymbolType >
-CNF < SymbolType >::operator std::string ( ) const {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+CNF < TerminalSymbolType, NonterminalSymbolType >::operator std::string ( ) const {
 	std::stringstream ss;
 	ss << * this;
 	return ss.str ( );
 }
 
-template < class SymbolType >
-object::ObjectBase* CNF < SymbolType >::inc() && {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+object::ObjectBase* CNF < TerminalSymbolType, NonterminalSymbolType >::inc() && {
 	return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0));
 }
 
@@ -499,10 +500,11 @@ namespace core {
 /**
  * Helper class specifying constraints for the grammar's internal terminal alphabet component.
  *
- * \tparam SymbolType used for the terminal alphabet of the grammar.
+ * \tparam TerminalSymbolType used for the terminal alphabet of the grammar.
+ * \tparam NonterminalSymbolType used for the nonterminal alphabet, and the initial symbol of the grammar.
  */
-template < class SymbolType >
-class SetConstraint< grammar::CNF < SymbolType >, SymbolType, grammar::TerminalAlphabet > {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+class SetConstraint< grammar::CNF < TerminalSymbolType, NonterminalSymbolType >, TerminalSymbolType, grammar::TerminalAlphabet > {
 public:
 	/**
 	 * Returns true if the terminal symbol is still used in some rule of the grammar.
@@ -512,10 +514,10 @@ public:
 	 *
 	 * \returns true if the symbol is used, false othervise
 	 */
-	static bool used ( const grammar::CNF < SymbolType > & grammar, const SymbolType & symbol ) {
-		for ( const std::pair < const SymbolType, ext::set < ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > > > & rule : grammar.getRules ( ) )
-			for ( const ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > & rhs : rule.second )
-				if ( ( rhs.template is < SymbolType > ( ) && ( rhs.template get < SymbolType > ( ) == symbol ) ) )
+	static bool used ( const grammar::CNF < TerminalSymbolType, NonterminalSymbolType > & grammar, const TerminalSymbolType & symbol ) {
+		for ( const std::pair < const NonterminalSymbolType, ext::set < ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > > > & rule : grammar.getRules ( ) )
+			for ( const ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > & rhs : rule.second )
+				if ( ( rhs.template is < TerminalSymbolType > ( ) && ( rhs.template get < TerminalSymbolType > ( ) == symbol ) ) )
 					return true;
 
 		return false;
@@ -529,7 +531,7 @@ public:
 	 *
 	 * \returns true
 	 */
-	static bool available ( const grammar::CNF < SymbolType > &, const SymbolType & ) {
+	static bool available ( const grammar::CNF < TerminalSymbolType, NonterminalSymbolType > &, const TerminalSymbolType & ) {
 		return true;
 	}
 
@@ -541,7 +543,7 @@ public:
 	 *
 	 * \throws grammar::GrammarException of the tested symbol is in nonterminal alphabet
 	 */
-	static void valid ( const grammar::CNF < SymbolType > & grammar, const SymbolType & symbol ) {
+	static void valid ( const grammar::CNF < TerminalSymbolType, NonterminalSymbolType > & grammar, const TerminalSymbolType & symbol ) {
 		if ( grammar.template accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ) )
 			throw grammar::GrammarException ( "Symbol " + ext::to_string ( symbol ) + "cannot be in terminal alphabet since it is already nonterminal alphabet" );
 	}
@@ -550,10 +552,11 @@ public:
 /**
  * Helper class specifying constraints for the grammar's internal nonterminal alphabet component.
  *
- * \tparam SymbolType used for the nonterminal alphabet of the grammar.
+ * \tparam TerminalSymbolType used for the terminal alphabet of the grammar.
+ * \tparam NonterminalSymbolType used for the nonterminal alphabet, and the initial symbol of the grammar.
  */
-template < class SymbolType >
-class SetConstraint< grammar::CNF < SymbolType >, SymbolType, grammar::NonterminalAlphabet > {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+class SetConstraint< grammar::CNF < TerminalSymbolType, NonterminalSymbolType >, NonterminalSymbolType, grammar::NonterminalAlphabet > {
 public:
 	/**
 	 * Returns true if the nonterminal symbol is still used in some rule of the grammar or if it is the initial symbol of the grammar.
@@ -563,16 +566,16 @@ public:
 	 *
 	 * \returns true if the symbol is used, false othervise
 	 */
-	static bool used ( const grammar::CNF < SymbolType > & grammar, const SymbolType & symbol ) {
-		for ( const std::pair < const SymbolType, ext::set < ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > > > & rule : grammar.getRules ( ) ) {
+	static bool used ( const grammar::CNF < TerminalSymbolType, NonterminalSymbolType > & grammar, const NonterminalSymbolType & symbol ) {
+		for ( const std::pair < const NonterminalSymbolType, ext::set < ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > > > & rule : grammar.getRules ( ) ) {
 			if ( rule.first == symbol )
 				return true;
 
-			for ( const ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > & rhs : rule.second ) {
-				if ( rhs.template is < SymbolType > ( ) )
+			for ( const ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > & rhs : rule.second ) {
+				if ( rhs.template is < TerminalSymbolType > ( ) )
 					continue;
 
-				if ( rhs.template get < ext::pair < SymbolType, SymbolType > > ( ).first == symbol || rhs.template get < ext::pair < SymbolType, SymbolType > > ( ).second == symbol )
+				if ( rhs.template get < ext::pair < NonterminalSymbolType, NonterminalSymbolType > > ( ).first == symbol || rhs.template get < ext::pair < NonterminalSymbolType, NonterminalSymbolType > > ( ).second == symbol )
 					return true;
 			}
 
@@ -592,7 +595,7 @@ public:
 	 *
 	 * \returns true
 	 */
-	static bool available ( const grammar::CNF < SymbolType > &, const SymbolType & ) {
+	static bool available ( const grammar::CNF < TerminalSymbolType, NonterminalSymbolType > &, const NonterminalSymbolType & ) {
 		return true;
 	}
 
@@ -604,7 +607,7 @@ public:
 	 *
 	 * \throws grammar::GrammarException of the tested symbol is in nonterminal alphabet
 	 */
-	static void valid ( const grammar::CNF < SymbolType > & grammar, const SymbolType & symbol ) {
+	static void valid ( const grammar::CNF < TerminalSymbolType, NonterminalSymbolType > & grammar, const NonterminalSymbolType & symbol ) {
 		if ( grammar.template accessComponent < grammar::TerminalAlphabet > ( ).get ( ).count ( symbol ) )
 			throw grammar::GrammarException ( "Symbol " + ext::to_string ( symbol ) + "cannot be in nonterminal alphabet since it is already in terminal alphabet" );
 	}
@@ -613,10 +616,11 @@ public:
 /**
  * Helper class specifying constraints for the grammar's internal initial symbol element.
  *
- * \tparam SymbolType used for the initial symbol of the grammar.
+ * \tparam TerminalSymbolType used for the terminal alphabet of the grammar.
+ * \tparam NonterminalSymbolType used for the nonterminal alphabet, and the initial symbol of the grammar.
  */
-template < class SymbolType >
-class ElementConstraint< grammar::CNF < SymbolType >, SymbolType, grammar::InitialSymbol > {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+class ElementConstraint< grammar::CNF < TerminalSymbolType, NonterminalSymbolType >, NonterminalSymbolType, grammar::InitialSymbol > {
 public:
 	/**
 	 * Returns true if the symbol requested to be initial is available in nonterminal alphabet.
@@ -626,7 +630,7 @@ public:
 	 *
 	 * \returns true if the tested symbol is in nonterminal alphabet
 	 */
-	static bool available ( const grammar::CNF < SymbolType > & grammar, const SymbolType & symbol ) {
+	static bool available ( const grammar::CNF < TerminalSymbolType, NonterminalSymbolType > & grammar, const NonterminalSymbolType & symbol ) {
 		return grammar.template accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol );
 	}
 
@@ -636,7 +640,7 @@ public:
 	 * \param grammar the tested grammar
 	 * \param symbol the tested symbol
 	 */
-	static void valid ( const grammar::CNF < SymbolType > &, const SymbolType & ) {
+	static void valid ( const grammar::CNF < TerminalSymbolType, NonterminalSymbolType > &, const NonterminalSymbolType & ) {
 	}
 };
 
@@ -645,19 +649,19 @@ public:
  *
  * \returns new instance of the grammar with default template parameters or unmodified instance if the template parameters were already default ones
  */
-template < class SymbolType >
-struct normalize < grammar::CNF < SymbolType > > {
-	static grammar::CNF < > eval ( grammar::CNF < SymbolType > && value ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+struct normalize < grammar::CNF < TerminalSymbolType, NonterminalSymbolType > > {
+	static grammar::CNF < > eval ( grammar::CNF < TerminalSymbolType, NonterminalSymbolType > && value ) {
 		ext::set < DefaultSymbolType > nonterminals = alphabet::SymbolNormalize::normalizeAlphabet ( std::move ( value ).getNonterminalAlphabet ( ) );
 		ext::set < DefaultSymbolType > terminals = alphabet::SymbolNormalize::normalizeAlphabet ( std::move ( value ).getTerminalAlphabet ( ) );
 		DefaultSymbolType initialSymbol = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( value ).getInitialSymbol ( ) );
 
 		grammar::CNF < > res ( std::move ( nonterminals ), std::move ( terminals ), std::move ( initialSymbol ) );
 
-		for ( std::pair < SymbolType, ext::set < ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > > > && rule : ext::make_mover ( std::move ( value ).getRules ( ) ) ) {
+		for ( std::pair < NonterminalSymbolType, ext::set < ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > > > && rule : ext::make_mover ( std::move ( value ).getRules ( ) ) ) {
 
 			ext::set < ext::variant < DefaultSymbolType, ext::pair < DefaultSymbolType, DefaultSymbolType > > > rhs;
-			for ( ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > && target : ext::make_mover ( rule.second ) )
+			for ( ext::variant < TerminalSymbolType, ext::pair < NonterminalSymbolType, NonterminalSymbolType > > && target : ext::make_mover ( rule.second ) )
 				rhs.insert ( grammar::GrammarNormalize::normalizeRHS ( std::move ( target ) ) );
 
 			DefaultSymbolType lhs = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( rule.first ) );
diff --git a/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.h b/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.h
index 6e4e36ae9b..91a33f2bc1 100644
--- a/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.h
+++ b/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.h
@@ -60,14 +60,15 @@ class InitialSymbol;
  * P = set of production rules of the form A -> B, where A \in N and B \in ( N \cup T )+,
  * S (InitialSymbol) = initial nonterminal symbol,
  *
- * \tparam SymbolType used for the terminal alphabet, the nonterminal alphabet, and the initial symbol of the grammar.
+ * \tparam TerminalSymbolType used for the terminal alphabet of the grammar.
+ * \tparam NonterminalSymbolType used for the nonterminal alphabet, and the initial symbol of the grammar.
  */
-template < class SymbolType = DefaultSymbolType >
-class EpsilonFreeCFG final : public GrammarBase, public core::Components < EpsilonFreeCFG < SymbolType >, ext::set < SymbolType >, component::Set, std::tuple < TerminalAlphabet, NonterminalAlphabet >, SymbolType, component::Value, InitialSymbol > {
+template < class TerminalSymbolType = DefaultSymbolType, class NonterminalSymbolType = DefaultSymbolType >
+class EpsilonFreeCFG final : public GrammarBase, public core::Components < EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >, ext::set < TerminalSymbolType >, component::Set, TerminalAlphabet, ext::set < NonterminalSymbolType >, component::Set, NonterminalAlphabet, NonterminalSymbolType, component::Value, InitialSymbol > {
 	/**
 	 * Rules function as mapping from nonterminal symbol on the left hand side to a set of sequences of terminal and nonterminal symbols.
 	 */
-	ext::map < SymbolType, ext::set < ext::vector < SymbolType > > > rules;
+	ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > rules;
 
 	/**
 	 * Boolean signaling whether grammar generates empty string or don't.
@@ -80,7 +81,7 @@ public:
 	 *
 	 * \param initialSymbol the initial symbol of the grammar
 	 */
-	explicit EpsilonFreeCFG ( SymbolType initialSymbol );
+	explicit EpsilonFreeCFG ( NonterminalSymbolType initialSymbol );
 
 	/**
 	 * \brief Creates a new instance of the grammar with a concrete nonterminal alphabet, terminal alphabet and initial symbol.
@@ -89,7 +90,7 @@ public:
 	 * \param terminalSymbols the initial terminal alphabet
 	 * \param initialSymbol the initial symbol of the grammar
 	 */
-	explicit EpsilonFreeCFG ( ext::set < SymbolType > nonTerminalSymbols, ext::set < SymbolType > terminalSymbols, SymbolType initialSymbol );
+	explicit EpsilonFreeCFG ( ext::set < NonterminalSymbolType > nonTerminalSymbols, ext::set < TerminalSymbolType > terminalSymbols, NonterminalSymbolType initialSymbol );
 
 	/**
 	 * @copydoc grammar::GrammarBase::clone()
@@ -111,7 +112,7 @@ public:
 	 *
 	 * \returns true if the rule was indeed added, false othervise
 	 */
-	bool addRule ( SymbolType leftHandSide, ext::vector < SymbolType > rightHandSide );
+	bool addRule ( NonterminalSymbolType leftHandSide, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rightHandSide );
 
 	/**
 	 * \brief Add new rules of a grammar.
@@ -121,21 +122,21 @@ public:
 	 * \param leftHandSide the left hand side of the rule
 	 * \param rightHandSide a set of right hand sides of the rule
 	 */
-	void addRules ( SymbolType leftHandSide, ext::set < ext::vector < SymbolType > > rightHandSide );
+	void addRules ( NonterminalSymbolType leftHandSide, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > rightHandSide );
 
 	/**
 	 * Get rules of the grammar.
 	 *
 	 * \returns rules of the grammar
 	 */
-	const ext::map < SymbolType, ext::set < ext::vector < SymbolType > > > & getRules ( ) const &;
+	const ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > & getRules ( ) const &;
 
 	/**
 	 * Get rules of the grammar.
 	 *
 	 * \returns rules of the grammar
 	 */
-	ext::map < SymbolType, ext::set < ext::vector < SymbolType > > > && getRules ( ) &&;
+	ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > && getRules ( ) &&;
 
 	/**
 	 * Remove a rule of a grammar in form of A -> B, where A \in N and B \in (N \cup T)+.
@@ -145,14 +146,14 @@ public:
 	 *
 	 * \returns true if the rule was indeed removed, false othervise
 	 */
-	bool removeRule ( const SymbolType & leftHandSide, const ext::vector < SymbolType > & rightHandSide );
+	bool removeRule ( const NonterminalSymbolType & leftHandSide, const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rightHandSide );
 
 	/**
 	 * Getter of initial symbol.
 	 *
 	 * \returns the initial symbol of the grammar
 	 */
-	const SymbolType & getInitialSymbol ( ) const & {
+	const NonterminalSymbolType & getInitialSymbol ( ) const & {
 		return this->template accessComponent < InitialSymbol > ( ).get ( );
 	}
 
@@ -161,7 +162,7 @@ public:
 	 *
 	 * \returns the initial symbol of the grammar
 	 */
-	SymbolType && getInitialSymbol ( ) && {
+	NonterminalSymbolType && getInitialSymbol ( ) && {
 		return std::move ( this->template accessComponent < InitialSymbol > ( ).get ( ) );
 	}
 
@@ -172,7 +173,7 @@ public:
 	 *
 	 * \returns true if the initial symbol was indeed changed
 	 */
-	bool setInitialSymbol ( SymbolType symbol ) {
+	bool setInitialSymbol ( NonterminalSymbolType symbol ) {
 		return this->template accessComponent < InitialSymbol > ( ).set ( std::move ( symbol ) );
 	}
 
@@ -181,7 +182,7 @@ public:
 	 *
 	 * \returns the nonterminal alphabet of the grammar
 	 */
-	const ext::set < SymbolType > & getNonterminalAlphabet ( ) const & {
+	const ext::set < NonterminalSymbolType > & getNonterminalAlphabet ( ) const & {
 		return this->template accessComponent < NonterminalAlphabet > ( ).get ( );
 	}
 
@@ -190,7 +191,7 @@ public:
 	 *
 	 * \returns the nonterminal alphabet of the grammar
 	 */
-	ext::set < SymbolType > && getNonterminalAlphabet ( ) && {
+	ext::set < NonterminalSymbolType > && getNonterminalAlphabet ( ) && {
 		return std::move ( this->template accessComponent < NonterminalAlphabet > ( ).get ( ) );
 	}
 
@@ -201,7 +202,7 @@ public:
 	 *
 	 * \returns true if the symbol was indeed added
 	 */
-	bool addNonterminalSymbol ( SymbolType symbol ) {
+	bool addNonterminalSymbol ( NonterminalSymbolType symbol ) {
 		return this->template accessComponent < NonterminalAlphabet > ( ).add ( std::move ( symbol ) );
 	}
 
@@ -210,7 +211,7 @@ public:
 	 *
 	 * \param symbols completely new nonterminal alphabet
 	 */
-	void setNonterminalAlphabet ( ext::set < SymbolType > symbols ) {
+	void setNonterminalAlphabet ( ext::set < NonterminalSymbolType > symbols ) {
 		this->template accessComponent < NonterminalAlphabet > ( ).set ( std::move ( symbols ) );
 	}
 
@@ -219,7 +220,7 @@ public:
 	 *
 	 * \returns the terminal alphabet of the grammar
 	 */
-	const ext::set < SymbolType > & getTerminalAlphabet ( ) const & {
+	const ext::set < TerminalSymbolType > & getTerminalAlphabet ( ) const & {
 		return this->template accessComponent < TerminalAlphabet > ( ).get ( );
 	}
 
@@ -228,7 +229,7 @@ public:
 	 *
 	 * \returns the terminal alphabet of the grammar
 	 */
-	ext::set < SymbolType > && getTerminalAlphabet ( ) && {
+	ext::set < TerminalSymbolType > && getTerminalAlphabet ( ) && {
 		return std::move ( this->template accessComponent < TerminalAlphabet > ( ).get ( ) );
 	}
 
@@ -239,7 +240,7 @@ public:
 	 *
 	 * \returns true if the symbol was indeed added
 	 */
-	bool addTerminalSymbol ( SymbolType symbol ) {
+	bool addTerminalSymbol ( TerminalSymbolType symbol ) {
 		return this->template accessComponent < TerminalAlphabet > ( ).add ( std::move ( symbol ) );
 	}
 
@@ -248,7 +249,7 @@ public:
 	 *
 	 * \param symbol completely new nontemrinal alphabet
 	 */
-	void setTerminalAlphabet ( ext::set < SymbolType > symbols ) {
+	void setTerminalAlphabet ( ext::set < TerminalSymbolType > symbols ) {
 		this->template accessComponent < TerminalAlphabet > ( ).set ( std::move ( symbols ) );
 	}
 
@@ -300,49 +301,49 @@ public:
 	virtual object::ObjectBase * inc ( ) && override;
 };
 
-template < class SymbolType >
-EpsilonFreeCFG < SymbolType >::EpsilonFreeCFG ( SymbolType initialSymbol ) : EpsilonFreeCFG ( ext::set < SymbolType > { initialSymbol }, ext::set < SymbolType > ( ), initialSymbol ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >::EpsilonFreeCFG ( NonterminalSymbolType initialSymbol ) : EpsilonFreeCFG ( ext::set < NonterminalSymbolType > { initialSymbol }, ext::set < TerminalSymbolType > ( ), initialSymbol ) {
 }
 
-template < class SymbolType >
-EpsilonFreeCFG < SymbolType >::EpsilonFreeCFG ( ext::set < SymbolType > nonterminalAlphabet, ext::set < SymbolType > terminalAlphabet, SymbolType initialSymbol ) : core::Components < EpsilonFreeCFG, ext::set < SymbolType >, component::Set, std::tuple < TerminalAlphabet, NonterminalAlphabet >, SymbolType, component::Value, InitialSymbol > ( std::move ( terminalAlphabet), std::move ( nonterminalAlphabet ), std::move ( initialSymbol ) ), generatesEpsilon ( false ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >::EpsilonFreeCFG ( ext::set < NonterminalSymbolType > nonterminalAlphabet, ext::set < TerminalSymbolType > terminalAlphabet, NonterminalSymbolType initialSymbol ) : core::Components < EpsilonFreeCFG, ext::set < TerminalSymbolType >, component::Set, TerminalAlphabet, ext::set < NonterminalSymbolType >, component::Set, NonterminalAlphabet, NonterminalSymbolType, component::Value, InitialSymbol > ( std::move ( terminalAlphabet), std::move ( nonterminalAlphabet ), std::move ( initialSymbol ) ), generatesEpsilon ( false ) {
 }
 
-template < class SymbolType >
-GrammarBase * EpsilonFreeCFG < SymbolType >::clone ( ) const & {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+GrammarBase * EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >::clone ( ) const & {
 	return new EpsilonFreeCFG ( * this );
 }
 
-template < class SymbolType >
-GrammarBase * EpsilonFreeCFG < SymbolType >::clone ( ) && {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+GrammarBase * EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >::clone ( ) && {
 	return new EpsilonFreeCFG ( std::move ( * this ) );
 }
 
-template < class SymbolType >
-bool EpsilonFreeCFG < SymbolType >::addRule ( SymbolType leftHandSide, ext::vector < SymbolType > rightHandSide ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+bool EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >::addRule ( NonterminalSymbolType leftHandSide, ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rightHandSide ) {
 	if ( rightHandSide.size ( ) == 0 )
 		throw GrammarException ( "Epsilon rule is not allowed" );
 
 	if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) )
 		throw GrammarException ( "Rule must rewrite nonterminal symbol" );
 
-	for ( const SymbolType & symbol : rightHandSide )
+	for ( const ext::variant < TerminalSymbolType, NonterminalSymbolType > & symbol : rightHandSide )
 		if ( !getTerminalAlphabet ( ).count ( symbol ) && !getNonterminalAlphabet ( ).count ( symbol ) )
 			throw GrammarException ( "Symbol \"" + ext::to_string ( symbol ) + "\" is not neither terminal nor nonterminal symbol" );
 
 	return rules[std::move ( leftHandSide )].insert ( std::move ( rightHandSide ) ).second;
 }
 
-template < class SymbolType >
-void EpsilonFreeCFG < SymbolType >::addRules ( SymbolType leftHandSide, ext::set < ext::vector < SymbolType > > rightHandSide ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >::addRules ( NonterminalSymbolType leftHandSide, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > rightHandSide ) {
 	if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) )
 		throw GrammarException ( "Rule must rewrite nonterminal symbol" );
 
-	for ( const ext::vector < SymbolType > & rhs : rightHandSide ) {
+	for ( const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rhs : rightHandSide ) {
 		if ( rhs.size ( ) == 0 )
 			throw GrammarException ( "Epsilon rule is not allowed" );
 
-		for ( const SymbolType & symbol : rhs )
+		for ( const ext::variant < TerminalSymbolType, NonterminalSymbolType > & symbol : rhs )
 			if ( ! getTerminalAlphabet ( ).count ( symbol ) && ! getNonterminalAlphabet ( ).count ( symbol ) )
 				throw GrammarException ( "Symbol \"" + ext::to_string ( symbol ) + "\" is not neither terminal nor nonterminal symbol" );
 	}
@@ -350,33 +351,33 @@ void EpsilonFreeCFG < SymbolType >::addRules ( SymbolType leftHandSide, ext::set
 	rules [ std::move ( leftHandSide ) ].insert ( ext::make_mover ( rightHandSide ).begin ( ), ext::make_mover ( rightHandSide ).end ( ) );
 }
 
-template < class SymbolType >
-const ext::map < SymbolType, ext::set < ext::vector < SymbolType > > > & EpsilonFreeCFG < SymbolType >::getRules ( ) const & {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+const ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > & EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >::getRules ( ) const & {
 	return rules;
 }
 
-template < class SymbolType >
-ext::map < SymbolType, ext::set < ext::vector < SymbolType > > > && EpsilonFreeCFG < SymbolType >::getRules ( ) && {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > && EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >::getRules ( ) && {
 	return std::move ( rules );
 }
 
-template < class SymbolType >
-bool EpsilonFreeCFG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const ext::vector < SymbolType > & rightHandSide ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+bool EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >::removeRule ( const NonterminalSymbolType & leftHandSide, const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rightHandSide ) {
 	return rules[leftHandSide].erase ( rightHandSide );
 }
 
-template < class SymbolType >
-void EpsilonFreeCFG < SymbolType >::setGeneratesEpsilon ( bool genEps ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >::setGeneratesEpsilon ( bool genEps ) {
 	generatesEpsilon = genEps;
 }
 
-template < class SymbolType >
-bool EpsilonFreeCFG < SymbolType >::getGeneratesEpsilon ( ) const {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+bool EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >::getGeneratesEpsilon ( ) const {
 	return generatesEpsilon;
 }
 
-template < class SymbolType >
-int EpsilonFreeCFG < SymbolType >::compare ( const EpsilonFreeCFG & other ) const {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+int EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >::compare ( const EpsilonFreeCFG & other ) const {
 	auto first = ext::tie ( getTerminalAlphabet ( ), getNonterminalAlphabet ( ), getInitialSymbol ( ), rules );
 	auto second = ext::tie ( other.getTerminalAlphabet ( ), other.getNonterminalAlphabet ( ), other.getInitialSymbol ( ), other.rules );
 
@@ -385,8 +386,8 @@ int EpsilonFreeCFG < SymbolType >::compare ( const EpsilonFreeCFG & other ) cons
 	return comp ( first, second );
 }
 
-template < class SymbolType >
-void EpsilonFreeCFG < SymbolType >::operator >>( std::ostream & out ) const {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >::operator >>( std::ostream & out ) const {
 	out << "(EpsilonFreeCFG "
 	    << "nonterminalAlphabet = " << getNonterminalAlphabet ( )
 	    << "terminalAlphabet = " << getTerminalAlphabet ( )
@@ -395,15 +396,15 @@ void EpsilonFreeCFG < SymbolType >::operator >>( std::ostream & out ) const {
 	    << "generatesEpsilon = " << generatesEpsilon << ")";
 }
 
-template < class SymbolType >
-EpsilonFreeCFG < SymbolType >::operator std::string ( ) const {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >::operator std::string ( ) const {
 	std::stringstream ss;
 	ss << * this;
 	return ss.str ( );
 }
 
-template < class SymbolType >
-object::ObjectBase* EpsilonFreeCFG < SymbolType >::inc() && {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+object::ObjectBase* EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >::inc() && {
 	return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0));
 }
 
@@ -414,10 +415,11 @@ namespace core {
 /**
  * Helper class specifying constraints for the grammar's internal terminal alphabet component.
  *
- * \tparam SymbolType used for the terminal alphabet of the grammar.
+ * \tparam TerminalSymbolType used for the terminal alphabet of the grammar.
+ * \tparam NonterminalSymbolType used for the nonterminal alphabet, and the initial symbol of the grammar.
  */
-template < class SymbolType >
-class SetConstraint< grammar::EpsilonFreeCFG < SymbolType >, SymbolType, grammar::TerminalAlphabet > {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+class SetConstraint< grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >, TerminalSymbolType, grammar::TerminalAlphabet > {
 public:
 	/**
 	 * Returns true if the terminal symbol is still used in some rule of the grammar.
@@ -427,9 +429,9 @@ public:
 	 *
 	 * \returns true if the symbol is used, false othervise
 	 */
-	static bool used ( const grammar::EpsilonFreeCFG < SymbolType > & grammar, const SymbolType & symbol ) {
-		for ( const std::pair < const SymbolType, ext::set < ext::vector < SymbolType > > > & rule : grammar.getRules ( ) )
-			for ( const ext::vector < SymbolType > & rhs : rule.second )
+	static bool used ( const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & grammar, const TerminalSymbolType & symbol ) {
+		for ( const std::pair < const NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > & rule : grammar.getRules ( ) )
+			for ( const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rhs : rule.second )
 				if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.end ( ) )
 					return true;
 
@@ -444,7 +446,7 @@ public:
 	 *
 	 * \returns true
 	 */
-	static bool available ( const grammar::EpsilonFreeCFG < SymbolType > &, const SymbolType & ) {
+	static bool available ( const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > &, const TerminalSymbolType & ) {
 		return true;
 	}
 
@@ -456,7 +458,7 @@ public:
 	 *
 	 * \throws grammar::GrammarException of the tested symbol is in nonterminal alphabet
 	 */
-	static void valid ( const grammar::EpsilonFreeCFG < SymbolType > & grammar, const SymbolType & symbol ) {
+	static void valid ( const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & grammar, const TerminalSymbolType & symbol ) {
 		if ( grammar.template accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ) )
 			throw grammar::GrammarException ( "Symbol " + ext::to_string ( symbol ) + "cannot be in terminal alphabet since it is already nonterminal alphabet" );
 	}
@@ -465,10 +467,11 @@ public:
 /**
  * Helper class specifying constraints for the grammar's internal nonterminal alphabet component.
  *
- * \tparam SymbolType used for the nonterminal alphabet of the grammar.
+ * \tparam TerminalSymbolType used for the terminal alphabet of the grammar.
+ * \tparam NonterminalSymbolType used for the nonterminal alphabet, and the initial symbol of the grammar.
  */
-template < class SymbolType >
-class SetConstraint< grammar::EpsilonFreeCFG < SymbolType >, SymbolType, grammar::NonterminalAlphabet > {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+class SetConstraint< grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >, NonterminalSymbolType, grammar::NonterminalAlphabet > {
 public:
 	/**
 	 * Returns true if the nonterminal symbol is still used in some rule of the grammar or if it is the initial symbol of the grammar.
@@ -478,12 +481,12 @@ public:
 	 *
 	 * \returns true if the symbol is used, false othervise
 	 */
-	static bool used ( const grammar::EpsilonFreeCFG < SymbolType > & grammar, const SymbolType & symbol ) {
-		for ( const std::pair < const SymbolType, ext::set < ext::vector < SymbolType > > > & rule : grammar.getRules ( ) ) {
+	static bool used ( const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & grammar, const NonterminalSymbolType & symbol ) {
+		for ( const std::pair < const NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > & rule : grammar.getRules ( ) ) {
 			if ( rule.first == symbol )
 				return true;
 
-			for ( const ext::vector < SymbolType > & rhs : rule.second )
+			for ( const ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > & rhs : rule.second )
 				if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.end ( ) )
 					return true;
 
@@ -503,7 +506,7 @@ public:
 	 *
 	 * \returns true
 	 */
-	static bool available ( const grammar::EpsilonFreeCFG < SymbolType > &, const SymbolType & ) {
+	static bool available ( const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > &, const NonterminalSymbolType & ) {
 		return true;
 	}
 
@@ -515,7 +518,7 @@ public:
 	 *
 	 * \throws grammar::GrammarException of the tested symbol is in nonterminal alphabet
 	 */
-	static void valid ( const grammar::EpsilonFreeCFG < SymbolType > & grammar, const SymbolType & symbol ) {
+	static void valid ( const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & grammar, const NonterminalSymbolType & symbol ) {
 		if ( grammar.template accessComponent < grammar::TerminalAlphabet > ( ).get ( ).count ( symbol ) )
 			throw grammar::GrammarException ( "Symbol " + ext::to_string ( symbol ) + "cannot be in nonterminal alphabet since it is already in terminal alphabet" );
 	}
@@ -524,10 +527,11 @@ public:
 /**
  * Helper class specifying constraints for the grammar's internal initial symbol element.
  *
- * \tparam SymbolType used for the initial symbol of the grammar.
+ * \tparam TerminalSymbolType used for the terminal alphabet of the grammar.
+ * \tparam NonterminalSymbolType used for the nonterminal alphabet, and the initial symbol of the grammar.
  */
-template < class SymbolType >
-class ElementConstraint< grammar::EpsilonFreeCFG < SymbolType >, SymbolType, grammar::InitialSymbol > {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+class ElementConstraint< grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType >, NonterminalSymbolType, grammar::InitialSymbol > {
 public:
 	/**
 	 * Returns true if the symbol requested to be initial is available in nonterminal alphabet.
@@ -537,7 +541,7 @@ public:
 	 *
 	 * \returns true if the tested symbol is in nonterminal alphabet
 	 */
-	static bool available ( const grammar::EpsilonFreeCFG < SymbolType > & grammar, const SymbolType & symbol ) {
+	static bool available ( const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & grammar, const NonterminalSymbolType & symbol ) {
 		return grammar.template accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol );
 	}
 
@@ -547,7 +551,7 @@ public:
 	 * \param grammar the tested grammar
 	 * \param symbol the tested symbol
 	 */
-	static void valid ( const grammar::EpsilonFreeCFG < SymbolType > &, const SymbolType & ) {
+	static void valid ( const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > &, const NonterminalSymbolType & ) {
 	}
 };
 
@@ -556,20 +560,20 @@ public:
  *
  * \returns new instance of the grammar with default template parameters or unmodified instance if the template parameters were already default ones
  */
-template < class SymbolType >
-struct normalize < grammar::EpsilonFreeCFG < SymbolType > > {
-	static grammar::EpsilonFreeCFG < > eval ( grammar::EpsilonFreeCFG < SymbolType > && value ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+struct normalize < grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > > {
+	static grammar::EpsilonFreeCFG < > eval ( grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > && value ) {
 		ext::set < DefaultSymbolType > nonterminals = alphabet::SymbolNormalize::normalizeAlphabet ( std::move ( value ).getNonterminalAlphabet ( ) );
 		ext::set < DefaultSymbolType > terminals = alphabet::SymbolNormalize::normalizeAlphabet ( std::move ( value ).getTerminalAlphabet ( ) );
 		DefaultSymbolType initialSymbol = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( value ).getInitialSymbol ( ) );
 
 		grammar::EpsilonFreeCFG < > res ( std::move ( nonterminals ), std::move ( terminals ), std::move ( initialSymbol ) );
 
-		for ( std::pair < SymbolType, ext::set < ext::vector < SymbolType > > > && rule : ext::make_mover ( std::move ( value ).getRules ( ) ) ) {
+		for ( std::pair < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > && rule : ext::make_mover ( std::move ( value ).getRules ( ) ) ) {
 
-			ext::set < ext::vector < DefaultSymbolType > > rhs;
-			for ( ext::vector < SymbolType > && target : ext::make_mover ( rule.second ) )
-				rhs.insert ( alphabet::SymbolNormalize::normalizeSymbols ( std::move ( target ) ) );
+			ext::set < ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > rhs;
+			for ( ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > && target : ext::make_mover ( rule.second ) )
+				rhs.insert ( alphabet::SymbolNormalize::normalizeVariantSymbols ( std::move ( target ) ) );
 
 			DefaultSymbolType lhs = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( rule.first ) );
 
diff --git a/alib2data/src/grammar/ContextFree/GNF.h b/alib2data/src/grammar/ContextFree/GNF.h
index 0de4d45fb8..93731718fe 100644
--- a/alib2data/src/grammar/ContextFree/GNF.h
+++ b/alib2data/src/grammar/ContextFree/GNF.h
@@ -60,14 +60,15 @@ class InitialSymbol;
  * P = set of production rules of the form A -> BC or A -> a, where A, B, C \in N and a \in T,
  * S (InitialSymbol) = initial nonterminal symbol,
  *
- * \tparam SymbolType used for the terminal alphabet, the nonterminal alphabet, and the initial symbol of the grammar.
+ * \tparam TerminalSymbolType used for the terminal alphabet of the grammar.
+ * \tparam NonterminalSymbolType used for the nonterminal alphabet, and the initial symbol of the grammar.
  */
-template < class SymbolType = DefaultSymbolType >
-class GNF final : public GrammarBase, public core::Components < GNF < SymbolType >, ext::set < SymbolType >, component::Set, std::tuple < TerminalAlphabet, NonterminalAlphabet >, SymbolType, component::Value, InitialSymbol > {
+template < class TerminalSymbolType = DefaultSymbolType, class NonterminalSymbolType = DefaultSymbolType >
+class GNF final : public GrammarBase, public core::Components < GNF < TerminalSymbolType, NonterminalSymbolType >, ext::set < TerminalSymbolType >, component::Set, TerminalAlphabet, ext::set < NonterminalSymbolType >, component::Set, NonterminalAlphabet, NonterminalSymbolType, component::Value, InitialSymbol > {
 	/**
 	 * Rules function as mapping from nonterminal symbol on the left hand side to a set of sequences of terminal and nonterminal symbols.
 	 */
-	ext::map < SymbolType, ext::set < ext::pair < SymbolType, ext::vector < SymbolType > > > > rules;
+	ext::map < NonterminalSymbolType, ext::set < ext::pair < TerminalSymbolType, ext::vector < NonterminalSymbolType > > > > rules;
 
 	/**
 	 * Boolean signaling whether grammar generates empty string or don't.
@@ -80,7 +81,7 @@ public:
 	 *
 	 * \param initialSymbol the initial symbol of the grammar
 	 */
-	explicit GNF ( SymbolType initialSymbol );
+	explicit GNF ( NonterminalSymbolType initialSymbol );
 
 	/**
 	 * \brief Creates a new instance of the grammar with a concrete nonterminal alphabet, terminal alphabet and initial symbol.
@@ -89,7 +90,7 @@ public:
 	 * \param terminalSymbols the initial terminal alphabet
 	 * \param initialSymbol the initial symbol of the grammar
 	 */
-	explicit GNF ( ext::set < SymbolType > nonTerminalSymbols, ext::set < SymbolType > terminalSymbols, SymbolType initialSymbol );
+	explicit GNF ( ext::set < NonterminalSymbolType > nonTerminalSymbols, ext::set < TerminalSymbolType > terminalSymbols, NonterminalSymbolType initialSymbol );
 
 	/**
 	 * @copydoc grammar::GrammarBase::clone()
@@ -111,7 +112,7 @@ public:
 	 *
 	 * \returns true if the rule was indeed added, false othervise
 	 */
-	bool addRule ( SymbolType leftHandSide, ext::pair < SymbolType, ext::vector < SymbolType > > rightHandSide );
+	bool addRule ( NonterminalSymbolType leftHandSide, ext::pair < TerminalSymbolType, ext::vector < NonterminalSymbolType > > rightHandSide );
 
 	/**
 	 * \brief Add new rules of a grammar.
@@ -121,21 +122,21 @@ public:
 	 * \param leftHandSide the left hand side of the rule
 	 * \param rightHandSide a set of right hand sides of the rule
 	 */
-	void addRules ( SymbolType leftHandSide, ext::set < ext::pair < SymbolType, ext::vector < SymbolType > > > rightHandSide );
+	void addRules ( NonterminalSymbolType leftHandSide, ext::set < ext::pair < TerminalSymbolType, ext::vector < NonterminalSymbolType > > > rightHandSide );
 
 	/**
 	 * Get rules of the grammar.
 	 *
 	 * \returns rules of the grammar
 	 */
-	const ext::map < SymbolType, ext::set < ext::pair < SymbolType, ext::vector < SymbolType > > > > & getRules ( ) const &;
+	const ext::map < NonterminalSymbolType, ext::set < ext::pair < TerminalSymbolType, ext::vector < NonterminalSymbolType > > > > & getRules ( ) const &;
 
 	/**
 	 * Get rules of the grammar.
 	 *
 	 * \returns rules of the grammar
 	 */
-	ext::map < SymbolType, ext::set < ext::pair < SymbolType, ext::vector < SymbolType > > > > && getRules ( ) &&;
+	ext::map < NonterminalSymbolType, ext::set < ext::pair < TerminalSymbolType, ext::vector < NonterminalSymbolType > > > > && getRules ( ) &&;
 
 	/**
 	 * Remove a rule of a grammar in form of A -> aB, where A \in N, a \in T, and B \in N*.
@@ -145,14 +146,14 @@ public:
 	 *
 	 * \returns true if the rule was indeed removed, false othervise
 	 */
-	bool removeRule ( const SymbolType & leftHandSide, const ext::pair < SymbolType, ext::vector < SymbolType > > & rightHandSide );
+	bool removeRule ( const NonterminalSymbolType & leftHandSide, const ext::pair < TerminalSymbolType, ext::vector < NonterminalSymbolType > > & rightHandSide );
 
 	/**
 	 * Getter of initial symbol.
 	 *
 	 * \returns the initial symbol of the grammar
 	 */
-	const SymbolType & getInitialSymbol ( ) const & {
+	const NonterminalSymbolType & getInitialSymbol ( ) const & {
 		return this->template accessComponent < InitialSymbol > ( ).get ( );
 	}
 
@@ -161,7 +162,7 @@ public:
 	 *
 	 * \returns the initial symbol of the grammar
 	 */
-	SymbolType && getInitialSymbol ( ) && {
+	NonterminalSymbolType && getInitialSymbol ( ) && {
 		return std::move ( this->template accessComponent < InitialSymbol > ( ).get ( ) );
 	}
 
@@ -172,7 +173,7 @@ public:
 	 *
 	 * \returns true if the initial symbol was indeed changed
 	 */
-	bool setInitialSymbol ( SymbolType symbol ) {
+	bool setInitialSymbol ( NonterminalSymbolType symbol ) {
 		return this->template accessComponent < InitialSymbol > ( ).set ( std::move ( symbol ) );
 	}
 
@@ -181,7 +182,7 @@ public:
 	 *
 	 * \returns the nonterminal alphabet of the grammar
 	 */
-	const ext::set < SymbolType > & getNonterminalAlphabet ( ) const & {
+	const ext::set < NonterminalSymbolType > & getNonterminalAlphabet ( ) const & {
 		return this->template accessComponent < NonterminalAlphabet > ( ).get ( );
 	}
 
@@ -190,7 +191,7 @@ public:
 	 *
 	 * \returns the nonterminal alphabet of the grammar
 	 */
-	ext::set < SymbolType > && getNonterminalAlphabet ( ) && {
+	ext::set < NonterminalSymbolType > && getNonterminalAlphabet ( ) && {
 		return std::move ( this->template accessComponent < NonterminalAlphabet > ( ).get ( ) );
 	}
 
@@ -201,7 +202,7 @@ public:
 	 *
 	 * \returns true if the symbol was indeed added
 	 */
-	bool addNonterminalSymbol ( SymbolType symbol ) {
+	bool addNonterminalSymbol ( NonterminalSymbolType symbol ) {
 		return this->template accessComponent < NonterminalAlphabet > ( ).add ( std::move ( symbol ) );
 	}
 
@@ -210,7 +211,7 @@ public:
 	 *
 	 * \param symbols completely new nonterminal alphabet
 	 */
-	void setNonterminalAlphabet ( ext::set < SymbolType > symbols ) {
+	void setNonterminalAlphabet ( ext::set < NonterminalSymbolType > symbols ) {
 		this->template accessComponent < NonterminalAlphabet > ( ).set ( std::move ( symbols ) );
 	}
 
@@ -219,7 +220,7 @@ public:
 	 *
 	 * \returns the terminal alphabet of the grammar
 	 */
-	const ext::set < SymbolType > & getTerminalAlphabet ( ) const & {
+	const ext::set < TerminalSymbolType > & getTerminalAlphabet ( ) const & {
 		return this->template accessComponent < TerminalAlphabet > ( ).get ( );
 	}
 
@@ -228,7 +229,7 @@ public:
 	 *
 	 * \returns the terminal alphabet of the grammar
 	 */
-	ext::set < SymbolType > && getTerminalAlphabet ( ) && {
+	ext::set < TerminalSymbolType > && getTerminalAlphabet ( ) && {
 		return std::move ( this->template accessComponent < TerminalAlphabet > ( ).get ( ) );
 	}
 
@@ -239,7 +240,7 @@ public:
 	 *
 	 * \returns true if the symbol was indeed added
 	 */
-	bool addTerminalSymbol ( SymbolType symbol ) {
+	bool addTerminalSymbol ( TerminalSymbolType symbol ) {
 		return this->template accessComponent < TerminalAlphabet > ( ).add ( std::move ( symbol ) );
 	}
 
@@ -248,7 +249,7 @@ public:
 	 *
 	 * \param symbol completely new nontemrinal alphabet
 	 */
-	void setTerminalAlphabet ( ext::set < SymbolType > symbols ) {
+	void setTerminalAlphabet ( ext::set < TerminalSymbolType > symbols ) {
 		this->template accessComponent < TerminalAlphabet > ( ).set ( std::move ( symbols ) );
 	}
 
@@ -300,49 +301,49 @@ public:
 	virtual object::ObjectBase * inc ( ) && override;
 };
 
-template < class SymbolType >
-GNF < SymbolType >::GNF ( SymbolType initialSymbol ) : GNF ( ext::set < SymbolType > { initialSymbol }, ext::set < SymbolType > ( ), initialSymbol ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+GNF < TerminalSymbolType, NonterminalSymbolType >::GNF ( NonterminalSymbolType initialSymbol ) : GNF ( ext::set < NonterminalSymbolType > { initialSymbol }, ext::set < TerminalSymbolType > ( ), initialSymbol ) {
 }
 
-template < class SymbolType >
-GNF < SymbolType >::GNF ( ext::set < SymbolType > nonterminalAlphabet, ext::set < SymbolType > terminalAlphabet, SymbolType initialSymbol ) : core::Components < GNF, ext::set < SymbolType >, component::Set, std::tuple < TerminalAlphabet, NonterminalAlphabet >, SymbolType, component::Value, InitialSymbol > ( std::move ( terminalAlphabet), std::move ( nonterminalAlphabet ), std::move ( initialSymbol ) ), generatesEpsilon ( false ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+GNF < TerminalSymbolType, NonterminalSymbolType >::GNF ( ext::set < NonterminalSymbolType > nonterminalAlphabet, ext::set < TerminalSymbolType > terminalAlphabet, NonterminalSymbolType initialSymbol ) : core::Components < GNF, ext::set < TerminalSymbolType >, component::Set, TerminalAlphabet, ext::set < NonterminalSymbolType >, component::Set, NonterminalAlphabet, NonterminalSymbolType, component::Value, InitialSymbol > ( std::move ( terminalAlphabet), std::move ( nonterminalAlphabet ), std::move ( initialSymbol ) ), generatesEpsilon ( false ) {
 }
 
-template < class SymbolType >
-GrammarBase * GNF < SymbolType >::clone ( ) const & {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+GrammarBase * GNF < TerminalSymbolType, NonterminalSymbolType >::clone ( ) const & {
 	return new GNF ( * this );
 }
 
-template < class SymbolType >
-GrammarBase * GNF < SymbolType >::clone ( ) && {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+GrammarBase * GNF < TerminalSymbolType, NonterminalSymbolType >::clone ( ) && {
 	return new GNF ( std::move ( * this ) );
 }
 
-template < class SymbolType >
-bool GNF < SymbolType >::addRule ( SymbolType leftHandSide, ext::pair < SymbolType, ext::vector < SymbolType > > rightHandSide ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+bool GNF < TerminalSymbolType, NonterminalSymbolType >::addRule ( NonterminalSymbolType leftHandSide, ext::pair < TerminalSymbolType, ext::vector < NonterminalSymbolType > > rightHandSide ) {
 	if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) )
 		throw GrammarException ( "Rule must rewrite nonterminal symbol" );
 
 	if ( !getTerminalAlphabet ( ).count ( rightHandSide.first ) )
 		throw GrammarException ( "Rule must rewrite to terminal symbol" );
 
-	for ( const SymbolType & rhsNTs : rightHandSide.second )
+	for ( const NonterminalSymbolType & rhsNTs : rightHandSide.second )
 		if ( !getNonterminalAlphabet ( ).count ( rhsNTs ) )
 			throw GrammarException ( "Symbol \"" + ext::to_string ( rhsNTs ) + "\" is not a nonterminal symbol" );
 
 	return rules[std::move ( leftHandSide )].insert ( std::move ( rightHandSide ) ).second;
 }
 
-template < class SymbolType >
-void GNF < SymbolType >::addRules ( SymbolType leftHandSide, ext::set < ext::pair < SymbolType, ext::vector < SymbolType > > > rightHandSide ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void GNF < TerminalSymbolType, NonterminalSymbolType >::addRules ( NonterminalSymbolType leftHandSide, ext::set < ext::pair < TerminalSymbolType, ext::vector < NonterminalSymbolType > > > rightHandSide ) {
 	if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) )
 		throw GrammarException ( "Rule must rewrite nonterminal symbol" );
 
-	for ( const std::pair < SymbolType, ext::vector < SymbolType > > & rhs : rightHandSide ) {
+	for ( const ext::pair < TerminalSymbolType, ext::vector < NonterminalSymbolType > > & rhs : rightHandSide ) {
 		if ( ! getTerminalAlphabet ( ).count ( rhs.first ) )
 			throw GrammarException ( "Rule must rewrite to terminal symbol" );
 
-		for ( const SymbolType & rhsNTs : rhs.second )
+		for ( const NonterminalSymbolType & rhsNTs : rhs.second )
 			if ( !getNonterminalAlphabet ( ).count ( rhsNTs ) )
 				throw GrammarException ( "Symbol \"" + ext::to_string ( rhsNTs ) + "\" is not a nonterminal symbol" );
 	}
@@ -350,33 +351,33 @@ void GNF < SymbolType >::addRules ( SymbolType leftHandSide, ext::set < ext::pai
 	rules[std::move ( leftHandSide )].insert ( ext::make_mover ( rightHandSide ).begin ( ), ext::make_mover ( rightHandSide ).end ( ) );
 }
 
-template < class SymbolType >
-const ext::map < SymbolType, ext::set < ext::pair < SymbolType, ext::vector < SymbolType > > > > & GNF < SymbolType >::getRules ( ) const & {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+const ext::map < NonterminalSymbolType, ext::set < ext::pair < TerminalSymbolType, ext::vector < NonterminalSymbolType > > > > & GNF < TerminalSymbolType, NonterminalSymbolType >::getRules ( ) const & {
 	return rules;
 }
 
-template < class SymbolType >
-ext::map < SymbolType, ext::set < ext::pair < SymbolType, ext::vector < SymbolType > > > > && GNF < SymbolType >::getRules ( ) && {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+ext::map < NonterminalSymbolType, ext::set < ext::pair < TerminalSymbolType, ext::vector < NonterminalSymbolType > > > > && GNF < TerminalSymbolType, NonterminalSymbolType >::getRules ( ) && {
 	return std::move ( rules );
 }
 
-template < class SymbolType >
-bool GNF < SymbolType >::removeRule ( const SymbolType & leftHandSide, const ext::pair < SymbolType, ext::vector < SymbolType > > & rightHandSide ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+bool GNF < TerminalSymbolType, NonterminalSymbolType >::removeRule ( const NonterminalSymbolType & leftHandSide, const ext::pair < TerminalSymbolType, ext::vector < NonterminalSymbolType > > & rightHandSide ) {
 	return rules[leftHandSide].erase ( rightHandSide );
 }
 
-template < class SymbolType >
-void GNF < SymbolType >::setGeneratesEpsilon ( bool genEps ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void GNF < TerminalSymbolType, NonterminalSymbolType >::setGeneratesEpsilon ( bool genEps ) {
 	generatesEpsilon = genEps;
 }
 
-template < class SymbolType >
-bool GNF < SymbolType >::getGeneratesEpsilon ( ) const {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+bool GNF < TerminalSymbolType, NonterminalSymbolType >::getGeneratesEpsilon ( ) const {
 	return generatesEpsilon;
 }
 
-template < class SymbolType >
-int GNF < SymbolType >::compare ( const GNF & other ) const {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+int GNF < TerminalSymbolType, NonterminalSymbolType >::compare ( const GNF & other ) const {
 	auto first = ext::tie ( getTerminalAlphabet ( ), getNonterminalAlphabet ( ), getInitialSymbol ( ), rules );
 	auto second = ext::tie ( other.getTerminalAlphabet ( ), other.getNonterminalAlphabet ( ), other.getInitialSymbol ( ), other.rules );
 
@@ -385,8 +386,8 @@ int GNF < SymbolType >::compare ( const GNF & other ) const {
 	return comp ( first, second );
 }
 
-template < class SymbolType >
-void GNF < SymbolType >::operator >>( std::ostream & out ) const {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void GNF < TerminalSymbolType, NonterminalSymbolType >::operator >>( std::ostream & out ) const {
 	out << "(GNF "
 	    << "nonterminalAlphabet = " << getNonterminalAlphabet ( )
 	    << "terminalAlphabet = " << getTerminalAlphabet ( )
@@ -394,15 +395,15 @@ void GNF < SymbolType >::operator >>( std::ostream & out ) const {
 	    << "rules = " << rules << ")";
 }
 
-template < class SymbolType >
-GNF < SymbolType >::operator std::string ( ) const {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+GNF < TerminalSymbolType, NonterminalSymbolType >::operator std::string ( ) const {
 	std::stringstream ss;
 	ss << * this;
 	return ss.str ( );
 }
 
-template < class SymbolType >
-object::ObjectBase* GNF < SymbolType >::inc() && {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+object::ObjectBase* GNF < TerminalSymbolType, NonterminalSymbolType >::inc() && {
 	return new object::UniqueObject(object::Object(std::move(*this)), primitive::Integer(0));
 }
 
@@ -413,10 +414,11 @@ namespace core {
 /**
  * Helper class specifying constraints for the grammar's internal terminal alphabet component.
  *
- * \tparam SymbolType used for the terminal alphabet of the grammar.
+ * \tparam TerminalSymbolType used for the terminal alphabet of the grammar.
+ * \tparam NonterminalSymbolType used for the nonterminal alphabet, and the initial symbol of the grammar.
  */
-template < class SymbolType >
-class SetConstraint< grammar::GNF < SymbolType >, SymbolType, grammar::TerminalAlphabet > {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+class SetConstraint< grammar::GNF < TerminalSymbolType, NonterminalSymbolType >, TerminalSymbolType, grammar::TerminalAlphabet > {
 public:
 	/**
 	 * Returns true if the terminal symbol is still used in some rule of the grammar.
@@ -426,9 +428,9 @@ public:
 	 *
 	 * \returns true if the symbol is used, false othervise
 	 */
-	static bool used ( const grammar::GNF < SymbolType > & grammar, const SymbolType & symbol ) {
-		for ( const std::pair < const SymbolType, ext::set < ext::pair < SymbolType, ext::vector < SymbolType > > > > & rule : grammar.getRules ( ) )
-			for ( const std::pair < SymbolType, ext::vector < SymbolType > > & rhs : rule.second )
+	static bool used ( const grammar::GNF < TerminalSymbolType, NonterminalSymbolType > & grammar, const TerminalSymbolType & symbol ) {
+		for ( const std::pair < const NonterminalSymbolType, ext::set < ext::pair < TerminalSymbolType, ext::vector < NonterminalSymbolType > > > > & rule : grammar.getRules ( ) )
+			for ( const ext::pair < TerminalSymbolType, ext::vector < NonterminalSymbolType > > & rhs : rule.second )
 				if ( rhs.first == symbol )
 					return true;
 
@@ -443,7 +445,7 @@ public:
 	 *
 	 * \returns true
 	 */
-	static bool available ( const grammar::GNF < SymbolType > &, const SymbolType & ) {
+	static bool available ( const grammar::GNF < TerminalSymbolType, NonterminalSymbolType > &, const TerminalSymbolType & ) {
 		return true;
 	}
 
@@ -455,7 +457,7 @@ public:
 	 *
 	 * \throws grammar::GrammarException of the tested symbol is in nonterminal alphabet
 	 */
-	static void valid ( const grammar::GNF < SymbolType > & grammar, const SymbolType & symbol ) {
+	static void valid ( const grammar::GNF < TerminalSymbolType, NonterminalSymbolType > & grammar, const TerminalSymbolType & symbol ) {
 		if ( grammar.template accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ) )
 			throw grammar::GrammarException ( "Symbol " + ext::to_string ( symbol ) + "cannot be in terminal alphabet since it is already nonterminal alphabet" );
 	}
@@ -464,10 +466,11 @@ public:
 /**
  * Helper class specifying constraints for the grammar's internal nonterminal alphabet component.
  *
- * \tparam SymbolType used for the nonterminal alphabet of the grammar.
+ * \tparam TerminalSymbolType used for the terminal alphabet of the grammar.
+ * \tparam NonterminalSymbolType used for the nonterminal alphabet, and the initial symbol of the grammar.
  */
-template < class SymbolType >
-class SetConstraint< grammar::GNF < SymbolType >, SymbolType, grammar::NonterminalAlphabet > {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+class SetConstraint< grammar::GNF < TerminalSymbolType, NonterminalSymbolType >, NonterminalSymbolType, grammar::NonterminalAlphabet > {
 public:
 	/**
 	 * Returns true if the nonterminal symbol is still used in some rule of the grammar or if it is the initial symbol of the grammar.
@@ -477,12 +480,12 @@ public:
 	 *
 	 * \returns true if the symbol is used, false othervise
 	 */
-	static bool used ( const grammar::GNF < SymbolType > & grammar, const SymbolType & symbol ) {
-		for ( const std::pair < const SymbolType, ext::set < ext::pair < SymbolType, ext::vector < SymbolType > > > > & rule : grammar.getRules ( ) ) {
+	static bool used ( const grammar::GNF < TerminalSymbolType, NonterminalSymbolType > & grammar, const NonterminalSymbolType & symbol ) {
+		for ( const std::pair < const NonterminalSymbolType, ext::set < ext::pair < TerminalSymbolType, ext::vector < NonterminalSymbolType > > > > & rule : grammar.getRules ( ) ) {
 			if ( rule.first == symbol )
 				return true;
 
-			for ( const std::pair < SymbolType, ext::vector < SymbolType > > & rhs : rule.second )
+			for ( const ext::pair < TerminalSymbolType, ext::vector < NonterminalSymbolType > > & rhs : rule.second )
 				if ( std::find ( rhs.second.begin ( ), rhs.second.end ( ), symbol ) != rhs.second.end ( ) )
 					return true;
 		}
@@ -501,7 +504,7 @@ public:
 	 *
 	 * \returns true
 	 */
-	static bool available ( const grammar::GNF < SymbolType > &, const SymbolType & ) {
+	static bool available ( const grammar::GNF < TerminalSymbolType, NonterminalSymbolType > &, const NonterminalSymbolType & ) {
 		return true;
 	}
 
@@ -513,7 +516,7 @@ public:
 	 *
 	 * \throws grammar::GrammarException of the tested symbol is in nonterminal alphabet
 	 */
-	static void valid ( const grammar::GNF < SymbolType > & grammar, const SymbolType & symbol ) {
+	static void valid ( const grammar::GNF < TerminalSymbolType, NonterminalSymbolType > & grammar, const NonterminalSymbolType & symbol ) {
 		if ( grammar.template accessComponent < grammar::TerminalAlphabet > ( ).get ( ).count ( symbol ) )
 			throw grammar::GrammarException ( "Symbol " + ext::to_string ( symbol ) + "cannot be in nonterminal alphabet since it is already in terminal alphabet" );
 	}
@@ -522,10 +525,11 @@ public:
 /**
  * Helper class specifying constraints for the grammar's internal initial symbol element.
  *
- * \tparam SymbolType used for the initial symbol of the grammar.
+ * \tparam TerminalSymbolType used for the terminal alphabet of the grammar.
+ * \tparam NonterminalSymbolType used for the nonterminal alphabet, and the initial symbol of the grammar.
  */
-template < class SymbolType >
-class ElementConstraint< grammar::GNF < SymbolType >, SymbolType, grammar::InitialSymbol > {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+class ElementConstraint< grammar::GNF < TerminalSymbolType, NonterminalSymbolType >, NonterminalSymbolType, grammar::InitialSymbol > {
 public:
 	/**
 	 * Returns true if the symbol requested to be initial is available in nonterminal alphabet.
@@ -535,7 +539,7 @@ public:
 	 *
 	 * \returns true if the tested symbol is in nonterminal alphabet
 	 */
-	static bool available ( const grammar::GNF < SymbolType > & grammar, const SymbolType & symbol ) {
+	static bool available ( const grammar::GNF < TerminalSymbolType, NonterminalSymbolType > & grammar, const NonterminalSymbolType & symbol ) {
 		return grammar.template accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol );
 	}
 
@@ -545,7 +549,7 @@ public:
 	 * \param grammar the tested grammar
 	 * \param symbol the tested symbol
 	 */
-	static void valid ( const grammar::GNF < SymbolType > &, const SymbolType & ) {
+	static void valid ( const grammar::GNF < TerminalSymbolType, NonterminalSymbolType > &, const NonterminalSymbolType & ) {
 	}
 };
 
@@ -554,19 +558,19 @@ public:
  *
  * \returns new instance of the grammar with default template parameters or unmodified instance if the template parameters were already default ones
  */
-template < class SymbolType >
-struct normalize < grammar::GNF < SymbolType > > {
-	static grammar::GNF < > eval ( grammar::GNF < SymbolType > && value ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+struct normalize < grammar::GNF < TerminalSymbolType, NonterminalSymbolType > > {
+	static grammar::GNF < > eval ( grammar::GNF < TerminalSymbolType, NonterminalSymbolType > && value ) {
 		ext::set < DefaultSymbolType > nonterminals = alphabet::SymbolNormalize::normalizeAlphabet ( std::move ( value ).getNonterminalAlphabet ( ) );
 		ext::set < DefaultSymbolType > terminals = alphabet::SymbolNormalize::normalizeAlphabet ( std::move ( value ).getTerminalAlphabet ( ) );
 		DefaultSymbolType initialSymbol = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( value ).getInitialSymbol ( ) );
 
 		grammar::GNF < > res ( std::move ( nonterminals ), std::move ( terminals ), std::move ( initialSymbol ) );
 
-		for ( std::pair < SymbolType, ext::set < ext::pair < SymbolType, ext::vector < SymbolType > > > > && rule : ext::make_mover ( std::move ( value ).getRules ( ) ) ) {
+		for ( std::pair < NonterminalSymbolType, ext::set < ext::pair < TerminalSymbolType, ext::vector < NonterminalSymbolType > > > > && rule : ext::make_mover ( std::move ( value ).getRules ( ) ) ) {
 
 			ext::set < ext::pair < DefaultSymbolType, ext::vector < DefaultSymbolType > > > rhs;
-			for ( ext::pair < SymbolType, ext::vector < SymbolType > > && target : ext::make_mover ( rule.second ) )
+			for ( ext::pair < TerminalSymbolType, ext::vector < NonterminalSymbolType > > && target : ext::make_mover ( rule.second ) )
 				rhs.insert ( grammar::GrammarNormalize::normalizeRHS ( std::move ( target ) ) );
 
 			DefaultSymbolType lhs = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( rule.first ) );
diff --git a/alib2data/src/grammar/RawRules.h b/alib2data/src/grammar/RawRules.h
index 170f868bca..c15159a399 100644
--- a/alib2data/src/grammar/RawRules.h
+++ b/alib2data/src/grammar/RawRules.h
@@ -45,26 +45,26 @@ public:
 	/**
 	 * \override
 	 */
-	template < class SymbolType, class TerminalSymbolType = SymbolType, class NonterminalSymbolType = SymbolType >
-	static ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > getRawRules ( const GNF < SymbolType > & grammar );
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > getRawRules ( const GNF < TerminalSymbolType, NonterminalSymbolType > & grammar );
 
 	/**
 	 * \override
 	 */
-	template < class SymbolType, class TerminalSymbolType = SymbolType, class NonterminalSymbolType = SymbolType >
-	static ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > getRawRules ( const EpsilonFreeCFG < SymbolType > & grammar );
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > getRawRules ( const EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & grammar );
 
 	/**
 	 * \override
 	 */
-	template < class SymbolType, class TerminalSymbolType = SymbolType, class NonterminalSymbolType = SymbolType >
-	static ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > getRawRules ( const CNF < SymbolType > & grammar );
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > getRawRules ( const CNF < TerminalSymbolType, NonterminalSymbolType > & grammar );
 
 	/**
 	 * \override
 	 */
-	template < class SymbolType, class TerminalSymbolType = SymbolType, class NonterminalSymbolType = SymbolType >
-	static ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > getRawRules ( const CFG < SymbolType > & grammar );
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > getRawRules ( const CFG < TerminalSymbolType, NonterminalSymbolType > & grammar );
 
 	/**
 	 * \override
@@ -120,8 +120,8 @@ ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < Termin
 	return res;
 }
 
-template < class SymbolType, class TerminalSymbolType, class NonterminalSymbolType >
-ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > RawRules::getRawRules ( const GNF < SymbolType > & grammar ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > RawRules::getRawRules ( const GNF < TerminalSymbolType, NonterminalSymbolType > & grammar ) {
 	ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > res;
 
 	for ( const auto & rule : grammar.getRules ( ) )
@@ -141,21 +141,9 @@ ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < Termin
 	return res;
 }
 
-template < class SymbolType, class TerminalSymbolType, class NonterminalSymbolType >
-ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > RawRules::getRawRules ( const EpsilonFreeCFG < SymbolType > & grammar ) {
-	ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > res;
-
-	for ( const std::pair < SymbolType, ext::set < ext::vector < SymbolType > > > & rule : grammar.getRules ( ) ) {
-		ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > resRHSSet;
-		for ( const ext::vector < SymbolType > & rhs : rule.second ) {
-			ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > resRHS;
-			for ( const SymbolType & symbol : rhs ) {
-				resRHS.push_back ( ext::variant < TerminalSymbolType, NonterminalSymbolType > ( symbol ) );
-			}
-			resRHSSet.insert ( std::move ( resRHS ) );
-		}
-		res.insert ( std::make_pair ( rule.first, std::move ( resRHSSet ) ) );
-	}
+template < class TerminalSymbolType, class NonterminalSymbolType >
+ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > RawRules::getRawRules ( const EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & grammar ) {
+	ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > res = grammar.getRules ( );
 
 	if ( grammar.getGeneratesEpsilon ( ) )
 		res [ grammar.getInitialSymbol ( ) ].insert ( ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > { } );
@@ -163,14 +151,14 @@ ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < Termin
 	return res;
 }
 
-template < class SymbolType, class TerminalSymbolType, class NonterminalSymbolType >
-ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > RawRules::getRawRules ( const CNF < SymbolType > & grammar ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > RawRules::getRawRules ( const CNF < TerminalSymbolType, NonterminalSymbolType > & grammar ) {
 	ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > res;
 
 	for ( const auto & rule : grammar.getRules ( ) )
 		for ( const auto & rhs : rule.second ) {
 			if ( rhs.template is < TerminalSymbolType > ( ) ) {
-				ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > tmp { ext::variant < TerminalSymbolType, NonterminalSymbolType > ( rhs.template get < SymbolType > ( ) ) };
+				ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > tmp { ext::variant < TerminalSymbolType, NonterminalSymbolType > ( rhs.template get < TerminalSymbolType > ( ) ) };
 				res[rule.first].insert ( std::move ( tmp ) );
 			} else {
 				const auto & realRHS = rhs.template get < ext::pair < NonterminalSymbolType, NonterminalSymbolType > > ( );
@@ -185,23 +173,9 @@ ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < Termin
 	return res;
 }
 
-template < class SymbolType, class TerminalSymbolType, class NonterminalSymbolType >
-ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > RawRules::getRawRules ( const CFG < SymbolType > & grammar ) {
-	ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > res;
-
-	for ( const std::pair < SymbolType, ext::set < ext::vector < SymbolType > > > & rule : grammar.getRules ( ) ) {
-		ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > resRHSSet;
-		for ( const ext::vector < SymbolType > & rhs : rule.second ) {
-			ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > resRHS;
-			for ( const SymbolType & symbol : rhs ) {
-				resRHS.push_back ( ext::variant < TerminalSymbolType, NonterminalSymbolType > ( symbol ) );
-			}
-			resRHSSet.insert ( std::move ( resRHS ) );
-		}
-		res.insert ( std::make_pair ( rule.first, std::move ( resRHSSet ) ) );
-	}
-
-	return res;
+template < class TerminalSymbolType, class NonterminalSymbolType >
+ext::map < NonterminalSymbolType, ext::set < ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > > > RawRules::getRawRules ( const CFG < TerminalSymbolType, NonterminalSymbolType > & grammar ) {
+	return grammar.getRules ( );
 }
 
 template < class TerminalSymbolType, class NonterminalSymbolType >
diff --git a/alib2data/src/grammar/Regular/LeftLG.h b/alib2data/src/grammar/Regular/LeftLG.h
index 2cd8c427f0..605a95de88 100644
--- a/alib2data/src/grammar/Regular/LeftLG.h
+++ b/alib2data/src/grammar/Regular/LeftLG.h
@@ -69,7 +69,7 @@ class LeftLG final : public GrammarBase, public core::Components < LeftLG < Term
 	/**
 	 * Rules as mapping from nonterminal symbol on the left hand side to set of either sequence of terminal symbols or doublets of sequence of terminal symbols and nonterminal symbol.
 	 */
-	ext::map < NonterminalSymbolType, ext::set < ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > > > rules;
+	ext::map < NonterminalSymbolType, ext::set < ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > > > rules;
 
 public:
 	/**
@@ -108,7 +108,7 @@ public:
 	 *
 	 * \returns true if the rule was indeed added, false othervise
 	 */
-	bool addRule ( NonterminalSymbolType leftHandSide, ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > rightHandSide );
+	bool addRule ( NonterminalSymbolType leftHandSide, ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > rightHandSide );
 
 	/**
 	 * \brief Add a new rule of a grammar.
@@ -142,21 +142,21 @@ public:
 	 * \param leftHandSide the left hand side of the rule
 	 * \param rightHandSide a set of right hand sides of the rule
 	 */
-	void addRules ( NonterminalSymbolType leftHandSide, ext::set < ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > > rightHandSide );
+	void addRules ( NonterminalSymbolType leftHandSide, ext::set < ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > > rightHandSide );
 
 	/**
 	 * Get rules of the grammar.
 	 *
 	 * \returns rules of the grammar
 	 */
-	const ext::map < NonterminalSymbolType, ext::set < ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > > > & getRules ( ) const &;
+	const ext::map < NonterminalSymbolType, ext::set < ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > > > & getRules ( ) const &;
 
 	/**
 	 * Get rules of the grammar.
 	 *
 	 * \returns rules of the grammar
 	 */
-	ext::map < NonterminalSymbolType, ext::set < ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > > > && getRules ( ) &&;
+	ext::map < NonterminalSymbolType, ext::set < ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > > > && getRules ( ) &&;
 
 	/**
 	 * Remove a rule of a grammar in form of A -> Ba or A -> a, where A, B \in N and a \in T*.
@@ -166,7 +166,7 @@ public:
 	 *
 	 * \returns true if the rule was indeed removed, false othervise
 	 */
-	bool removeRule ( const NonterminalSymbolType & leftHandSide, const ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > & rightHandSide );
+	bool removeRule ( const NonterminalSymbolType & leftHandSide, const ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > & rightHandSide );
 
 	/**
 	 * Remove a rule of a grammar in form of A -> a, where A \in N and a \in T*.
@@ -260,7 +260,7 @@ public:
 	 *
 	 * \returns the terminal alphabet of the grammar
 	 */
-	const ext::set < NonterminalSymbolType > & getTerminalAlphabet ( ) const & {
+	const ext::set < TerminalSymbolType > & getTerminalAlphabet ( ) const & {
 		return this->template accessComponent < TerminalAlphabet > ( ).get ( );
 	}
 
@@ -346,7 +346,7 @@ GrammarBase * LeftLG < TerminalSymbolType, NonterminalSymbolType >::clone ( ) &&
 }
 
 template < class TerminalSymbolType, class NonterminalSymbolType >
-bool LeftLG < TerminalSymbolType, NonterminalSymbolType >::addRule ( NonterminalSymbolType leftHandSide, ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > rightHandSide ) {
+bool LeftLG < TerminalSymbolType, NonterminalSymbolType >::addRule ( NonterminalSymbolType leftHandSide, ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > rightHandSide ) {
 	if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) )
 		throw GrammarException ( "Rule must rewrite nonterminal symbol" );
 
@@ -370,24 +370,24 @@ bool LeftLG < TerminalSymbolType, NonterminalSymbolType >::addRule ( Nonterminal
 
 template < class TerminalSymbolType, class NonterminalSymbolType >
 bool LeftLG < TerminalSymbolType, NonterminalSymbolType >::addRule ( NonterminalSymbolType leftHandSide, ext::vector < TerminalSymbolType > rightHandSide ) {
-	ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > rhs ( std::move ( rightHandSide ) );
+	ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > rhs ( std::move ( rightHandSide ) );
 
 	return addRule ( std::move ( leftHandSide ), std::move ( rhs ) );
 }
 
 template < class TerminalSymbolType, class NonterminalSymbolType >
 bool LeftLG < TerminalSymbolType, NonterminalSymbolType >::addRule ( NonterminalSymbolType leftHandSide, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > rightHandSide ) {
-	ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > rhs ( std::move ( rightHandSide ) );
+	ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > rhs ( std::move ( rightHandSide ) );
 
 	return addRule ( std::move ( leftHandSide ), std::move ( rhs ) );
 }
 
 template < class TerminalSymbolType, class NonterminalSymbolType >
-void LeftLG < TerminalSymbolType, NonterminalSymbolType >::addRules ( NonterminalSymbolType leftHandSide, ext::set < ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > > rightHandSide ) {
+void LeftLG < TerminalSymbolType, NonterminalSymbolType >::addRules ( NonterminalSymbolType leftHandSide, ext::set < ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > > rightHandSide ) {
 	if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) )
 		throw GrammarException ( "Rule must rewrite nonterminal symbol" );
 
-	for ( const ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > & element : rightHandSide ) {
+	for ( const ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > & element : rightHandSide ) {
 		if ( element.template is < ext::vector < TerminalSymbolType > > ( ) ) {
 			for ( const auto & symbol : element.template get < ext::vector < TerminalSymbolType > > ( ) )
 				if ( !getTerminalAlphabet ( ).count ( symbol ) )
@@ -410,30 +410,30 @@ void LeftLG < TerminalSymbolType, NonterminalSymbolType >::addRules ( Nontermina
 }
 
 template < class TerminalSymbolType, class NonterminalSymbolType >
-const ext::map < NonterminalSymbolType, ext::set < ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > > > & LeftLG < TerminalSymbolType, NonterminalSymbolType >::getRules ( ) const & {
+const ext::map < NonterminalSymbolType, ext::set < ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > > > & LeftLG < TerminalSymbolType, NonterminalSymbolType >::getRules ( ) const & {
 	return rules;
 }
 
 template < class TerminalSymbolType, class NonterminalSymbolType >
-ext::map < NonterminalSymbolType, ext::set < ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > > > && LeftLG < TerminalSymbolType, NonterminalSymbolType >::getRules ( ) && {
+ext::map < NonterminalSymbolType, ext::set < ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > > > && LeftLG < TerminalSymbolType, NonterminalSymbolType >::getRules ( ) && {
 	return std::move ( rules );
 }
 
 template < class TerminalSymbolType, class NonterminalSymbolType >
-bool LeftLG < TerminalSymbolType, NonterminalSymbolType >::removeRule ( const NonterminalSymbolType & leftHandSide, const ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > & rightHandSide ) {
+bool LeftLG < TerminalSymbolType, NonterminalSymbolType >::removeRule ( const NonterminalSymbolType & leftHandSide, const ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > & rightHandSide ) {
 	return rules[leftHandSide].erase ( rightHandSide );
 }
 
 template < class TerminalSymbolType, class NonterminalSymbolType >
 bool LeftLG < TerminalSymbolType, NonterminalSymbolType >::removeRule ( const NonterminalSymbolType & leftHandSide, const ext::vector < TerminalSymbolType > & rightHandSide ) {
-	ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > rhs ( rightHandSide );
+	ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > rhs ( rightHandSide );
 
 	return removeRule ( leftHandSide, rhs );
 }
 
 template < class TerminalSymbolType, class NonterminalSymbolType >
 bool LeftLG < TerminalSymbolType, NonterminalSymbolType >::removeRule ( const NonterminalSymbolType & leftHandSide, const ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > & rightHandSide ) {
-	ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > rhs ( rightHandSide );
+	ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > rhs ( rightHandSide );
 
 	return removeRule ( leftHandSide, rhs );
 }
@@ -491,10 +491,10 @@ public:
 	 * \returns true if the symbol is used, false othervise
 	 */
 	static bool used ( const grammar::LeftLG < TerminalSymbolType, NonterminalSymbolType > & grammar, const TerminalSymbolType & symbol ) {
-		for ( const std::pair < const NonterminalSymbolType, ext::set < ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > > > & rule : grammar.getRules ( ) ) {
-			for ( const ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > & rhsTmp : rule.second )
+		for ( const std::pair < const NonterminalSymbolType, ext::set < ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > > > & rule : grammar.getRules ( ) ) {
+			for ( const ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > & rhsTmp : rule.second )
 				if ( rhsTmp.template is < ext::vector < TerminalSymbolType > > ( ) ) {
-					const ext::vector < NonterminalSymbolType > & rhs = rhsTmp.template get < ext::vector < TerminalSymbolType > > ( );
+					const ext::vector < TerminalSymbolType > & rhs = rhsTmp.template get < ext::vector < TerminalSymbolType > > ( );
 
 					if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.end ( ) )
 						return true;
@@ -554,11 +554,11 @@ public:
 	 * \returns true if the symbol is used, false othervise
 	 */
 	static bool used ( const grammar::LeftLG < TerminalSymbolType, NonterminalSymbolType > & grammar, const NonterminalSymbolType & symbol ) {
-		for ( const std::pair < const NonterminalSymbolType, ext::set < ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > > > & rule : grammar.getRules ( ) ) {
+		for ( const std::pair < const NonterminalSymbolType, ext::set < ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > > > & rule : grammar.getRules ( ) ) {
 			if ( rule.first == symbol )
 				return true;
 
-			for ( const ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > & rhsTmp : rule.second )
+			for ( const ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > & rhsTmp : rule.second )
 				if ( rhsTmp.template is < ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > ( ) ) {
 					const ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > & rhs = rhsTmp.template get < ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > ( );
 
@@ -607,7 +607,7 @@ public:
  * \tparam NonterminalSymbolType used for the nonterminal alphabet, and the initial symbol of the grammar.
  */
 template < class TerminalSymbolType, class NonterminalSymbolType >
-class ElementConstraint< grammar::LeftLG < TerminalSymbolType, NonterminalSymbolType >, TerminalSymbolType, grammar::InitialSymbol > {
+class ElementConstraint< grammar::LeftLG < TerminalSymbolType, NonterminalSymbolType >, NonterminalSymbolType, grammar::InitialSymbol > {
 public:
 	/**
 	 * Returns true if the symbol requested to be initial is available in nonterminal alphabet.
@@ -645,10 +645,10 @@ struct normalize < grammar::LeftLG < TerminalSymbolType, NonterminalSymbolType >
 
 		grammar::LeftLG < > res ( std::move ( nonterminals ), std::move ( terminals ), std::move ( initialSymbol ) );
 
-		for ( std::pair < NonterminalSymbolType, ext::set < ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > > > && rule : ext::make_mover ( std::move ( value ).getRules ( ) ) ) {
+		for ( std::pair < NonterminalSymbolType, ext::set < ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > > > && rule : ext::make_mover ( std::move ( value ).getRules ( ) ) ) {
 
 			ext::set < ext::variant < ext::vector < DefaultSymbolType >, ext::pair < DefaultSymbolType, ext::vector < DefaultSymbolType > > > > rhs;
-			for ( ext::variant < ext::vector < NonterminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > && target : ext::make_mover ( rule.second ) )
+			for ( ext::variant < ext::vector < TerminalSymbolType >, ext::pair < NonterminalSymbolType, ext::vector < TerminalSymbolType > > > && target : ext::make_mover ( rule.second ) )
 				rhs.insert ( grammar::GrammarNormalize::normalizeRHS ( std::move ( target ) ) );
 
 			DefaultSymbolType lhs = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( rule.first ) );
diff --git a/alib2data/src/grammar/xml/ContextFree/CFG.h b/alib2data/src/grammar/xml/ContextFree/CFG.h
index e19621dfca..4c2075bae2 100644
--- a/alib2data/src/grammar/xml/ContextFree/CFG.h
+++ b/alib2data/src/grammar/xml/ContextFree/CFG.h
@@ -28,10 +28,12 @@
 #include "../common/GrammarFromXMLParser.h"
 #include "../common/GrammarToXMLComposer.h"
 
+#include <container/xml/ObjectsVariant.h>
+
 namespace core {
 
-template < class SymbolType >
-struct xmlApi < grammar::CFG < SymbolType > > {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+struct xmlApi < grammar::CFG < TerminalSymbolType, NonterminalSymbolType > > {
 	/**
 	 * \brief The XML tag name of class.
 	 *
@@ -63,7 +65,7 @@ struct xmlApi < grammar::CFG < SymbolType > > {
 	 *
 	 * \returns the new instance of the grammar
 	 */
-	static grammar::CFG < SymbolType > parse ( ext::deque < sax::Token >::iterator & input );
+	static grammar::CFG < TerminalSymbolType, NonterminalSymbolType > parse ( ext::deque < sax::Token >::iterator & input );
 
 	/**
 	 * Helper for parsing of individual rules of the grammar from a sequence of xml tokens.
@@ -71,7 +73,7 @@ struct xmlApi < grammar::CFG < SymbolType > > {
 	 * \params input the iterator to sequence of xml tokens to parse from
 	 * \params grammar the grammar to add the rule to
 	 */
-	static void parseRule ( ext::deque < sax::Token >::iterator & input, grammar::CFG < SymbolType > & grammar );
+	static void parseRule ( ext::deque < sax::Token >::iterator & input, grammar::CFG < TerminalSymbolType, NonterminalSymbolType > & grammar );
 
 	/**
 	 * Composing to a sequence of xml tokens helper.
@@ -79,7 +81,7 @@ struct xmlApi < grammar::CFG < SymbolType > > {
 	 * \param out sink for new xml tokens representing the grammar
 	 * \param grammar the grammar to compose
 	 */
-	static void compose ( ext::deque < sax::Token > & out, const grammar::CFG < SymbolType > & grammar );
+	static void compose ( ext::deque < sax::Token > & out, const grammar::CFG < TerminalSymbolType, NonterminalSymbolType > & grammar );
 
 	/**
 	 * Helper for composing rules of the grammar to a sequence of xml tokens.
@@ -87,18 +89,18 @@ struct xmlApi < grammar::CFG < SymbolType > > {
 	 * \param out sink for xml tokens representing the rules of the grammar
 	 * \param grammar the grammar to compose
 	 */
-	static void composeRules ( ext::deque < sax::Token > & out, const grammar::CFG < SymbolType > & grammar );
+	static void composeRules ( ext::deque < sax::Token > & out, const grammar::CFG < TerminalSymbolType, NonterminalSymbolType > & grammar );
 };
 
-template < class SymbolType >
-grammar::CFG < SymbolType > xmlApi < grammar::CFG < SymbolType > >::parse ( ext::deque < sax::Token >::iterator & input ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+grammar::CFG < TerminalSymbolType, NonterminalSymbolType > xmlApi < grammar::CFG < TerminalSymbolType, NonterminalSymbolType > >::parse ( ext::deque < sax::Token >::iterator & input ) {
 	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) );
 
-	ext::set < SymbolType > nonterminalAlphabet = grammar::GrammarFromXMLParser::parseNonterminalAlphabet < SymbolType > ( input );
-	ext::set < SymbolType > terminalAlphabet = grammar::GrammarFromXMLParser::parseTerminalAlphabet < SymbolType > ( input );
-	SymbolType initialSymbol = grammar::GrammarFromXMLParser::parseInitialSymbol < SymbolType > ( input );
+	ext::set < NonterminalSymbolType > nonterminalAlphabet = grammar::GrammarFromXMLParser::parseNonterminalAlphabet < NonterminalSymbolType > ( input );
+	ext::set < TerminalSymbolType > terminalAlphabet = grammar::GrammarFromXMLParser::parseTerminalAlphabet < TerminalSymbolType > ( input );
+	NonterminalSymbolType initialSymbol = grammar::GrammarFromXMLParser::parseInitialSymbol < NonterminalSymbolType > ( input );
 
-	grammar::CFG < SymbolType > grammar ( std::move ( initialSymbol ) );
+	grammar::CFG < TerminalSymbolType, NonterminalSymbolType > grammar ( std::move ( initialSymbol ) );
 
 	grammar.setNonterminalAlphabet ( std::move ( nonterminalAlphabet ) );
 	grammar.setTerminalAlphabet ( std::move ( terminalAlphabet ) );
@@ -109,16 +111,16 @@ grammar::CFG < SymbolType > xmlApi < grammar::CFG < SymbolType > >::parse ( ext:
 	return grammar;
 }
 
-template < class SymbolType >
-void xmlApi < grammar::CFG < SymbolType > >::parseRule ( ext::deque < sax::Token >::iterator & input, grammar::CFG < SymbolType > & grammar ) {
-	SymbolType lhs = grammar::GrammarFromXMLParser::parseRuleSingleSymbolLHS < SymbolType > ( input );
-	ext::vector < SymbolType > rhs = grammar::GrammarFromXMLParser::parseRuleRHS < SymbolType > ( input );
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void xmlApi < grammar::CFG < TerminalSymbolType, NonterminalSymbolType > >::parseRule ( ext::deque < sax::Token >::iterator & input, grammar::CFG < TerminalSymbolType, NonterminalSymbolType > & grammar ) {
+	NonterminalSymbolType lhs = grammar::GrammarFromXMLParser::parseRuleSingleSymbolLHS < NonterminalSymbolType > ( input );
+	ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rhs = grammar::GrammarFromXMLParser::parseRuleRHS < ext::variant < TerminalSymbolType, NonterminalSymbolType > > ( input );
 
 	grammar.addRule ( std::move ( lhs ), std::move ( rhs ) );
 }
 
-template < class SymbolType >
-void xmlApi < grammar::CFG < SymbolType > >::compose ( ext::deque < sax::Token > & out, const grammar::CFG < SymbolType > & grammar ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void xmlApi < grammar::CFG < TerminalSymbolType, NonterminalSymbolType > >::compose ( ext::deque < sax::Token > & out, const grammar::CFG < TerminalSymbolType, NonterminalSymbolType > & grammar ) {
 	out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT );
 
 	grammar::GrammarToXMLComposer::composeNonterminalAlphabet ( out, grammar.getNonterminalAlphabet ( ) );
@@ -129,8 +131,8 @@ void xmlApi < grammar::CFG < SymbolType > >::compose ( ext::deque < sax::Token >
 	out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT );
 }
 
-template < class SymbolType >
-void xmlApi < grammar::CFG < SymbolType > >::composeRules ( ext::deque < sax::Token > & out, const grammar::CFG < SymbolType > & grammar ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void xmlApi < grammar::CFG < TerminalSymbolType, NonterminalSymbolType > >::composeRules ( ext::deque < sax::Token > & out, const grammar::CFG < TerminalSymbolType, NonterminalSymbolType > & grammar ) {
 	out.emplace_back ( "rules", sax::Token::TokenType::START_ELEMENT );
 
 	for ( const auto & rule : grammar.getRules ( ) )
diff --git a/alib2data/src/grammar/xml/ContextFree/CNF.h b/alib2data/src/grammar/xml/ContextFree/CNF.h
index 150648aff2..4f69d392fe 100644
--- a/alib2data/src/grammar/xml/ContextFree/CNF.h
+++ b/alib2data/src/grammar/xml/ContextFree/CNF.h
@@ -28,10 +28,14 @@
 #include "../common/GrammarFromXMLParser.h"
 #include "../common/GrammarToXMLComposer.h"
 
+#include <grammar/AddRawRule.h>
+
+#include <container/xml/ObjectsVariant.h>
+
 namespace core {
 
-template < class SymbolType >
-struct xmlApi < grammar::CNF < SymbolType > > {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+struct xmlApi < grammar::CNF < TerminalSymbolType, NonterminalSymbolType > > {
 	/**
 	 * \brief The XML tag name of class.
 	 *
@@ -63,7 +67,7 @@ struct xmlApi < grammar::CNF < SymbolType > > {
 	 *
 	 * \returns the new instance of the grammar
 	 */
-	static grammar::CNF < SymbolType > parse ( ext::deque < sax::Token >::iterator & input );
+	static grammar::CNF < TerminalSymbolType, NonterminalSymbolType > parse ( ext::deque < sax::Token >::iterator & input );
 
 	/**
 	 * Helper for parsing of individual rules of the grammar from a sequence of xml tokens.
@@ -71,7 +75,7 @@ struct xmlApi < grammar::CNF < SymbolType > > {
 	 * \params input the iterator to sequence of xml tokens to parse from
 	 * \params grammar the grammar to add the rule to
 	 */
-	static void parseRule ( ext::deque < sax::Token >::iterator & input, grammar::CNF < SymbolType > & grammar );
+	static void parseRule ( ext::deque < sax::Token >::iterator & input, grammar::CNF < TerminalSymbolType, NonterminalSymbolType > & grammar );
 
 	/**
 	 * Composing to a sequence of xml tokens helper.
@@ -79,7 +83,7 @@ struct xmlApi < grammar::CNF < SymbolType > > {
 	 * \param out sink for new xml tokens representing the grammar
 	 * \param grammar the grammar to compose
 	 */
-	static void compose ( ext::deque < sax::Token > & out, const grammar::CNF < SymbolType > & grammar );
+	static void compose ( ext::deque < sax::Token > & out, const grammar::CNF < TerminalSymbolType, NonterminalSymbolType > & grammar );
 
 	/**
 	 * Helper for composing rules of the grammar to a sequence of xml tokens.
@@ -87,18 +91,18 @@ struct xmlApi < grammar::CNF < SymbolType > > {
 	 * \param out sink for xml tokens representing the rules of the grammar
 	 * \param grammar the grammar to compose
 	 */
-	static void composeRules ( ext::deque < sax::Token > & out, const grammar::CNF < SymbolType > & grammar );
+	static void composeRules ( ext::deque < sax::Token > & out, const grammar::CNF < TerminalSymbolType, NonterminalSymbolType > & grammar );
 };
 
-template < class SymbolType >
-grammar::CNF < SymbolType > xmlApi < grammar::CNF < SymbolType > >::parse ( ext::deque < sax::Token >::iterator & input ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+grammar::CNF < TerminalSymbolType, NonterminalSymbolType > xmlApi < grammar::CNF < TerminalSymbolType, NonterminalSymbolType > >::parse ( ext::deque < sax::Token >::iterator & input ) {
 	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) );
 
-	ext::set < SymbolType > nonterminalAlphabet = grammar::GrammarFromXMLParser::parseNonterminalAlphabet < SymbolType > ( input );
-	ext::set < SymbolType > terminalAlphabet = grammar::GrammarFromXMLParser::parseTerminalAlphabet < SymbolType > ( input );
-	SymbolType initialSymbol = grammar::GrammarFromXMLParser::parseInitialSymbol < SymbolType > ( input );
+	ext::set < NonterminalSymbolType > nonterminalAlphabet = grammar::GrammarFromXMLParser::parseNonterminalAlphabet < NonterminalSymbolType > ( input );
+	ext::set < TerminalSymbolType > terminalAlphabet = grammar::GrammarFromXMLParser::parseTerminalAlphabet < TerminalSymbolType > ( input );
+	NonterminalSymbolType initialSymbol = grammar::GrammarFromXMLParser::parseInitialSymbol < NonterminalSymbolType > ( input );
 
-	grammar::CNF < SymbolType > grammar ( std::move ( initialSymbol ) );
+	grammar::CNF < TerminalSymbolType, NonterminalSymbolType > grammar ( std::move ( initialSymbol ) );
 
 	grammar.setNonterminalAlphabet ( std::move ( nonterminalAlphabet ) );
 	grammar.setTerminalAlphabet ( std::move ( terminalAlphabet ) );
@@ -112,16 +116,16 @@ grammar::CNF < SymbolType > xmlApi < grammar::CNF < SymbolType > >::parse ( ext:
 	return grammar;
 }
 
-template < class SymbolType >
-void xmlApi < grammar::CNF < SymbolType > >::parseRule ( ext::deque < sax::Token >::iterator & input, grammar::CNF < SymbolType > & grammar ) {
-	SymbolType lhs = grammar::GrammarFromXMLParser::parseRuleSingleSymbolLHS < SymbolType > ( input );
-	ext::variant < SymbolType, ext::pair < SymbolType, SymbolType > > rhs = grammar::GrammarFromXMLParser::parseRuleOneOrTwoSymbolsRHS < SymbolType > ( input );
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void xmlApi < grammar::CNF < TerminalSymbolType, NonterminalSymbolType > >::parseRule ( ext::deque < sax::Token >::iterator & input, grammar::CNF < TerminalSymbolType, NonterminalSymbolType > & grammar ) {
+	NonterminalSymbolType lhs = grammar::GrammarFromXMLParser::parseRuleSingleSymbolLHS < NonterminalSymbolType > ( input );
+	ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rhs = grammar::GrammarFromXMLParser::parseRuleRHS < ext::variant < TerminalSymbolType, NonterminalSymbolType > > ( input );
 
-	grammar.addRule ( std::move ( lhs ), std::move ( rhs ) );
+	grammar::AddRawRule::addRawRule ( grammar, std::move ( lhs ), std::move ( rhs ) );
 }
 
-template < class SymbolType >
-void xmlApi < grammar::CNF < SymbolType > >::compose ( ext::deque < sax::Token > & out, const grammar::CNF < SymbolType > & grammar ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void xmlApi < grammar::CNF < TerminalSymbolType, NonterminalSymbolType > >::compose ( ext::deque < sax::Token > & out, const grammar::CNF < TerminalSymbolType, NonterminalSymbolType > & grammar ) {
 	out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT );
 
 	grammar::GrammarToXMLComposer::composeNonterminalAlphabet ( out, grammar.getNonterminalAlphabet ( ) );
@@ -133,8 +137,8 @@ void xmlApi < grammar::CNF < SymbolType > >::compose ( ext::deque < sax::Token >
 	out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT );
 }
 
-template < class SymbolType >
-void xmlApi < grammar::CNF < SymbolType > >::composeRules ( ext::deque < sax::Token > & out, const grammar::CNF < SymbolType > & grammar ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void xmlApi < grammar::CNF < TerminalSymbolType, NonterminalSymbolType > >::composeRules ( ext::deque < sax::Token > & out, const grammar::CNF < TerminalSymbolType, NonterminalSymbolType > & grammar ) {
 	out.emplace_back ( "rules", sax::Token::TokenType::START_ELEMENT );
 
 	for ( const auto & rule : grammar.getRules ( ) )
diff --git a/alib2data/src/grammar/xml/ContextFree/EpsilonFreeCFG.h b/alib2data/src/grammar/xml/ContextFree/EpsilonFreeCFG.h
index e7b18aa3ab..2229d1d4cb 100644
--- a/alib2data/src/grammar/xml/ContextFree/EpsilonFreeCFG.h
+++ b/alib2data/src/grammar/xml/ContextFree/EpsilonFreeCFG.h
@@ -28,10 +28,12 @@
 #include "../common/GrammarFromXMLParser.h"
 #include "../common/GrammarToXMLComposer.h"
 
+#include <container/xml/ObjectsVariant.h>
+
 namespace core {
 
-template < class SymbolType >
-struct xmlApi < grammar::EpsilonFreeCFG < SymbolType > > {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+struct xmlApi < grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > > {
 	/**
 	 * \brief The XML tag name of class.
 	 *
@@ -63,7 +65,7 @@ struct xmlApi < grammar::EpsilonFreeCFG < SymbolType > > {
 	 *
 	 * \returns the new instance of the grammar
 	 */
-	static grammar::EpsilonFreeCFG < SymbolType > parse ( ext::deque < sax::Token >::iterator & input );
+	static grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > parse ( ext::deque < sax::Token >::iterator & input );
 
 	/**
 	 * Helper for parsing of individual rules of the grammar from a sequence of xml tokens.
@@ -71,7 +73,7 @@ struct xmlApi < grammar::EpsilonFreeCFG < SymbolType > > {
 	 * \params input the iterator to sequence of xml tokens to parse from
 	 * \params grammar the grammar to add the rule to
 	 */
-	static void parseRule ( ext::deque < sax::Token >::iterator & input, grammar::EpsilonFreeCFG < SymbolType > & grammar );
+	static void parseRule ( ext::deque < sax::Token >::iterator & input, grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & grammar );
 
 	/**
 	 * Composing to a sequence of xml tokens helper.
@@ -79,7 +81,7 @@ struct xmlApi < grammar::EpsilonFreeCFG < SymbolType > > {
 	 * \param out sink for new xml tokens representing the grammar
 	 * \param grammar the grammar to compose
 	 */
-	static void compose ( ext::deque < sax::Token > & out, const grammar::EpsilonFreeCFG < SymbolType > & grammar );
+	static void compose ( ext::deque < sax::Token > & out, const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & grammar );
 
 	/**
 	 * Helper for composing rules of the grammar to a sequence of xml tokens.
@@ -87,18 +89,18 @@ struct xmlApi < grammar::EpsilonFreeCFG < SymbolType > > {
 	 * \param out sink for xml tokens representing the rules of the grammar
 	 * \param grammar the grammar to compose
 	 */
-	static void composeRules ( ext::deque < sax::Token > & out, const grammar::EpsilonFreeCFG < SymbolType > & grammar );
+	static void composeRules ( ext::deque < sax::Token > & out, const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & grammar );
 };
 
-template < class SymbolType >
-grammar::EpsilonFreeCFG < SymbolType > xmlApi < grammar::EpsilonFreeCFG < SymbolType > >::parse ( ext::deque < sax::Token >::iterator & input ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > xmlApi < grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > >::parse ( ext::deque < sax::Token >::iterator & input ) {
 	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) );
 
-	ext::set < SymbolType > nonterminalAlphabet = grammar::GrammarFromXMLParser::parseNonterminalAlphabet < SymbolType > ( input );
-	ext::set < SymbolType > terminalAlphabet = grammar::GrammarFromXMLParser::parseTerminalAlphabet < SymbolType > ( input );
-	SymbolType initialSymbol = grammar::GrammarFromXMLParser::parseInitialSymbol < SymbolType > ( input );
+	ext::set < NonterminalSymbolType > nonterminalAlphabet = grammar::GrammarFromXMLParser::parseNonterminalAlphabet < NonterminalSymbolType > ( input );
+	ext::set < TerminalSymbolType > terminalAlphabet = grammar::GrammarFromXMLParser::parseTerminalAlphabet < TerminalSymbolType > ( input );
+	NonterminalSymbolType initialSymbol = grammar::GrammarFromXMLParser::parseInitialSymbol < NonterminalSymbolType > ( input );
 
-	grammar::EpsilonFreeCFG < SymbolType > grammar ( std::move ( initialSymbol ) );
+	grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > grammar ( std::move ( initialSymbol ) );
 
 	grammar.setNonterminalAlphabet ( std::move ( nonterminalAlphabet ) );
 	grammar.setTerminalAlphabet ( std::move ( terminalAlphabet ) );
@@ -112,16 +114,16 @@ grammar::EpsilonFreeCFG < SymbolType > xmlApi < grammar::EpsilonFreeCFG < Symbol
 	return grammar;
 }
 
-template < class SymbolType >
-void xmlApi < grammar::EpsilonFreeCFG < SymbolType > >::parseRule ( ext::deque < sax::Token >::iterator & input, grammar::EpsilonFreeCFG < SymbolType > & grammar ) {
-	SymbolType lhs = grammar::GrammarFromXMLParser::parseRuleSingleSymbolLHS < SymbolType > ( input );
-	ext::vector < SymbolType > rhs = grammar::GrammarFromXMLParser::parseRuleRHS < SymbolType > ( input );
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void xmlApi < grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > >::parseRule ( ext::deque < sax::Token >::iterator & input, grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & grammar ) {
+	NonterminalSymbolType lhs = grammar::GrammarFromXMLParser::parseRuleSingleSymbolLHS < NonterminalSymbolType > ( input );
+	ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rhs = grammar::GrammarFromXMLParser::parseRuleRHS < ext::variant < TerminalSymbolType, NonterminalSymbolType > > ( input );
 
 	grammar.addRule ( std::move ( lhs ), std::move ( rhs ) );
 }
 
-template < class SymbolType >
-void xmlApi < grammar::EpsilonFreeCFG < SymbolType > >::compose ( ext::deque < sax::Token > & out, const grammar::EpsilonFreeCFG < SymbolType > & grammar ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void xmlApi < grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > >::compose ( ext::deque < sax::Token > & out, const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & grammar ) {
 	out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT );
 
 	grammar::GrammarToXMLComposer::composeNonterminalAlphabet ( out, grammar.getNonterminalAlphabet ( ) );
@@ -133,8 +135,8 @@ void xmlApi < grammar::EpsilonFreeCFG < SymbolType > >::compose ( ext::deque < s
 	out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT );
 }
 
-template < class SymbolType >
-void xmlApi < grammar::EpsilonFreeCFG < SymbolType > >::composeRules ( ext::deque < sax::Token > & out, const grammar::EpsilonFreeCFG < SymbolType > & grammar ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void xmlApi < grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > >::composeRules ( ext::deque < sax::Token > & out, const grammar::EpsilonFreeCFG < TerminalSymbolType, NonterminalSymbolType > & grammar ) {
 	out.emplace_back ( "rules", sax::Token::TokenType::START_ELEMENT );
 
 	for ( const auto & rule : grammar.getRules ( ) )
diff --git a/alib2data/src/grammar/xml/ContextFree/GNF.h b/alib2data/src/grammar/xml/ContextFree/GNF.h
index 89016d7617..4abc398689 100644
--- a/alib2data/src/grammar/xml/ContextFree/GNF.h
+++ b/alib2data/src/grammar/xml/ContextFree/GNF.h
@@ -28,10 +28,14 @@
 #include "../common/GrammarFromXMLParser.h"
 #include "../common/GrammarToXMLComposer.h"
 
+#include <grammar/AddRawRule.h>
+
+#include <container/xml/ObjectsVariant.h>
+
 namespace core {
 
-template < class SymbolType >
-struct xmlApi < grammar::GNF < SymbolType > > {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+struct xmlApi < grammar::GNF < TerminalSymbolType, NonterminalSymbolType > > {
 	/**
 	 * \brief The XML tag name of class.
 	 *
@@ -63,7 +67,7 @@ struct xmlApi < grammar::GNF < SymbolType > > {
 	 *
 	 * \returns the new instance of the grammar
 	 */
-	static grammar::GNF < SymbolType > parse ( ext::deque < sax::Token >::iterator & input );
+	static grammar::GNF < TerminalSymbolType, NonterminalSymbolType > parse ( ext::deque < sax::Token >::iterator & input );
 
 	/**
 	 * Helper for parsing of individual rules of the grammar from a sequence of xml tokens.
@@ -71,7 +75,7 @@ struct xmlApi < grammar::GNF < SymbolType > > {
 	 * \params input the iterator to sequence of xml tokens to parse from
 	 * \params grammar the grammar to add the rule to
 	 */
-	static void parseRule ( ext::deque < sax::Token >::iterator & input, grammar::GNF < SymbolType > & grammar );
+	static void parseRule ( ext::deque < sax::Token >::iterator & input, grammar::GNF < TerminalSymbolType, NonterminalSymbolType > & grammar );
 
 	/**
 	 * Composing to a sequence of xml tokens helper.
@@ -79,7 +83,7 @@ struct xmlApi < grammar::GNF < SymbolType > > {
 	 * \param out sink for new xml tokens representing the grammar
 	 * \param grammar the grammar to compose
 	 */
-	static void compose ( ext::deque < sax::Token > & out, const grammar::GNF < SymbolType > & grammar );
+	static void compose ( ext::deque < sax::Token > & out, const grammar::GNF < TerminalSymbolType, NonterminalSymbolType > & grammar );
 
 	/**
 	 * Helper for composing rules of the grammar to a sequence of xml tokens.
@@ -87,18 +91,18 @@ struct xmlApi < grammar::GNF < SymbolType > > {
 	 * \param out sink for xml tokens representing the rules of the grammar
 	 * \param grammar the grammar to compose
 	 */
-	static void composeRules ( ext::deque < sax::Token > & out, const grammar::GNF < SymbolType > & grammar );
+	static void composeRules ( ext::deque < sax::Token > & out, const grammar::GNF < TerminalSymbolType, NonterminalSymbolType > & grammar );
 };
 
-template < class SymbolType >
-grammar::GNF < SymbolType > xmlApi < grammar::GNF < SymbolType > >::parse ( ext::deque < sax::Token >::iterator & input ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+grammar::GNF < TerminalSymbolType, NonterminalSymbolType > xmlApi < grammar::GNF < TerminalSymbolType, NonterminalSymbolType > >::parse ( ext::deque < sax::Token >::iterator & input ) {
 	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, xmlTagName ( ) );
 
-	ext::set < SymbolType > nonterminalAlphabet = grammar::GrammarFromXMLParser::parseNonterminalAlphabet < SymbolType > ( input );
-	ext::set < SymbolType > terminalAlphabet = grammar::GrammarFromXMLParser::parseTerminalAlphabet < SymbolType > ( input );
-	SymbolType initialSymbol = grammar::GrammarFromXMLParser::parseInitialSymbol < SymbolType > ( input );
+	ext::set < NonterminalSymbolType > nonterminalAlphabet = grammar::GrammarFromXMLParser::parseNonterminalAlphabet < NonterminalSymbolType > ( input );
+	ext::set < TerminalSymbolType > terminalAlphabet = grammar::GrammarFromXMLParser::parseTerminalAlphabet < TerminalSymbolType > ( input );
+	NonterminalSymbolType initialSymbol = grammar::GrammarFromXMLParser::parseInitialSymbol < NonterminalSymbolType > ( input );
 
-	grammar::GNF < SymbolType > grammar ( std::move ( initialSymbol ) );
+	grammar::GNF < TerminalSymbolType, NonterminalSymbolType > grammar ( std::move ( initialSymbol ) );
 
 	grammar.setNonterminalAlphabet ( std::move ( nonterminalAlphabet ) );
 	grammar.setTerminalAlphabet ( std::move ( terminalAlphabet ) );
@@ -112,16 +116,16 @@ grammar::GNF < SymbolType > xmlApi < grammar::GNF < SymbolType > >::parse ( ext:
 	return grammar;
 }
 
-template < class SymbolType >
-void xmlApi < grammar::GNF < SymbolType > >::parseRule ( ext::deque < sax::Token >::iterator & input, grammar::GNF < SymbolType > & grammar ) {
-	SymbolType lhs = grammar::GrammarFromXMLParser::parseRuleSingleSymbolLHS < SymbolType > ( input );
-	ext::pair < SymbolType, ext::vector < SymbolType > > rhs = grammar::GrammarFromXMLParser::parseRuleGNFRHS < SymbolType > ( input );
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void xmlApi < grammar::GNF < TerminalSymbolType, NonterminalSymbolType > >::parseRule ( ext::deque < sax::Token >::iterator & input, grammar::GNF < TerminalSymbolType, NonterminalSymbolType > & grammar ) {
+	NonterminalSymbolType lhs = grammar::GrammarFromXMLParser::parseRuleSingleSymbolLHS < NonterminalSymbolType > ( input );
+	ext::vector < ext::variant < TerminalSymbolType, NonterminalSymbolType > > rhs = grammar::GrammarFromXMLParser::parseRuleRHS < ext::variant < TerminalSymbolType, NonterminalSymbolType > > ( input );
 
-	grammar.addRule ( std::move ( lhs ), std::move ( rhs ) );
+	grammar::AddRawRule::addRawRule ( grammar, std::move ( lhs ), std::move ( rhs ) );
 }
 
-template < class SymbolType >
-void xmlApi < grammar::GNF < SymbolType > >::compose ( ext::deque < sax::Token > & out, const grammar::GNF < SymbolType > & grammar ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void xmlApi < grammar::GNF < TerminalSymbolType, NonterminalSymbolType > >::compose ( ext::deque < sax::Token > & out, const grammar::GNF < TerminalSymbolType, NonterminalSymbolType > & grammar ) {
 	out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::START_ELEMENT );
 
 	grammar::GrammarToXMLComposer::composeNonterminalAlphabet ( out, grammar.getNonterminalAlphabet ( ) );
@@ -133,8 +137,8 @@ void xmlApi < grammar::GNF < SymbolType > >::compose ( ext::deque < sax::Token >
 	out.emplace_back ( xmlTagName ( ), sax::Token::TokenType::END_ELEMENT );
 }
 
-template < class SymbolType >
-void xmlApi < grammar::GNF < SymbolType > >::composeRules ( ext::deque < sax::Token > & out, const grammar::GNF < SymbolType > & grammar ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void xmlApi < grammar::GNF < TerminalSymbolType, NonterminalSymbolType > >::composeRules ( ext::deque < sax::Token > & out, const grammar::GNF < TerminalSymbolType, NonterminalSymbolType > & grammar ) {
 	out.emplace_back ( "rules", sax::Token::TokenType::START_ELEMENT );
 
 	for ( const auto & rule : grammar.getRules ( ) )
diff --git a/alib2data/src/grammar/xml/common/GrammarFromXMLParser.h b/alib2data/src/grammar/xml/common/GrammarFromXMLParser.h
index 9ee6d7dbe9..4b8787dd46 100644
--- a/alib2data/src/grammar/xml/common/GrammarFromXMLParser.h
+++ b/alib2data/src/grammar/xml/common/GrammarFromXMLParser.h
@@ -56,11 +56,7 @@ public:
 	template < class SymbolType >
 	static SymbolType parseRuleSingleSymbolLHS(ext::deque<sax::Token>::iterator& input);
 	template < class SymbolType >
-	static ext::pair<SymbolType, ext::vector<SymbolType>> parseRuleGNFRHS(ext::deque<sax::Token>::iterator& input);
-	template < class SymbolType >
 	static ext::vector<SymbolType> parseRuleRHS(ext::deque<sax::Token>::iterator& input);
-	template < class SymbolType >
-	static ext::variant<SymbolType, ext::pair<SymbolType, SymbolType>> parseRuleOneOrTwoSymbolsRHS(ext::deque<sax::Token>::iterator& input);
 
 	template<class T>
 	static void parseRules(ext::deque<sax::Token>::iterator& input, T& grammar);
@@ -146,18 +142,6 @@ ext::vector<SymbolType> GrammarFromXMLParser::parseRuleRContext(ext::deque<sax::
 	return rContext;
 }
 
-template < class SymbolType >
-ext::pair<SymbolType, ext::vector<SymbolType>> GrammarFromXMLParser::parseRuleGNFRHS(ext::deque<sax::Token>::iterator& input) {
-	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "rhs");
-	SymbolType first = core::xmlApi<SymbolType>::parse(input);
-	ext::vector<SymbolType> second;
-	while (sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
-		second.push_back(core::xmlApi<SymbolType>::parse(input));
-	}
-	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "rhs");
-	return ext::make_pair(std::move(first), std::move(second));
-}
-
 template < class SymbolType >
 ext::vector<SymbolType> GrammarFromXMLParser::parseRuleRHS(ext::deque<sax::Token>::iterator& input) {
 	ext::vector<SymbolType> rhs;
@@ -172,20 +156,6 @@ ext::vector<SymbolType> GrammarFromXMLParser::parseRuleRHS(ext::deque<sax::Token
 	return rhs;
 }
 
-template < class SymbolType >
-ext::variant<SymbolType, ext::pair<SymbolType, SymbolType>> GrammarFromXMLParser::parseRuleOneOrTwoSymbolsRHS(ext::deque<sax::Token>::iterator& input) {
-	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "rhs");
-	SymbolType first = core::xmlApi<SymbolType>::parse(input);
-	if(sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
-		SymbolType second = core::xmlApi<SymbolType>::parse(input);
-		sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "rhs");
-		return ext::variant<SymbolType, ext::pair<SymbolType, SymbolType>>(ext::make_pair(std::move(first), std::move(second)));
-	} else {
-		sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "rhs");
-		return ext::variant<SymbolType, ext::pair<SymbolType, SymbolType>>(std::move(first));
-	}
-}
-
 template<class T>
 void GrammarFromXMLParser::parseRules(ext::deque<sax::Token>::iterator& input, T& grammar) {
 	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "rules");
diff --git a/alib2data/src/grammar/xml/common/GrammarToXMLComposer.h b/alib2data/src/grammar/xml/common/GrammarToXMLComposer.h
index 988d36be7a..51308bbce7 100644
--- a/alib2data/src/grammar/xml/common/GrammarToXMLComposer.h
+++ b/alib2data/src/grammar/xml/common/GrammarToXMLComposer.h
@@ -55,8 +55,8 @@ public:
 	static void composeRuleRHS(ext::deque<sax::Token>& out, const ext::vector<SymbolType>& symbols);
 	template < class T, class R, class S >
 	static void composeRuleOneOrTwoSymbolsRHS ( ext::deque < sax::Token > & out, const ext::variant < T, ext::pair < R, S > > & symbols );
-	template < class SymbolType >
-	static void composeRuleGNFRHS(ext::deque<sax::Token>& out, const ext::pair<SymbolType, ext::vector<SymbolType>>& symbols);
+	template < class TerminalSymbolType, class NonterminalSymbolType >
+	static void composeRuleGNFRHS(ext::deque<sax::Token>& out, const ext::pair<TerminalSymbolType, ext::vector<NonterminalSymbolType>>& symbols);
 	template < class TerminalSymbolType, class NonterminalSymbolType >
 	static void composeRuleLeftLGRHS(ext::deque<sax::Token>& out, const ext::variant<ext::vector<TerminalSymbolType>, ext::pair<NonterminalSymbolType, ext::vector<TerminalSymbolType>>>& symbols);
 	template < class TerminalSymbolType, class NonterminalSymbolType >
@@ -158,14 +158,14 @@ void GrammarToXMLComposer::composeRuleOneOrTwoSymbolsRHS ( ext::deque < sax::Tok
 	out.emplace_back("rhs", sax::Token::TokenType::END_ELEMENT);
 }
 
-template < class SymbolType >
-void GrammarToXMLComposer::composeRuleGNFRHS(ext::deque<sax::Token>& out, const ext::pair<SymbolType, ext::vector<SymbolType>>& symbols) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void GrammarToXMLComposer::composeRuleGNFRHS(ext::deque<sax::Token>& out, const ext::pair<TerminalSymbolType, ext::vector<NonterminalSymbolType>>& symbols) {
 	out.emplace_back("rhs", sax::Token::TokenType::START_ELEMENT);
 
-	core::xmlApi<SymbolType>::compose(out, symbols.first);
+	core::xmlApi<TerminalSymbolType>::compose(out, symbols.first);
 
 	for (const auto& symbol : symbols.second) {
-		core::xmlApi<SymbolType>::compose(out, symbol);
+		core::xmlApi<NonterminalSymbolType>::compose(out, symbol);
 	}
 
 	out.emplace_back("rhs", sax::Token::TokenType::END_ELEMENT);
diff --git a/alib2data/test-src/grammar/GrammarTest.cpp b/alib2data/test-src/grammar/GrammarTest.cpp
index daac785bb2..40bd53c1d0 100644
--- a/alib2data/test-src/grammar/GrammarTest.cpp
+++ b/alib2data/test-src/grammar/GrammarTest.cpp
@@ -14,6 +14,11 @@
 #include "grammar/Regular/RightLG.h"
 #include "grammar/xml/Regular/RightLG.h"
 
+#include "grammar/Regular/LeftRG.h"
+#include "grammar/xml/Regular/LeftRG.h"
+#include "grammar/Regular/LeftLG.h"
+#include "grammar/xml/Regular/LeftLG.h"
+
 #include "grammar/ContextFree/LG.h"
 #include "grammar/xml/ContextFree/LG.h"
 #include "grammar/ContextFree/EpsilonFreeCFG.h"
@@ -151,6 +156,58 @@ void GrammarTest::testRegularParser() {
 			CPPUNIT_ASSERT( grammar == grammar2 );
 		}
 	}
+
+	{
+		grammar::LeftRG < std::string, int > grammar ( 1 );
+
+		grammar.addNonterminalSymbol ( 1 );
+		grammar.addNonterminalSymbol ( 2 );
+		grammar.addNonterminalSymbol ( 3 );
+		grammar.addTerminalSymbol ( "a" );
+		grammar.addTerminalSymbol ( "b" );
+
+		grammar.addRule ( 1, ext::make_pair ( 2, "a" ) );
+		grammar.addRule ( 2, ext::make_pair ( 3, "b" ) );
+
+		CPPUNIT_ASSERT( grammar == grammar );
+		{
+			ext::deque<sax::Token> tokens = factory::XmlDataFactory::toTokens(grammar);
+			std::string tmp = sax::SaxComposeInterface::composeMemory ( tokens );
+
+			ext::deque<sax::Token> tokens2 = sax::SaxParseInterface::parseMemory ( tmp );
+			grammar::LeftRG < std::string, int > grammar2 = factory::XmlDataFactory::fromTokens (std::move(tokens2));
+
+			CPPUNIT_ASSERT( grammar == grammar2 );
+		}
+	}
+
+	{
+		grammar::LeftLG < std::string, int > grammar ( 1 );
+
+		grammar.addNonterminalSymbol ( 1 );
+		grammar.addNonterminalSymbol ( 2 );
+		grammar.addNonterminalSymbol ( 3 );
+		grammar.addTerminalSymbol ( "a" );
+		grammar.addTerminalSymbol ( "b" );
+
+		grammar.addRule ( 1, ext::make_pair ( 2, ext::vector < std::string > { "a" } ) );
+		grammar.addRule ( 2, ext::make_pair ( 3, ext::vector < std::string > { "b" } ) );
+		grammar.addRule ( 1, ext::make_pair ( 3, ext::vector < std::string > {} ) );
+		grammar.addRule ( 1, ext::make_pair ( 2, ext::vector < std::string > { "a", "a", "a" } ) );
+
+		CPPUNIT_ASSERT( grammar == grammar );
+		{
+			ext::deque<sax::Token> tokens = factory::XmlDataFactory::toTokens(grammar);
+			std::string tmp = sax::SaxComposeInterface::composeMemory ( tokens );
+
+			std::cout << tmp << std::endl;
+
+			ext::deque<sax::Token> tokens2 = sax::SaxParseInterface::parseMemory ( tmp );
+			grammar::LeftLG < std::string, int > grammar2 = factory::XmlDataFactory::fromTokens (std::move(tokens2));
+
+			CPPUNIT_ASSERT( grammar == grammar2 );
+		}
+	}
 }
 
 void GrammarTest::testContextFreeParser() {
@@ -180,19 +237,19 @@ void GrammarTest::testContextFreeParser() {
 		}
 	}
 	{
-		grammar::EpsilonFreeCFG < > grammar(DefaultSymbolType(1));
+		grammar::EpsilonFreeCFG < std::string, int > grammar ( 1 );
 
-		grammar.addNonterminalSymbol(DefaultSymbolType(1));
-		grammar.addNonterminalSymbol(DefaultSymbolType(2));
-		grammar.addNonterminalSymbol(DefaultSymbolType(3));
-		grammar.addTerminalSymbol(DefaultSymbolType("a"));
-		grammar.addTerminalSymbol(DefaultSymbolType("b"));
-		grammar.setGeneratesEpsilon(true);
+		grammar.addNonterminalSymbol ( 1 );
+		grammar.addNonterminalSymbol ( 2 );
+		grammar.addNonterminalSymbol ( 3 );
+		grammar.addTerminalSymbol ( "a" );
+		grammar.addTerminalSymbol ( "b" );
+		grammar.setGeneratesEpsilon ( true );
 
-		grammar.addRule(DefaultSymbolType(1), ext::vector<DefaultSymbolType> {DefaultSymbolType("a"), DefaultSymbolType(2)});
-		grammar.addRule(DefaultSymbolType(2), ext::vector<DefaultSymbolType> {DefaultSymbolType("b"), DefaultSymbolType(3)});
-		grammar.addRule(DefaultSymbolType(1), ext::vector<DefaultSymbolType> {DefaultSymbolType(3)});
-		grammar.addRule(DefaultSymbolType(1), ext::vector<DefaultSymbolType> {DefaultSymbolType("a"), DefaultSymbolType("a"), DefaultSymbolType("a"), DefaultSymbolType(2)});
+		grammar.addRule ( 1, ext::vector < ext::variant < std::string, int > > { { "a" }, { 2 } } );
+		grammar.addRule ( 2, ext::vector < ext::variant < std::string, int > > { { "b" }, { 3 } } );
+		grammar.addRule ( 1, ext::vector < ext::variant < std::string, int > > { { 3 } } );
+		grammar.addRule ( 1, ext::vector < ext::variant < std::string, int > > { { "a" }, { "a" }, { "a" }, { 2 } } );
 
 		CPPUNIT_ASSERT( grammar == grammar );
 		{
@@ -200,25 +257,25 @@ void GrammarTest::testContextFreeParser() {
 			std::string tmp = sax::SaxComposeInterface::composeMemory ( tokens );
 
 			ext::deque<sax::Token> tokens2 = sax::SaxParseInterface::parseMemory ( tmp );
-			grammar::EpsilonFreeCFG < > grammar2 = factory::XmlDataFactory::fromTokens (std::move(tokens2));
+			grammar::EpsilonFreeCFG < std::string, int > grammar2 = factory::XmlDataFactory::fromTokens (std::move(tokens2));
 
 			CPPUNIT_ASSERT( grammar == grammar2 );
 		}
 	}
 	{
-		grammar::CFG < > grammar(DefaultSymbolType(1));
+		grammar::CFG < std::string, int > grammar ( 1 );
 
-		grammar.addNonterminalSymbol(DefaultSymbolType(1));
-		grammar.addNonterminalSymbol(DefaultSymbolType(2));
-		grammar.addNonterminalSymbol(DefaultSymbolType(3));
-		grammar.addTerminalSymbol(DefaultSymbolType("a"));
-		grammar.addTerminalSymbol(DefaultSymbolType("b"));
+		grammar.addNonterminalSymbol ( 1 );
+		grammar.addNonterminalSymbol ( 2 );
+		grammar.addNonterminalSymbol ( 3 );
+		grammar.addTerminalSymbol ( "a" );
+		grammar.addTerminalSymbol ( "b" );
 
-		grammar.addRule(DefaultSymbolType(1), ext::vector<DefaultSymbolType> {DefaultSymbolType("a"), DefaultSymbolType(2)});
-		grammar.addRule(DefaultSymbolType(2), ext::vector<DefaultSymbolType> {DefaultSymbolType("b"), DefaultSymbolType(3)});
-		grammar.addRule(DefaultSymbolType(1), ext::vector<DefaultSymbolType> {DefaultSymbolType(3)});
-		grammar.addRule(DefaultSymbolType(1), ext::vector<DefaultSymbolType> {DefaultSymbolType("a"), DefaultSymbolType("a"), DefaultSymbolType("a"), DefaultSymbolType(2)});
-		grammar.addRule(DefaultSymbolType(2), ext::vector<DefaultSymbolType> {});
+		grammar.addRule ( 1, ext::vector < ext::variant < std::string, int > > { { "a" }, { 2 } } );
+		grammar.addRule ( 2, ext::vector < ext::variant < std::string, int > > { { "b" }, { 3 } } );
+		grammar.addRule ( 1, ext::vector < ext::variant < std::string, int > > { { 3 } } );
+		grammar.addRule ( 1, ext::vector < ext::variant < std::string, int > > { { "a" }, { "a" }, { "a" }, { 2 } } );
+		grammar.addRule ( 2, ext::vector < ext::variant < std::string, int > > { } );
 
 		CPPUNIT_ASSERT( grammar == grammar );
 		{
@@ -226,25 +283,25 @@ void GrammarTest::testContextFreeParser() {
 			std::string tmp = sax::SaxComposeInterface::composeMemory ( tokens );
 
 			ext::deque<sax::Token> tokens2 = sax::SaxParseInterface::parseMemory ( tmp );
-			grammar::CFG < > grammar2 = factory::XmlDataFactory::fromTokens (std::move(tokens2));
+			grammar::CFG < std::string, int > grammar2 = factory::XmlDataFactory::fromTokens (std::move(tokens2));
 
 			CPPUNIT_ASSERT( grammar == grammar2 );
 		}
 	}
 	{
-		grammar::CNF < > grammar(DefaultSymbolType(1));
+		grammar::CNF < std::string, int > grammar ( 1 );
 
-		grammar.addNonterminalSymbol(DefaultSymbolType(1));
-		grammar.addNonterminalSymbol(DefaultSymbolType(2));
-		grammar.addNonterminalSymbol(DefaultSymbolType(3));
-		grammar.addTerminalSymbol(DefaultSymbolType("a"));
-		grammar.addTerminalSymbol(DefaultSymbolType("b"));
-		grammar.setGeneratesEpsilon(true);
+		grammar.addNonterminalSymbol ( 1 );
+		grammar.addNonterminalSymbol ( 2 );
+		grammar.addNonterminalSymbol ( 3 );
+		grammar.addTerminalSymbol ( "a" );
+		grammar.addTerminalSymbol ( "b" );
+		grammar.setGeneratesEpsilon ( true );
 
-		grammar.addRule(DefaultSymbolType(1), ext::make_pair(DefaultSymbolType(3), DefaultSymbolType(2)));
-		grammar.addRule(DefaultSymbolType(2), ext::make_pair(DefaultSymbolType(3), DefaultSymbolType(3)));
-		grammar.addRule(DefaultSymbolType(3), DefaultSymbolType("a"));
-		grammar.addRule(DefaultSymbolType(1), DefaultSymbolType("a"));
+		grammar.addRule ( 1, ext::make_pair ( 3, 2 ) );
+		grammar.addRule ( 2, ext::make_pair ( 3, 3 ) );
+		grammar.addRule ( 3, "a" );
+		grammar.addRule ( 1, "a" );
 
 		CPPUNIT_ASSERT( grammar == grammar );
 		{
@@ -252,25 +309,25 @@ void GrammarTest::testContextFreeParser() {
 			std::string tmp = sax::SaxComposeInterface::composeMemory ( tokens );
 
 			ext::deque<sax::Token> tokens2 = sax::SaxParseInterface::parseMemory ( tmp );
-			grammar::CNF < > grammar2 = factory::XmlDataFactory::fromTokens (std::move(tokens2));
+			grammar::CNF < std::string, int > grammar2 = factory::XmlDataFactory::fromTokens (std::move(tokens2));
 
 			CPPUNIT_ASSERT( grammar == grammar2 );
 		}
 	}
 	{
-		grammar::GNF < > grammar(DefaultSymbolType(1));
+		grammar::GNF < std::string, int > grammar ( 1 );
 
-		grammar.addNonterminalSymbol(DefaultSymbolType(1));
-		grammar.addNonterminalSymbol(DefaultSymbolType(2));
-		grammar.addNonterminalSymbol(DefaultSymbolType(3));
-		grammar.addTerminalSymbol(DefaultSymbolType("a"));
-		grammar.addTerminalSymbol(DefaultSymbolType("b"));
-		grammar.setGeneratesEpsilon(true);
+		grammar.addNonterminalSymbol ( 1 );
+		grammar.addNonterminalSymbol ( 2 );
+		grammar.addNonterminalSymbol ( 3 );
+		grammar.addTerminalSymbol ( "a" );
+		grammar.addTerminalSymbol ( "b" );
+		grammar.setGeneratesEpsilon ( true );
 
-		grammar.addRule(DefaultSymbolType(1), ext::make_pair(DefaultSymbolType("a"), ext::vector<DefaultSymbolType> {DefaultSymbolType(2)}));
-		grammar.addRule(DefaultSymbolType(2), ext::make_pair(DefaultSymbolType("b"), ext::vector<DefaultSymbolType> {DefaultSymbolType(3)}));
-		grammar.addRule(DefaultSymbolType(3), ext::make_pair(DefaultSymbolType("a"), ext::vector<DefaultSymbolType> {}));
-		grammar.addRule(DefaultSymbolType(1), ext::make_pair(DefaultSymbolType("a"), ext::vector<DefaultSymbolType> {}));
+		grammar.addRule ( 1, ext::make_pair ( "a", ext::vector < int > { 2 } ) );
+		grammar.addRule ( 2, ext::make_pair ( "b", ext::vector < int > { 3 } ) );
+		grammar.addRule ( 3, ext::make_pair ( "a", ext::vector < int > { } ) );
+		grammar.addRule ( 1, ext::make_pair ( "a", ext::vector < int > { } ) );
 
 		CPPUNIT_ASSERT( grammar == grammar );
 		{
@@ -278,7 +335,7 @@ void GrammarTest::testContextFreeParser() {
 			std::string tmp = sax::SaxComposeInterface::composeMemory ( tokens );
 
 			ext::deque<sax::Token> tokens2 = sax::SaxParseInterface::parseMemory ( tmp );
-			grammar::GNF < > grammar2 = factory::XmlDataFactory::fromTokens (std::move(tokens2));
+			grammar::GNF < std::string, int > grammar2 = factory::XmlDataFactory::fromTokens (std::move(tokens2));
 
 			CPPUNIT_ASSERT( grammar == grammar2 );
 		}
diff --git a/alib2data_experimental/src/grammar/parsing/LRParserTypes.h b/alib2data_experimental/src/grammar/parsing/LRParserTypes.h
index 15a0088f2d..4d46764ce2 100644
--- a/alib2data_experimental/src/grammar/parsing/LRParserTypes.h
+++ b/alib2data_experimental/src/grammar/parsing/LRParserTypes.h
@@ -26,9 +26,9 @@ enum class LRAction {
 	Accept
 };
 
-typedef ext::map < DefaultSymbolType, ext::set < ext::pair < unsigned, ext::vector < DefaultSymbolType > > > > LR0Items;
-typedef ext::map < ext::pair < DefaultStateType, DefaultSymbolType >, ext::pair < LRAction, ext::variant < DefaultStateType, ext::pair < DefaultSymbolType, ext::vector < DefaultSymbolType > > > > > LRActionTable;
-typedef ext::map < ext::pair < DefaultStateType, DefaultSymbolType >, DefaultStateType > LRGotoTable;
+typedef ext::map < DefaultSymbolType, ext::set < ext::pair < unsigned, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > > > LR0Items;
+typedef ext::map < ext::pair < LR0Items, DefaultSymbolType >, ext::pair < LRAction, ext::variant < LR0Items, ext::pair < DefaultSymbolType, ext::vector < ext::variant < DefaultSymbolType, DefaultSymbolType > > > > > > LRActionTable;
+typedef ext::map < ext::pair < LR0Items, DefaultSymbolType >, LR0Items > LRGotoTable;
 
 } /* namespace parsing */
 
diff --git a/alib2data_experimental/src/label/xml/LR0ItemsLabel.cpp b/alib2data_experimental/src/label/xml/LR0ItemsLabel.cpp
index 403cabcb4c..d038fa53e5 100644
--- a/alib2data_experimental/src/label/xml/LR0ItemsLabel.cpp
+++ b/alib2data_experimental/src/label/xml/LR0ItemsLabel.cpp
@@ -17,6 +17,7 @@
 #include <container/xml/ObjectsMap.h>
 #include <container/xml/ObjectsSet.h>
 #include <container/xml/ObjectsVector.h>
+#include <container/xml/ObjectsVariant.h>
 #include <primitive/xml/Unsigned.h>
 
 #include <registration/XmlRegistration.hpp>
diff --git a/alib2str/src/grammar/string/ContextFree/GNF.h b/alib2str/src/grammar/string/ContextFree/GNF.h
index eff82bc294..0edae27f6d 100644
--- a/alib2str/src/grammar/string/ContextFree/GNF.h
+++ b/alib2str/src/grammar/string/ContextFree/GNF.h
@@ -18,32 +18,32 @@
 
 namespace core {
 
-template<class SymbolType >
-struct stringApi < grammar::GNF < SymbolType > > {
-	static grammar::GNF < SymbolType > parse ( std::istream & input );
+template < class TerminalSymbolType, class NonterminalSymbolType >
+struct stringApi < grammar::GNF < TerminalSymbolType, NonterminalSymbolType > > {
+	static grammar::GNF < TerminalSymbolType, NonterminalSymbolType > parse ( std::istream & input );
 	static bool first ( std::istream & input );
-	static void compose ( std::ostream & output, const grammar::GNF < SymbolType > & grammar );
+	static void compose ( std::ostream & output, const grammar::GNF < TerminalSymbolType, NonterminalSymbolType > & grammar );
 };
 
-template<class SymbolType >
-grammar::GNF < SymbolType > stringApi < grammar::GNF < SymbolType > >::parse ( std::istream & input ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+grammar::GNF < TerminalSymbolType, NonterminalSymbolType > stringApi < grammar::GNF < TerminalSymbolType, NonterminalSymbolType > >::parse ( std::istream & input ) {
 	grammar::GrammarFromStringLexer::Token token = grammar::GrammarFromStringLexer::next(input);
 	if(token.type != grammar::GrammarFromStringLexer::TokenType::GNF)
 		throw exception::CommonException("Unrecognised GNF token.");
 
-	return grammar::GrammarFromStringParserCommon::parseCFLikeGrammar < grammar::GNF < SymbolType > > ( input );
+	return grammar::GrammarFromStringParserCommon::parseCFLikeGrammar < grammar::GNF < TerminalSymbolType, NonterminalSymbolType > > ( input );
 }
 
-template<class SymbolType >
-bool stringApi < grammar::GNF < SymbolType > >::first ( std::istream & input ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+bool stringApi < grammar::GNF < TerminalSymbolType, NonterminalSymbolType > >::first ( std::istream & input ) {
 	grammar::GrammarFromStringLexer::Token token = grammar::GrammarFromStringLexer::next ( input );
 	bool res = token.type == grammar::GrammarFromStringLexer::TokenType::GNF;
 	grammar::GrammarFromStringLexer::putback ( input, token );
 	return res;
 }
 
-template<class SymbolType >
-void stringApi < grammar::GNF < SymbolType > >::compose ( std::ostream & output, const grammar::GNF < SymbolType > & grammar ) {
+template < class TerminalSymbolType, class NonterminalSymbolType >
+void stringApi < grammar::GNF < TerminalSymbolType, NonterminalSymbolType > >::compose ( std::ostream & output, const grammar::GNF < TerminalSymbolType, NonterminalSymbolType > & grammar ) {
 	output << "GNF";
 	grammar::GrammarToStringComposerCommon::composeCFLikeGrammar ( output, grammar );
 }
-- 
GitLab