From e126fffddbaca46fcd11a418dde4347faea5585f Mon Sep 17 00:00:00 2001
From: Tomas Pecka <peckato1@fit.cvut.cz>
Date: Tue, 19 Apr 2016 15:46:35 +0200
Subject: [PATCH] GlushkovRTE: Fix subst Follow ; examples

---
 alib2algo/src/rte/GlushkovTraversal.cpp | 79 ++++++++++++++++++-------
 alib2algo/src/rte/GlushkovTraversal.h   | 12 ++--
 examples2/rte/rte6.xml                  | 46 ++++++++++++++
 examples2/rte/rte7.xml                  | 45 ++++++++++++++
 examples2/rte/rte_.xml                  | 46 ++++++++++++++
 5 files changed, 199 insertions(+), 29 deletions(-)
 create mode 100644 examples2/rte/rte6.xml
 create mode 100644 examples2/rte/rte7.xml
 create mode 100644 examples2/rte/rte_.xml

diff --git a/alib2algo/src/rte/GlushkovTraversal.cpp b/alib2algo/src/rte/GlushkovTraversal.cpp
index d5584be35f..8108e5fbb6 100644
--- a/alib2algo/src/rte/GlushkovTraversal.cpp
+++ b/alib2algo/src/rte/GlushkovTraversal.cpp
@@ -30,7 +30,7 @@ std::set < GlushkovSymbol > GlushkovTraversal::first ( rte::FormalRTE const & re
 	std::set < GlushkovSymbol > firstSet, symbolSet = getSymbols ( re );
 
 	for ( auto const & s : first ( & re.getRTE ( ) ) ) {
-		std::cerr << "In first set: " << s->getSymbol ( ) << std::endl;
+		std::cerr << "In first set: " << s -> getSymbol ( ) << std::endl;
 		firstSet.insert ( findSymbol ( s, symbolSet ) );
 	}
 
@@ -52,13 +52,13 @@ std::set < GlushkovSymbol > GlushkovTraversal::first ( rte::FormalRTE const & re
 std::set < std::vector < GlushkovSymbol > > GlushkovTraversal::follow ( rte::FormalRTE const & re, GlushkovSymbol const & symbol ) {
 	std::set < GlushkovSymbol > symbolSet = getSymbols ( re );
 	std::set < std::vector < GlushkovSymbol > > followSet;
-
+	std::set < alphabet::RankedSymbol> alphabetK = re.getConstantAlphabet();
 	std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > symbMap;
 
-	for ( const auto & csymbol : re.getConstantAlphabet ( ) )
+	for ( const auto & csymbol : alphabetK )
 		symbMap.insert ( std::make_pair ( csymbol, std::set < rte::FormalRTESymbol const * > ( ) ) );
 
-	for ( const auto & f : follow ( & re.getRTE ( ), symbol.getSymbolPtr ( ), symbMap ) ) {
+	for ( const auto & f : follow ( & re.getRTE ( ), symbol.getSymbolPtr ( ), alphabetK, symbMap ) ) {
 		std::vector < GlushkovSymbol > curr;
 
 		for ( const auto & s : f )
@@ -215,7 +215,7 @@ std::set < rte::FormalRTESymbol const * > GlushkovTraversal::first ( rte::Formal
 
 // ----------------------------------------------------------------------------
 
-std::set < std::vector < rte::FormalRTESymbol const * > > GlushkovTraversal::follow ( rte::FormalRTEElement const * const & node, rte::FormalRTESymbol const * const & symbolptr, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > subMap ) {
+std::set < std::vector < rte::FormalRTESymbol const * > > GlushkovTraversal::follow ( rte::FormalRTEElement const * const & node, rte::FormalRTESymbol const * const & symbolptr, const std::set<alphabet::RankedSymbol>& alphabetK, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > & subMap ) {
 	rte::FormalRTEAlternation const * const alternation = dynamic_cast < rte::FormalRTEAlternation const * const > ( node );
 	rte::FormalRTESubstitution const * const concatenation = dynamic_cast < rte::FormalRTESubstitution const * const > ( node );
 	rte::FormalRTEIteration const * const iteration = dynamic_cast < rte::FormalRTEIteration const * const > ( node );
@@ -223,19 +223,19 @@ std::set < std::vector < rte::FormalRTESymbol const * > > GlushkovTraversal::fol
 	rte::FormalRTEEmpty const * const empty = dynamic_cast < rte::FormalRTEEmpty const * const > ( node );
 
 	if ( alternation )
-		return follow ( alternation, symbolptr, subMap );
+		return follow ( alternation, symbolptr, alphabetK, subMap );
 
 	else if ( concatenation )
-		return follow ( concatenation, symbolptr, subMap );
+		return follow ( concatenation, symbolptr, alphabetK, subMap );
 
 	else if ( iteration )
-		return follow ( iteration, symbolptr, subMap );
+		return follow ( iteration, symbolptr, alphabetK, subMap );
 
 	else if ( symbol )
-		return follow ( symbol, symbolptr, subMap );
+		return follow ( symbol, symbolptr, alphabetK, subMap );
 
 	else if ( empty )
-		return follow ( empty, symbolptr, subMap );
+		return follow ( empty, symbolptr, alphabetK, subMap );
 
 	throw exception::CommonException ( "GlushkovTraversal::follow() - unknown RegExpElement node" );
 }
@@ -257,13 +257,13 @@ std::ostream & operator <<( std::ostream & os, const std::set < std::vector < rt
 	return os;
 }
 
-std::set < std::vector < rte::FormalRTESymbol const * > > GlushkovTraversal::follow ( rte::FormalRTEAlternation const * const & node, rte::FormalRTESymbol const * const & symbolptr, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > subMap ) {
+std::set < std::vector < rte::FormalRTESymbol const * > > GlushkovTraversal::follow ( rte::FormalRTEAlternation const * const & node, rte::FormalRTESymbol const * const & symbolptr, const std::set<alphabet::RankedSymbol>& alphabetK, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > & subMap ) {
 	std::set < std::vector < rte::FormalRTESymbol const * > > ret, tmp;
 
-	tmp = follow ( & node->getLeftElement ( ), symbolptr, subMap );
+	tmp = follow ( & node->getLeftElement ( ), symbolptr, alphabetK, subMap );
 	ret.insert ( tmp.begin ( ), tmp.end ( ) );
 
-	tmp = follow ( & node->getRightElement ( ), symbolptr, subMap );
+	tmp = follow ( & node->getRightElement ( ), symbolptr, alphabetK, subMap );
 	ret.insert ( tmp.begin ( ), tmp.end ( ) );
 
 	std::cerr << "FollowAlt(" << symbolptr->getSymbol ( ) << "): " << ret << std::endl;
@@ -271,7 +271,7 @@ std::set < std::vector < rte::FormalRTESymbol const * > > GlushkovTraversal::fol
 	return ret;
 }
 
-std::set < std::vector < rte::FormalRTESymbol const * > > GlushkovTraversal::follow ( rte::FormalRTESubstitution const * const & node, rte::FormalRTESymbol const * const & symbolptr, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > subMap ) {
+std::set < std::vector < rte::FormalRTESymbol const * > > GlushkovTraversal::follow ( rte::FormalRTESubstitution const * const & node, rte::FormalRTESymbol const * const & symbolptr, const std::set<alphabet::RankedSymbol>& alphabetK, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > & subMap ) {
 
 	std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > subMap2 ( subMap );
 	auto itMap = subMap2.find ( node->getSubstitutionSymbol ( ).getSymbol ( ) );
@@ -290,34 +290,67 @@ std::set < std::vector < rte::FormalRTESymbol const * > > GlushkovTraversal::fol
 	std::set < std::vector < rte::FormalRTESymbol const * > > ret;
 
 	if ( pos ( & node->getLeftElement ( ), symbolptr ) )
-		ret = follow ( & node->getLeftElement ( ), symbolptr, subMap2 );
+		ret = follow ( & node->getLeftElement ( ), symbolptr, alphabetK, subMap2 );
 	else
-		ret = follow ( & node->getRightElement ( ), symbolptr, subMap2 );
+		ret = follow ( & node->getRightElement ( ), symbolptr, alphabetK, subMap );
 
 	std::cerr << "FollowSub(" << symbolptr->getSymbol ( ) << "): " << ret << std::endl;
 	return ret;
 }
 
-std::set < std::vector < rte::FormalRTESymbol const * > > GlushkovTraversal::follow ( rte::FormalRTEIteration const * const & node, rte::FormalRTESymbol const * const & symbolptr, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > subMap ) {
+std::set < std::vector < rte::FormalRTESymbol const * > > GlushkovTraversal::follow ( rte::FormalRTEIteration const * const & node, rte::FormalRTESymbol const * const & symbolptr, const std::set<alphabet::RankedSymbol>& alphabetK, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > & subMap ) {
 
 	std::set < std::vector < rte::FormalRTESymbol const * > > ret;
 
 	for ( const auto & s : first ( & node->getElement ( ) ) )
 		subMap[node->getSubstitutionSymbol ( ).getSymbol ( )].insert ( s );
 
-	ret = follow ( & node->getElement ( ), symbolptr, subMap );
+	ret = follow ( & node->getElement ( ), symbolptr, alphabetK, subMap );
 
 	std::cerr << "FollowIter(" << symbolptr->getSymbol ( ) << "): " << ret << std::endl;
 	return ret;
 }
 
-std::set < std::vector < rte::FormalRTESymbol const * > > replaceConstants ( const std::vector < rte::FormalRTESymbol const * > & f, const std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > & subMap ) {
+void preprocessSubMap(const std::set<alphabet::RankedSymbol>& alphabetK, std::map<alphabet::RankedSymbol, std::set<rte::FormalRTESymbol const*>> & subMap)
+{
+	bool change = true;
+	while(change)
+	{
+		change = false;
+
+		for(auto& kv : subMap)
+		{
+			std::set<rte::FormalRTESymbol const*>& value = kv.second;
+
+			for(const auto& v : value)
+			{
+				if(alphabetK.find(v -> getSymbol()) == alphabetK.end()) continue;
+
+				std::cerr << "Gonna replace in submap: " << kv.first << ": " << v->getSymbol() << std::endl; 
+
+				auto it = subMap.find(v -> getSymbol() );
+				size_t vsize = value.size();
+				value.insert(it->second.begin(), it->second.end());
+				change = (vsize != value.size());
+				value.erase(v);
+
+				for(const auto& x : it->second)
+					std::cerr << "\t" << x->getSymbol() << std::endl;
+			}
+		}
+	}
+}
+
+std::set < std::vector < rte::FormalRTESymbol const * > > replaceConstants ( const std::set<alphabet::RankedSymbol>& alphabetK, const std::vector < rte::FormalRTESymbol const * > & f, const std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > & subMap2 ) {
 	std::cerr << " replC for " << f << std::endl;
 
 	std::set < std::vector < rte::FormalRTESymbol const * > > ret;
 
 	if ( f.size ( ) == 0 ) return ret;
 
+	std::map<alphabet::RankedSymbol, std::set<rte::FormalRTESymbol const*>> subMap(subMap2);
+	preprocessSubMap(alphabetK, subMap);
+
 	auto subIt = subMap.find ( f[0]->getSymbol ( ) );
 
 	if ( subIt == subMap.end ( ) ) {
@@ -370,24 +403,24 @@ std::set < std::vector < rte::FormalRTESymbol const * > > replaceConstants ( con
 	return ret;
 }
 
-std::set < std::vector < rte::FormalRTESymbol const * > > GlushkovTraversal::follow ( rte::FormalRTESymbol const * const & node, rte::FormalRTESymbol const * const & symbolptr, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > subMap ) {
+std::set < std::vector < rte::FormalRTESymbol const * > > GlushkovTraversal::follow ( rte::FormalRTESymbol const * const & node, rte::FormalRTESymbol const * const & symbolptr, const std::set<alphabet::RankedSymbol>& alphabetK, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > & subMap ) {
 	std::set < std::vector < rte::FormalRTESymbol const * > > ret;
 	std::vector < rte::FormalRTESymbol const * > children = node->getElements ( );
 
 	if ( symbolptr == node ) {
-		ret = replaceConstants ( children, subMap );
+		ret = replaceConstants ( alphabetK, children, subMap );
 		std::cerr << "FollowSymbol1(" << symbolptr->getSymbol ( ) << "): " << ret << std::endl;
 		return ret;
 	}
 
 	for ( const auto & c : children )
 		if ( pos ( c, symbolptr ) )
-			return follow ( c, symbolptr, subMap );
+			return follow ( c, symbolptr, alphabetK, subMap );
 
 	return std::set < std::vector < rte::FormalRTESymbol const * > > ( );
 }
 
-std::set < std::vector < rte::FormalRTESymbol const * > > GlushkovTraversal::follow ( rte::FormalRTEEmpty const * const & /* node */, rte::FormalRTESymbol const * const & /* symbolptr */, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > /* subMap */ ) {
+std::set < std::vector < rte::FormalRTESymbol const * > > GlushkovTraversal::follow ( rte::FormalRTEEmpty const * const & /* node */, rte::FormalRTESymbol const * const & /* symbolptr */, const std::set<alphabet::RankedSymbol>& /* alphabetK */, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > & /* subMap */ ) {
 	return std::set < std::vector < rte::FormalRTESymbol const * > > ( );
 }
 
diff --git a/alib2algo/src/rte/GlushkovTraversal.h b/alib2algo/src/rte/GlushkovTraversal.h
index dcd8def54d..0b728051ac 100644
--- a/alib2algo/src/rte/GlushkovTraversal.h
+++ b/alib2algo/src/rte/GlushkovTraversal.h
@@ -86,12 +86,12 @@ private:
 	static bool pos ( rte::FormalRTESymbol const * const & node, rte::FormalRTESymbol const * const & symbSearch );
 	static bool pos ( rte::FormalRTEEmpty const * const & node, rte::FormalRTESymbol const * const & symbSearch );
 
-	static std::set < std::vector < rte::FormalRTESymbol const * > > follow ( rte::FormalRTEElement const * const & node, rte::FormalRTESymbol const * const & symbptr, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > subM );
-	static std::set < std::vector < rte::FormalRTESymbol const * > > follow ( rte::FormalRTEAlternation const * const & node, rte::FormalRTESymbol const * const & symbptr, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > subM );
-	static std::set < std::vector < rte::FormalRTESymbol const * > > follow ( rte::FormalRTESubstitution const * const & node, rte::FormalRTESymbol const * const & symbptr, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > subM );
-	static std::set < std::vector < rte::FormalRTESymbol const * > > follow ( rte::FormalRTEIteration const * const & node, rte::FormalRTESymbol const * const & symbptr, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > subM );
-	static std::set < std::vector < rte::FormalRTESymbol const * > > follow ( rte::FormalRTESymbol const * const & node, rte::FormalRTESymbol const * const & symbptr, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > subM );
-	static std::set < std::vector < rte::FormalRTESymbol const * > > follow ( rte::FormalRTEEmpty const * const & node, rte::FormalRTESymbol const * const & symbptr, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > subM );
+	static std::set < std::vector < rte::FormalRTESymbol const * > > follow ( rte::FormalRTEElement const * const & node, rte::FormalRTESymbol const * const & symbptr, const std::set<alphabet::RankedSymbol>& alphabetK, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > & subM );
+	static std::set < std::vector < rte::FormalRTESymbol const * > > follow ( rte::FormalRTEAlternation const * const & node, rte::FormalRTESymbol const * const & symbptr, const std::set<alphabet::RankedSymbol>& alphabetK, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > & subM );
+	static std::set < std::vector < rte::FormalRTESymbol const * > > follow ( rte::FormalRTESubstitution const * const & node, rte::FormalRTESymbol const * const & symbptr, const std::set<alphabet::RankedSymbol>& alphabetK, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > & subM );
+	static std::set < std::vector < rte::FormalRTESymbol const * > > follow ( rte::FormalRTEIteration const * const & node, rte::FormalRTESymbol const * const & symbptr, const std::set<alphabet::RankedSymbol>& alphabetK, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > & subM );
+	static std::set < std::vector < rte::FormalRTESymbol const * > > follow ( rte::FormalRTESymbol const * const & node, rte::FormalRTESymbol const * const & symbptr, const std::set<alphabet::RankedSymbol>& alphabetK, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > & subM );
+	static std::set < std::vector < rte::FormalRTESymbol const * > > follow ( rte::FormalRTEEmpty const * const & node, rte::FormalRTESymbol const * const & symbptr, const std::set<alphabet::RankedSymbol>& alphabetK, std::map < alphabet::RankedSymbol, std::set < rte::FormalRTESymbol const * > > & subM );
 };
 
 } /* namespace rte */
diff --git a/examples2/rte/rte6.xml b/examples2/rte/rte6.xml
new file mode 100644
index 0000000000..8d57bcb767
--- /dev/null
+++ b/examples2/rte/rte6.xml
@@ -0,0 +1,46 @@
+<FormalRTE>
+	<alphabet>
+		<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>a</Character></PrimitiveLabel></LabeledSymbol><Unsigned>2</Unsigned></RankedSymbol>
+		<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>b</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+		<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>c</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+	</alphabet>
+	<constantAlphabet>
+		<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>y</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+		<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>z</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+	</constantAlphabet>
+
+	<substitution>
+		<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>z</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+
+		<substitution>
+			<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>y</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+
+			<iteration>
+				<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>z</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+
+				<iteration>
+					<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>y</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+
+					<symbol>
+						<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>a</Character></PrimitiveLabel></LabeledSymbol><Unsigned>2</Unsigned></RankedSymbol>
+						<symbol>
+							<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>y</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+						</symbol>
+						<symbol>
+							<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>z</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+						</symbol>
+					</symbol>
+				</iteration>
+			</iteration>
+
+			<symbol>
+				<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>b</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+			</symbol>
+		</substitution>
+
+		<symbol>
+			<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>c</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+		</symbol>
+	</substitution>
+</FormalRTE>
+
diff --git a/examples2/rte/rte7.xml b/examples2/rte/rte7.xml
new file mode 100644
index 0000000000..e583d85b9e
--- /dev/null
+++ b/examples2/rte/rte7.xml
@@ -0,0 +1,45 @@
+<FormalRTE>
+	<alphabet>
+		<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>a</Character></PrimitiveLabel></LabeledSymbol><Unsigned>2</Unsigned></RankedSymbol>
+		<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>d</Character></PrimitiveLabel></LabeledSymbol><Unsigned>1</Unsigned></RankedSymbol>
+		<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>c</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+		<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>b</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+	</alphabet>
+	<constantAlphabet>
+		<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>z</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+	</constantAlphabet>
+	<substitution>
+		<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>z</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+
+		<substitution>
+			<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>z</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+
+			<iteration>
+				<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>z</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+
+				<symbol>
+					<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>d</Character></PrimitiveLabel></LabeledSymbol><Unsigned>1</Unsigned></RankedSymbol>
+					<symbol>
+						<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>z</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+					</symbol>
+				</symbol>
+
+			</iteration>
+
+			<symbol>
+				<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>a</Character></PrimitiveLabel></LabeledSymbol><Unsigned>2</Unsigned></RankedSymbol>
+				<symbol>
+					<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>c</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+				</symbol>
+				<symbol>
+					<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>z</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+				</symbol>
+			</symbol>
+
+		</substitution>
+
+		<symbol>
+			<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>b</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+		</symbol>
+	</substitution>
+</FormalRTE>
diff --git a/examples2/rte/rte_.xml b/examples2/rte/rte_.xml
new file mode 100644
index 0000000000..27dd347d3a
--- /dev/null
+++ b/examples2/rte/rte_.xml
@@ -0,0 +1,46 @@
+<FormalRTE>
+	<alphabet>
+		<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>a</Character></PrimitiveLabel></LabeledSymbol><Unsigned>2</Unsigned></RankedSymbol>
+		<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>b</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+		<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>c</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+		<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>d</Character></PrimitiveLabel></LabeledSymbol><Unsigned>1</Unsigned></RankedSymbol>
+	</alphabet>
+	<constantAlphabet>
+		<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>y</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+		<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>z</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
+	</constantAlphabet>
+	<substitution>
+		<RankedSymbol><SymbolRef id="4"/><Unsigned>0</Unsigned></RankedSymbol>
+
+		<substitution>
+			<RankedSymbol><SymbolRef id="5"/><Unsigned>0</Unsigned></RankedSymbol>
+			<iteration>
+				<RankedSymbol><SymbolRef id="4"/><Unsigned>0</Unsigned></RankedSymbol>
+				<symbol>
+					<RankedSymbol><SymbolRef id="3"/><Unsigned>1</Unsigned></RankedSymbol>
+					<symbol>
+						<RankedSymbol><SymbolRef id="0"/><Unsigned>2</Unsigned></RankedSymbol>
+						<symbol>
+							<RankedSymbol><SymbolRef id="4"/><Unsigned>0</Unsigned></RankedSymbol>
+						</symbol>
+						<symbol>
+							<RankedSymbol><SymbolRef id="5"/><Unsigned>0</Unsigned></RankedSymbol>
+						</symbol>
+					</symbol>
+				</symbol>
+			</iteration>
+			<alternation>
+				<symbol>
+					<RankedSymbol><SymbolRef id="1"/><Unsigned>0</Unsigned></RankedSymbol>
+				</symbol>
+				<symbol>
+					<RankedSymbol><SymbolRef id="2"/><Unsigned>0</Unsigned></RankedSymbol>
+				</symbol>
+			</alternation>
+		</substitution>
+
+		<symbol>
+			<RankedSymbol><SymbolRef id="1"/><Unsigned>0</Unsigned></RankedSymbol>
+		</symbol>
+	</substitution>
+</FormalRTE>
-- 
GitLab