From 2320ae635a450b5cbdcb84d86e65ddb34b646aa2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <peckato1@fit.cvut.cz>
Date: Thu, 27 Feb 2014 20:03:51 +0100
Subject: [PATCH] Split FA->RG conversion into two

---
 .../src/aconversion/ConversionHandler.cpp     | 17 ++++++-----
 .../src/aconversion/ConversionHandler.h       |  4 +--
 .../src/fa2rg/AbstractFAtoRGConverter.cpp     | 30 ++++++++++---------
 .../src/fa2rg/AbstractFAtoRGConverter.h       | 25 +++++++++-------
 .../fa2rg/fa2lrg/AbstractFAtoLRGConverter.cpp | 20 +++++++++++++
 .../fa2rg/fa2lrg/AbstractFAtoLRGConverter.h   | 28 +++++++++++++++++
 .../fa2rg/{ => fa2lrg}/FAtoLRGConverter.cpp   | 16 +++++-----
 .../src/fa2rg/{ => fa2lrg}/FAtoLRGConverter.h | 10 +++----
 .../fa2rg/fa2rrg/AbstractFAtoRRGConverter.cpp | 19 ++++++++++++
 .../fa2rg/fa2rrg/AbstractFAtoRRGConverter.h   | 28 +++++++++++++++++
 .../fa2rg/{ => fa2rrg}/FAtoRRGConverter.cpp   | 16 +++++-----
 .../src/fa2rg/{ => fa2rrg}/FAtoRRGConverter.h |  8 ++---
 12 files changed, 162 insertions(+), 59 deletions(-)
 create mode 100644 aconversions/src/fa2rg/fa2lrg/AbstractFAtoLRGConverter.cpp
 create mode 100644 aconversions/src/fa2rg/fa2lrg/AbstractFAtoLRGConverter.h
 rename aconversions/src/fa2rg/{ => fa2lrg}/FAtoLRGConverter.cpp (77%)
 rename aconversions/src/fa2rg/{ => fa2lrg}/FAtoLRGConverter.h (65%)
 create mode 100644 aconversions/src/fa2rg/fa2rrg/AbstractFAtoRRGConverter.cpp
 create mode 100644 aconversions/src/fa2rg/fa2rrg/AbstractFAtoRRGConverter.h
 rename aconversions/src/fa2rg/{ => fa2rrg}/FAtoRRGConverter.cpp (81%)
 rename aconversions/src/fa2rg/{ => fa2rrg}/FAtoRRGConverter.h (64%)

diff --git a/aconversions/src/aconversion/ConversionHandler.cpp b/aconversions/src/aconversion/ConversionHandler.cpp
index 59fd49fc8c..a17dd35f05 100644
--- a/aconversions/src/aconversion/ConversionHandler.cpp
+++ b/aconversions/src/aconversion/ConversionHandler.cpp
@@ -118,15 +118,18 @@ void ConversionHandler::convertAutomata( ostream & out )
     }
     else if( m_target == REGULAR_GRAMMAR )
     {
-        AbstractFAtoRGConverter* conv;
-
         if( m_algorithm == FA_LRG )
-            conv = new FAtoLRGConverter( fsm );
+        {
+            AbstractFAtoLRGConverter* conv = new FAtoLRGConverter( fsm );
+            conv->convert( ).toXML( out );
+            delete conv;
+        }
         else
-            conv = new FAtoRRGConverter( fsm );
-
-        conv->convert( ).toXML( out );
-        delete conv;
+        {
+            AbstractFAtoRRGConverter* conv = new FAtoRRGConverter( fsm );
+            conv->convert( ).toXML( out );
+            delete conv;
+        }
     }
 }
 
diff --git a/aconversions/src/aconversion/ConversionHandler.h b/aconversions/src/aconversion/ConversionHandler.h
index 2ae45faf67..26fd073dbb 100644
--- a/aconversions/src/aconversion/ConversionHandler.h
+++ b/aconversions/src/aconversion/ConversionHandler.h
@@ -22,8 +22,8 @@
 #include "../re2fa/Glushkov.h"
 #include "../re2fa/Thompson.h"
 #include "../re2fa/Brzozowski.h"
