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