From 6b5330d3cae243ca639da0412dea759a3910e075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <peckato1@fit.cvut.cz> Date: Wed, 30 Apr 2014 16:25:29 +0200 Subject: [PATCH] aconversions: sync FA to LRG conv. with thesis --- .../src/fa2rg/fa2lrg/FAtoLRGConverter.cpp | 51 +++++++++---------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/aconversions/src/fa2rg/fa2lrg/FAtoLRGConverter.cpp b/aconversions/src/fa2rg/fa2lrg/FAtoLRGConverter.cpp index ebafba7879..7cc7fe416a 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; } -- GitLab