-#include "../fa2rg/FAtoLRGConverter.h"
-#include "../fa2rg/FAtoRRGConverter.h"
+#include "../fa2rg/fa2lrg/FAtoLRGConverter.h"
+#include "../fa2rg/fa2rrg/FAtoRRGConverter.h"
 #include "../rg2fa/LRGtoFAConverter.h"
 #include "../rg2fa/RRGtoFAConverter.h"
 
diff --git a/aconversions/src/fa2rg/AbstractFAtoRGConverter.cpp b/aconversions/src/fa2rg/AbstractFAtoRGConverter.cpp
index a8eb28195b..0f457e2fb8 100644
--- a/aconversions/src/fa2rg/AbstractFAtoRGConverter.cpp
+++ b/aconversions/src/fa2rg/AbstractFAtoRGConverter.cpp
@@ -1,3 +1,10 @@
+/*
+ * AbstractFAtoRGConverter.cpp
+ *
+ *  Created on: 27. 2. 2014
+ *      Author: tomas
+ */
+
 #include "AbstractFAtoRGConverter.h"
 
 using namespace alib;
@@ -7,27 +14,22 @@ using namespace grammar;
 namespace conversions
 {
 
-AbstractFAtoRGConverter::AbstractFAtoRGConverter( const FSM & automaton, RegularGrammar * grammar) : m_automaton( automaton ), m_g( grammar )
+AbstractFAtoRGConverter::AbstractFAtoRGConverter( const FSM & fsm ) : m_fsm( fsm )
 {
-    if( ! m_automaton.isEpsilonFree( ) )
-         throw AlibException( "FSM has epsilon transitions" );
-}
-
-AbstractFAtoRGConverter::~AbstractFAtoRGConverter( void )
-{
-
+    if( ! m_fsm.isEpsilonFree( ) )
+        throw AlibException( "FSM has epsilon transitions" );
 }
 
-void AbstractFAtoRGConverter::createTerminalSymbols( void )
+void AbstractFAtoRGConverter::createNonTerminalSymbols( RegularGrammar & rg ) const
 {
-    for( std::set<Symbol>::const_iterator i = m_automaton.getInputAlphabet( ).begin( ); i != m_automaton.getInputAlphabet( ).end( ); i++ )
-        m_g->addTerminalSymbol( *i );
+    for( const auto & state : m_fsm.getStates( ) )
+        rg.addNonTerminalSymbol( Symbol( state.getName( ) ) );
 }
 
-void AbstractFAtoRGConverter::createNonTerminalSymbols( void )
+void AbstractFAtoRGConverter::createTerminalSymbols( RegularGrammar & rg ) const
 {
-    for( std::set<automaton::State>::const_iterator i = m_automaton.getStates( ).begin( ); i != m_automaton.getStates( ).end( ); i++ )
-        m_g->addNonTerminalSymbol( alphabet::Symbol( i->getName( ) ) );
+    for( const auto & symbol : m_fsm.getInputAlphabet( ) )
+        rg.addTerminalSymbol( symbol );
 }
 
 } /* namespace conversions */
diff --git a/aconversions/src/fa2rg/AbstractFAtoRGConverter.h b/aconversions/src/fa2rg/AbstractFAtoRGConverter.h
index c6b632f226..495c1b5081 100644
--- a/aconversions/src/fa2rg/AbstractFAtoRGConverter.h
+++ b/aconversions/src/fa2rg/AbstractFAtoRGConverter.h
@@ -1,11 +1,17 @@
-#ifndef __ABSTRACTFATORGCONVERTER_H__
-#define __ABSTRACTFATORGCONVERTER_H__
+/*
+ * AbstractFAtoRGConverter.h
+ *
+ *  Created on: 27. 2. 2014
+ *      Author: tomas
+ */
+
+#ifndef ABSTRACTFATORGCONVERTER_H_
+#define ABSTRACTFATORGCONVERTER_H_
 
 #include <automaton/FSM/FSM.h>
 #include <grammar/Regular/RegularGrammar.h>
 #include <AlibException.h>
 
