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