diff --git a/aconversions/src/fa2rg/fa2lrg/FAtoLRGConverter.cpp b/aconversions/src/fa2rg/fa2lrg/FAtoLRGConverter.cpp index ebafba78796fa5d6a35eee35471d94607e2fc898..7cc7fe416aa55122bbb8bf1c49c3253f65e146b5 100644 --- a/aconversions/src/fa2rg/fa2lrg/FAtoLRGConverter.cpp +++ b/aconversions/src/fa2rg/fa2lrg/FAtoLRGConverter.cpp @@ -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; }