-#include "../include/macros.h"
 #include "../abstract/Conversion.h"
 
 namespace conversions
@@ -14,18 +20,15 @@ namespace conversions
 class AbstractFAtoRGConverter : public Conversion
 {
 public:
-    virtual grammar::RegularGrammar & convert( ) = 0;
-    virtual ~AbstractFAtoRGConverter( void );
+    AbstractFAtoRGConverter( const automaton::FSM & fsm );
 
 protected:
-    AbstractFAtoRGConverter( const automaton::FSM & automaton, grammar::RegularGrammar * grammar );
-    void createNonTerminalSymbols( void );
-    void createTerminalSymbols( void );
+    const automaton::FSM & m_fsm;
 
-    const automaton::FSM & m_automaton;
-    grammar::RegularGrammar * m_g;
+    void createNonTerminalSymbols( grammar::RegularGrammar & grammar ) const;
+    void createTerminalSymbols( grammar::RegularGrammar & grammar ) const;
 };
 
 } /* namespace conversions */
 
-#endif /* __ABSTRACTFATORGCONVERTER_H__ */
+#endif /* ABSTRACTFATORGCONVERTER_H_ */
diff --git a/aconversions/src/fa2rg/fa2lrg/AbstractFAtoLRGConverter.cpp b/aconversions/src/fa2rg/fa2lrg/AbstractFAtoLRGConverter.cpp
new file mode 100644
index 0000000000..341a5874d1
--- /dev/null
+++ b/aconversions/src/fa2rg/fa2lrg/AbstractFAtoLRGConverter.cpp
@@ -0,0 +1,20 @@
+#include "AbstractFAtoLRGConverter.h"
+
+using namespace alib;
+using namespace automaton;
+using namespace grammar;
+
+namespace conversions
+{
+
+AbstractFAtoLRGConverter::AbstractFAtoLRGConverter( const FSM & automaton ) : AbstractFAtoRGConverter( automaton )
+{
+
+}
+
+AbstractFAtoLRGConverter::~AbstractFAtoLRGConverter( void )
+{
+
+}
+
+} /* namespace conversions */
diff --git a/aconversions/src/fa2rg/fa2lrg/AbstractFAtoLRGConverter.h b/aconversions/src/fa2rg/fa2lrg/AbstractFAtoLRGConverter.h
new file mode 100644
index 0000000000..86a43b10fd
--- /dev/null
+++ b/aconversions/src/fa2rg/fa2lrg/AbstractFAtoLRGConverter.h
@@ -0,0 +1,28 @@
+#ifndef __ABSTRACTFATOLRGCONVERTER_H__
+#define __ABSTRACTFATOLRGCONVERTER_H__
+
+#include <automaton/FSM/FSM.h>
+#include <grammar/Regular/LeftRegularGrammar.h>
+#include <AlibException.h>
+
+#include "../../include/macros.h"
+#include "../AbstractFAtoRGConverter.h"
+
+namespace conversions
+{
+
+class AbstractFAtoLRGConverter : public AbstractFAtoRGConverter
+{
+public:
+    virtual grammar::LeftRegularGrammar convert( ) = 0;
+    virtual ~AbstractFAtoLRGConverter( void );
+
+protected:
+    grammar::LeftRegularGrammar m_grammar;
+
+    AbstractFAtoLRGConverter( const automaton::FSM & automaton );
+};
+
+} /* namespace conversions */
+
+#endif /* __ABSTRACTFATOLRGCONVERTER_H__ */
diff --git a/aconversions/src/fa2rg/FAtoLRGConverter.cpp b/aconversions/src/fa2rg/fa2lrg/FAtoLRGConverter.cpp
similarity index 77%
rename from aconversions/src/fa2rg/FAtoLRGConverter.cpp
rename to aconversions/src/fa2rg/fa2lrg/FAtoLRGConverter.cpp
index 00dd36a536..ee3906c784 100644
--- a/aconversions/src/fa2rg/FAtoLRGConverter.cpp
+++ b/aconversions/src/fa2rg/fa2lrg/FAtoLRGConverter.cpp
@@ -9,7 +9,7 @@ using namespace grammar;
 namespace conversions
 {
 
-FAtoLRGConverter::FAtoLRGConverter( const FSM & automaton ) : AbstractFAtoRGConverter( automaton, new LeftRegularGrammar() ), m_grammar(* dynamic_cast<LeftRegularGrammar*>( m_g ))
+FAtoLRGConverter::FAtoLRGConverter( const FSM & automaton ) : AbstractFAtoLRGConverter( automaton )
 {
 
 }
@@ -19,13 +19,13 @@ FAtoLRGConverter::~FAtoLRGConverter( void )
 
 }
 
