Skip to content
Snippets Groups Projects
Commit 2f1df5eb authored by Tomáš Pecka's avatar Tomáš Pecka Committed by Jan Trávníček
Browse files

GlushkovRTE: Follow iter

parent 0261d8cd
No related branches found
No related tags found
No related merge requests found
......@@ -29,8 +29,10 @@ bool GlushkovTraversal::pos ( GlushkovSymbol const & symbol, rte::FormalRTE cons
std::set < GlushkovSymbol > GlushkovTraversal::first ( rte::FormalRTE const & re ) {
std::set < GlushkovSymbol > firstSet, symbolSet = getSymbols ( re );
 
for ( auto const & s : first ( & re.getRTE ( ) ) )
for ( auto const & s : first ( & re.getRTE ( ) ) ) {
std::cerr << "In first set: " << s->getSymbol ( ) << std::endl;
firstSet.insert ( findSymbol ( s, symbolSet ) );
}
 
return firstSet;
}
......@@ -109,8 +111,16 @@ std::set < rte::FormalRTESymbol const * > GlushkovTraversal::first ( rte::Formal
tmp = first ( & node->getLeftElement ( ) );
ret.insert ( tmp.begin ( ), tmp.end ( ) );
 
if ( ret.count ( & node->getSubstitutionSymbol ( ) ) ) {
ret.erase ( & node->getSubstitutionSymbol ( ) );
for ( const auto & r : ret )
std::cerr << " In subst first: so far: " << r->getSymbol ( ) << std::endl;
auto it = std::find_if ( ret.begin ( ), ret.end ( ), [node] ( rte::FormalRTESymbol const * a ) {
return a->getSymbol ( ) == node->getSubstitutionSymbol ( );
} );
if ( it != ret.end ( ) ) {
std::cerr << "SubstFirst: subst symbol found in left" << std::endl;
ret.erase ( it );
tmp = first ( & node->getRightElement ( ) );
ret.insert ( tmp.begin ( ), tmp.end ( ) );
}
......@@ -126,9 +136,7 @@ std::set < rte::FormalRTESymbol const * > GlushkovTraversal::first ( rte::Formal
}
 
std::set < rte::FormalRTESymbol const * > GlushkovTraversal::first ( rte::FormalRTESymbol const * const & node ) {
return {
node
};
return std::set < rte::FormalRTESymbol const * > { node };
}
 
std::set < rte::FormalRTESymbol const * > GlushkovTraversal::first ( rte::FormalRTEEmpty const * const & /* node */ ) {
......@@ -268,8 +276,17 @@ std::set < std::vector < rte::FormalRTESymbol const * > > GlushkovTraversal::fol
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 */ ) {
return std::set < std::vector < rte::FormalRTESymbol const * > > ( );
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 * > > ret;
for ( const auto & s : first ( & node->getElement ( ) ) )
subMap[node->getSubstitutionSymbol ( ).getSymbol ( )].insert ( s );
ret = follow ( & node->getElement ( ), symbolptr, subMap );
std::cerr << "Follow Sub: (" << 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 ) {
......
......@@ -78,10 +78,12 @@ automaton::NPDA ToPostfixPushdownAutomatonGlushkov::convert ( const rte::FormalR
for ( const auto & kv : followSet ) {
std::cerr << "\t" << kv.first.getInputSymbol ( ) << " id=" << kv.first.getId ( ) << std::endl;
 
for ( const auto & f : kv.second )
for ( const auto & f : kv.second ) {
for ( const auto & symbol : f )
std::cerr << "\t\t" << symbol.getInputSymbol ( ) << " id=" << symbol.getId ( ) << std::endl;
std::cerr << "\t\t" << symbol.getInputSymbol ( ) << "(id=" << symbol.getId ( ) << ") ";
 
std::cerr << std::endl;
}
}
 
/* DEBUG END */
......@@ -118,8 +120,7 @@ automaton::NPDA ToPostfixPushdownAutomatonGlushkov::convert ( const rte::FormalR
if ( it == pos_stack_map.end ( ) )
throw exception::CommonException ( "GlushkovRTE: fail2" );
 
automaton.addTransition ( q, alphabet::Symbol { alphabet::EndSymbol::END }, { it->second, alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK }
}, f, { } );
automaton.addTransition ( q, alphabet::Symbol { alphabet::EndSymbol::END }, { it->second, alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } }, f, { } );
}
 
return automaton;
......
<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>
</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>
<iteration>
<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>z</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>z</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
</symbol>
<symbol>
<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>z</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
</symbol>
</symbol>
</iteration>
<symbol>
<RankedSymbol><LabeledSymbol><PrimitiveLabel><Character>b</Character></PrimitiveLabel></LabeledSymbol><Unsigned>0</Unsigned></RankedSymbol>
</symbol>
</substitution>
</FormalRTE>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment