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