-LeftRegularGrammar & FAtoLRGConverter::convert( void )
+LeftRegularGrammar FAtoLRGConverter::convert( void )
 {
-    createTerminalSymbols( );
-    createNonTerminalSymbols( );
+    createTerminalSymbols( m_grammar );
+    createNonTerminalSymbols( m_grammar );
 
     // step 2 - create set of P in G
-    for( const auto & transition : m_automaton.getTransitions( ) )
+    for( const auto & transition : m_fsm.getTransitions( ) )
     {
         // 2a
         list<Symbol> leftSide, rightSide;
@@ -35,7 +35,7 @@ LeftRegularGrammar & FAtoLRGConverter::convert( void )
         m_grammar.addRule( Rule( leftSide, rightSide ) );
 
         // 2b
-        if( isInSet( transition.getFrom( ), m_automaton.getInitialStates( ) ) )
+        if( isInSet( transition.getFrom( ), m_fsm.getInitialStates( ) ) )
         {
             list<Symbol> leftSide, rightSide;
             leftSide.push_back( Symbol( transition.getTo( ).getName( ) ) );
@@ -49,7 +49,7 @@ LeftRegularGrammar & FAtoLRGConverter::convert( void )
     m_grammar.setStartSymbol( newStart );
 
     //
-    if( isInSet( * m_automaton.getInitialStates( ).begin( ), m_automaton.getFinalStates( ) ) )
+    if( isInSet( * m_fsm.getInitialStates( ).begin( ), m_fsm.getFinalStates( ) ) )
     {
         list<Symbol> leftSide = { newStart }, rightSide;
         m_grammar.addRule( Rule( leftSide, rightSide ) );
@@ -63,7 +63,7 @@ LeftRegularGrammar & FAtoLRGConverter::convert( void )
     {
         const Symbol & leftSide = * rule.getLeftSide( ).begin( );
 
-        if( isInSet( State( leftSide.getSymbol( ) ), m_automaton.getFinalStates( ) ) )
+        if( isInSet( State( leftSide.getSymbol( ) ), m_fsm.getFinalStates( ) ) )
         {
             list<Symbol> leftSide = { newStart }, rightSide( rule.getRightSide( ) );
             m_grammar.addRule( Rule( leftSide, rightSide ) );
diff --git a/aconversions/src/fa2rg/FAtoLRGConverter.h b/aconversions/src/fa2rg/fa2lrg/FAtoLRGConverter.h
similarity index 65%
rename from aconversions/src/fa2rg/FAtoLRGConverter.h
rename to aconversions/src/fa2rg/fa2lrg/FAtoLRGConverter.h
index 328d7edd43..69848392c1 100644
--- a/aconversions/src/fa2rg/FAtoLRGConverter.h
+++ b/aconversions/src/fa2rg/fa2lrg/FAtoLRGConverter.h
@@ -1,23 +1,23 @@
 #ifndef __FATOLRGCONVERTER_H__
 #define __FATOLRGCONVERTER_H__
 
-#include "AbstractFAtoRGConverter.h"
-
 #include <grammar/Regular/LeftRegularGrammar.h>
 #include <automaton/FSM/FSM.h>
 
+#include "AbstractFAtoLRGConverter.h"
+
 namespace conversions
 {
 
-class FAtoLRGConverter: public AbstractFAtoRGConverter
+class FAtoLRGConverter: public AbstractFAtoLRGConverter
 {
 public:
     FAtoLRGConverter( const automaton::FSM & automaton );
     ~FAtoLRGConverter( void );
-    grammar::LeftRegularGrammar & convert( );
+    grammar::LeftRegularGrammar convert( void );
 
 protected:
-    grammar::LeftRegularGrammar& m_grammar;
+    grammar::LeftRegularGrammar m_grammar;
 };
 
 } /* namespace conversions */
diff --git a/aconversions/src/fa2rg/fa2rrg/AbstractFAtoRRGConverter.cpp b/aconversions/src/fa2rg/fa2rrg/AbstractFAtoRRGConverter.cpp
new file mode 100644
index 0000000000..2201255bce
--- /dev/null
+++ b/aconversions/src/fa2rg/fa2rrg/AbstractFAtoRRGConverter.cpp
@@ -0,0 +1,19 @@
+#include "AbstractFAtoRRGConverter.h"
+
+using namespace automaton;
+using namespace grammar;
+
+namespace conversions
+{
+
+AbstractFAtoRRGConverter::AbstractFAtoRRGConverter( const FSM & automaton ) : AbstractFAtoRGConverter( automaton )
+{
+
+}
+
+AbstractFAtoRRGConverter::~AbstractFAtoRRGConverter( void )
+{
+
+}
+
+} /* namespace conversions */
diff --git a/aconversions/src/fa2rg/fa2rrg/AbstractFAtoRRGConverter.h b/aconversions/src/fa2rg/fa2rrg/AbstractFAtoRRGConverter.h
new file mode 100644
index 0000000000..28d5e30d0e
--- /dev/null
+++ b/aconversions/src/fa2rg/fa2rrg/AbstractFAtoRRGConverter.h
@@ -0,0 +1,28 @@
+#ifndef __ABSTRACTFATORRGCONVERTER_H__
+#define __ABSTRACTFATORRGCONVERTER_H__
+
+#include <automaton/FSM/FSM.h>
+#include <grammar/Regular/RightRegularGrammar.h>
+#include <AlibException.h>
+
+#include "../../include/macros.h"
+#include "../AbstractFAtoRGConverter.h"
+
+namespace conversions
+{
+
+class AbstractFAtoRRGConverter : public AbstractFAtoRGConverter
+{
+public:
+    virtual grammar::RightRegularGrammar convert( ) = 0;
+    virtual ~AbstractFAtoRRGConverter( void );
+
+protected:
+    grammar::RightRegularGrammar m_grammar;
+
+    AbstractFAtoRRGConverter( const automaton::FSM & automaton );
+};
+
+} /* namespace conversions */
+
+#endif /* __ABSTRACTFATORRGCONVERTER_H__ */
diff --git a/aconversions/src/fa2rg/FAtoRRGConverter.cpp b/aconversions/src/fa2rg/fa2rrg/FAtoRRGConverter.cpp
similarity index 81%
rename from aconversions/src/fa2rg/FAtoRRGConverter.cpp
rename to aconversions/src/fa2rg/fa2rrg/FAtoRRGConverter.cpp
index b0f6f461b7..59ecc0d1d6 100644
--- a/aconversions/src/fa2rg/FAtoRRGConverter.cpp
+++ b/aconversions/src/fa2rg/fa2rrg/FAtoRRGConverter.cpp
@@ -7,7 +7,7 @@ using namespace grammar;
 namespace conversions
 {
 
-FAtoRRGConverter::FAtoRRGConverter( const FSM & automaton ) : AbstractFAtoRGConverter( automaton, new RightRegularGrammar() ), m_grammar(* dynamic_cast<RightRegularGrammar*>( m_g ))
+FAtoRRGConverter::FAtoRRGConverter( const FSM & automaton ) : AbstractFAtoRRGConverter( automaton )
 {
 
 }
@@ -17,13 +17,13 @@ FAtoRRGConverter::~FAtoRRGConverter( void )
 
 }
 
-RightRegularGrammar & FAtoRRGConverter::convert( void )
+RightRegularGrammar FAtoRRGConverter::convert( void )
 {
-    createTerminalSymbols( );
-    createNonTerminalSymbols( );
+    createTerminalSymbols( m_grammar );
+    createNonTerminalSymbols( m_grammar );
 
     // step 2 - create set of P in G
-    for( const auto & transition : m_automaton.getTransitions( ) )
+    for( const auto & transition : m_fsm.getTransitions( ) )
     {
         // 2a
         list<Symbol> leftSide, rightSide;
@@ -33,7 +33,7 @@ RightRegularGrammar & FAtoRRGConverter::convert( void )
         m_grammar.addRule( Rule( leftSide, rightSide ) );
 
         // 2b
-        if( isInSet( transition.getTo( ), m_automaton.getFinalStates( ) ) )
+        if( isInSet( transition.getTo( ), m_fsm.getFinalStates( ) ) )
         {
             list<Symbol> leftSide, rightSide;
             leftSide.push_back( Symbol( transition.getFrom( ).getName( ) ) );
@@ -43,10 +43,10 @@ RightRegularGrammar & FAtoRRGConverter::convert( void )
     }
 
     // step 3 - set start symbol of G
-    m_grammar.setStartSymbol( Symbol( m_automaton.getInitialStates( ).begin( )->getName( ) ) );
+    m_grammar.setStartSymbol( Symbol( m_fsm.getInitialStates( ).begin( )->getName( ) ) );
 
     // step 4
-    if( isInSet( State( m_grammar.getStartSymbol( ).getSymbol( ) ), m_automaton.getFinalStates( ) ) )
+    if( isInSet( State( m_grammar.getStartSymbol( ).getSymbol( ) ), m_fsm.getFinalStates( ) ) )
     {
         // 4a
         if( ! m_grammar.isNonTerminalOnRightSideOfAnyRule( m_grammar.getStartSymbol( ) ) )
diff --git a/aconversions/src/fa2rg/FAtoRRGConverter.h b/aconversions/src/fa2rg/fa2rrg/FAtoRRGConverter.h
similarity index 64%
rename from aconversions/src/fa2rg/FAtoRRGConverter.h
rename to aconversions/src/fa2rg/fa2rrg/FAtoRRGConverter.h
index 7738b8ade9..575e500945 100644
--- a/aconversions/src/fa2rg/FAtoRRGConverter.h
+++ b/aconversions/src/fa2rg/fa2rrg/FAtoRRGConverter.h
@@ -4,20 +4,20 @@
 #include <grammar/Regular/RightRegularGrammar.h>
 #include <automaton/FSM/FSM.h>
 
-#include "AbstractFAtoRGConverter.h"
+#include "AbstractFAtoRRGConverter.h"
 
 namespace conversions
 {
 
-class FAtoRRGConverter : public AbstractFAtoRGConverter
+class FAtoRRGConverter : public AbstractFAtoRRGConverter
 {
 public:
     FAtoRRGConverter( const automaton::FSM & automaton );
     ~FAtoRRGConverter( void );
-    grammar::RightRegularGrammar & convert ( );
+    grammar::RightRegularGrammar convert ( void );
 
 protected:
-    grammar::RightRegularGrammar& m_grammar;
+    grammar::RightRegularGrammar m_grammar;
 };
 
 } /* namespace conversions */
-- 
GitLab