Skip to content
Snippets Groups Projects
Commit 6b5330d3 authored by Tomáš Pecka's avatar Tomáš Pecka
Browse files

aconversions: sync FA to LRG conv. with thesis

parent f00af6b1
No related branches found
No related tags found
No related merge requests found
......@@ -33,56 +33,53 @@ LeftRegularGrammar FAtoLRGConverter::convert( void )
nonterminalMap.insert( pair<State,Symbol>( state, nt ) );
}
 
// step 2 - create set of P in G
// step 2
Symbol newStart = grammar.createUniqueNonTerminalSymbol( "S", false );
grammar.setStartSymbol( newStart );
// step 3 - create set of P in G
for( const auto & transition : m_automaton.getTransitions( ) )
{
// 2a
// 3a
list<Symbol> leftSide, rightSide;
leftSide.push_back( nonterminalMap.find( transition.getTo( ) )->second );
rightSide.push_back( nonterminalMap.find( transition.getFrom( ) )->second );
rightSide.push_back( transition.getInput( ) );
grammar.addRule( Rule( leftSide, rightSide ) );
 
// 2b
if( isInSet( transition.getTo( ), m_automaton.getFinalStates( ) ) )
{
list<Symbol> leftSide, rightSide;
leftSide.push_back( grammar.getStartSymbol( ) );
grammar.addRule( Rule( leftSide, rightSide ) );
rightSide.push_back( nonterminalMap.find( transition.getFrom( ) )->second );
rightSide.push_back( transition.getInput( ) );
}
if( isInSet( transition.getFrom( ), m_automaton.getInitialStates( ) ) )
{
list<Symbol> leftSide, rightSide;
leftSide.push_back( nonterminalMap.find( transition.getTo( ) )->second );
rightSide.push_back( transition.getInput( ) );
grammar.addRule( Rule( leftSide, rightSide ) );
if( isInSet( transition.getTo( ), m_automaton.getFinalStates( ) ) )
{
list<Symbol> leftSide, rightSide;
leftSide.push_back( grammar.getStartSymbol( ) );
rightSide.push_back( transition.getInput( ) );
grammar.addRule( Rule( leftSide, rightSide ) );
}
}
}
 
// step 3
Symbol newStart = grammar.createUniqueNonTerminalSymbol( "S", false );
grammar.setStartSymbol( newStart );
//
if( isInSet( * m_automaton.getInitialStates( ).begin( ), m_automaton.getFinalStates( ) ) )
{
list<Symbol> leftSide = { newStart }, rightSide;
grammar.addRule( Rule( leftSide, rightSide ) );
}
 
// pro vsecky neterminaly, ktere vznikly z finalnich stavu:
// kopiruj jejich prave strany k newStart
// pokud nejsou nikde vpravo, smaz je
for( const auto & rule : grammar.getRules( ) )
{
const Symbol & leftSide = rule.getLeftSide( ).front( );
if( isInSet( State( leftSide.getSymbol( ) ), m_automaton.getFinalStates( ) ) )
{
list<Symbol> leftSide = { newStart }, rightSide( rule.getRightSide( ) );
grammar.addRule( Rule( leftSide, rightSide ) );
}
// jetenhle krok nutny,???
// if( leftSide != grammar.getStartSymbol( ) && ! grammar.isNonTerminalOnRightSideOfAnyRule( leftSide ) )
// grammar.removeRule( rule );
}
return grammar;
}
 
......
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