diff --git a/aconversions/src/aconversion/ConversionHandler.cpp b/aconversions/src/aconversion/ConversionHandler.cpp index 85b86fa48635030eee8af3997201a6c2c6b182ef..983e8944ba42cc2adbf1fc50f1d9208ff8d1ac38 100644 --- a/aconversions/src/aconversion/ConversionHandler.cpp +++ b/aconversions/src/aconversion/ConversionHandler.cpp @@ -103,7 +103,7 @@ void ConversionHandler::convertFSMtoRE( void ) void ConversionHandler::convertFSMtoRG( void ) { - if( m_target == RIGHT_REGULAR_GRAMMAR || REGULAR_GRAMMAR ) + if( m_target == RIGHT_REGULAR_GRAMMAR ) convertFSMtoRRG( ); else if( m_target == LEFT_REGULAR_GRAMMAR ) convertFSMtoLRG( ); @@ -172,7 +172,7 @@ void ConversionHandler::convertREtoFSM( void ) void ConversionHandler::convertREtoRG( void ) { - if( m_target == RIGHT_REGULAR_GRAMMAR || REGULAR_GRAMMAR ) + if( m_target == RIGHT_REGULAR_GRAMMAR ) convertREtoRRG( ); else if( m_target == LEFT_REGULAR_GRAMMAR ) throw AlibException( "ConversionHandler:: RE to LRG is not implemented. Please convert to RRG and then to LRG." ); @@ -361,10 +361,7 @@ ConversionHandler::TFormalism ConversionHandler::parseFormalismFromString( const if( target == "re" || target == "regexp" || target == "regex" ) return REGULAR_EXPRESSION; - if( target == "rg" || target == "grammar" ) - return REGULAR_GRAMMAR; - - if( target == "rrg" ) + if( target == "rrg" || target == "rg" || target == "grammar" ) return RIGHT_REGULAR_GRAMMAR; if( target == "lrg" ) diff --git a/aconversions/src/fa2rg/fa2lrg/FAtoLRGConverter.cpp b/aconversions/src/fa2rg/fa2lrg/FAtoLRGConverter.cpp index 7cc7fe416aa55122bbb8bf1c49c3253f65e146b5..253fcf940a4c15ecf7e34ff6ac6bdfbc9743a767 100644 --- a/aconversions/src/fa2rg/fa2lrg/FAtoLRGConverter.cpp +++ b/aconversions/src/fa2rg/fa2lrg/FAtoLRGConverter.cpp @@ -51,9 +51,12 @@ LeftRegularGrammar FAtoLRGConverter::convert( void ) { 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( ) ); + + Rule r( leftSide, rightSide ); + if( ! isInSet( r, grammar.getRules( ) ) ) + grammar.addRule( Rule( leftSide, rightSide ) ); } @@ -69,7 +72,10 @@ LeftRegularGrammar FAtoLRGConverter::convert( void ) list<Symbol> leftSide, rightSide; leftSide.push_back( grammar.getStartSymbol( ) ); rightSide.push_back( transition.getInput( ) ); - grammar.addRule( Rule( leftSide, rightSide ) ); + + Rule r( leftSide, rightSide ); + if( ! isInSet( r, grammar.getRules( ) ) ) + grammar.addRule( Rule( leftSide, rightSide ) ); } } } diff --git a/aconversions/src/re2fa/Brzozowski.cpp b/aconversions/src/re2fa/Brzozowski.cpp index e6779762db520c4fc5f43cd6acf9aacf8e0ad09e..8009aec9a1266487482fbb9befbb60dec1a6f74c 100644 --- a/aconversions/src/re2fa/Brzozowski.cpp +++ b/aconversions/src/re2fa/Brzozowski.cpp @@ -76,7 +76,7 @@ FSM Brzozowski::convert( void ) for( const auto & r : Q ) { - State q( toBase26( ++ stateId ) ); + State q( toBase26( stateId ++ ) ); stateMap.insert( std::pair<RegExp,State>( r, q ) ); automaton.addState( q ); } diff --git a/aconversions/src/re2fa/Glushkov.cpp b/aconversions/src/re2fa/Glushkov.cpp index 9c86441c799467e15cee42359c929aceb76c9337..b2a847223bec7e25e7de8ac6c510b395b2d9fee5 100644 --- a/aconversions/src/re2fa/Glushkov.cpp +++ b/aconversions/src/re2fa/Glushkov.cpp @@ -50,9 +50,10 @@ FSM Glushkov::convert( void ) State q0( "q0" ); automaton.addState( q0 ); automaton.addInitialState( q0 ); + int stateId = 0; for( auto const& symbol : GlushkovTraversal::getSymbols( m_re ) ) { - State q( to_string( symbol.getId( ) ) ); + State q( toBase26( stateId ++ ) + to_string( symbol.getId( ) ) ); m_stateMap.insert( std::pair<GlushkovSymbol, State>( symbol, q ) ); automaton.addState( q ); diff --git a/aconversions/src/re2fa/Glushkov.h b/aconversions/src/re2fa/Glushkov.h index b6ec1109e8dbc06ec26373a9e28287cf42294d51..a1ba5e329a25e6fdd537cbb342182305f076d1f8 100644 --- a/aconversions/src/re2fa/Glushkov.h +++ b/aconversions/src/re2fa/Glushkov.h @@ -17,6 +17,7 @@ #include "../interface/IConversionFSM.h" #include "../shared/glushkov/GlushkovTraversal.h" +#include "../shared/Hexavigesimal.h" namespace conversions { diff --git a/aconversions/src/re2fa/Thompson.cpp b/aconversions/src/re2fa/Thompson.cpp index c92832ec6e99cf2a6e330786433606910ff0685f..b23f79c9e4009f7493915461674668114c482624 100644 --- a/aconversions/src/re2fa/Thompson.cpp +++ b/aconversions/src/re2fa/Thompson.cpp @@ -27,6 +27,7 @@ Thompson::~Thompson( void ) FSM Thompson::convert( void ) { m_fsm = FSM( ); + m_stateId = 0; for( const auto & symbol : m_re.getAlphabet( ) ) m_fsm.addInputSymbol( symbol.getSymbol( ) ); @@ -66,8 +67,8 @@ Thompson::SubexpressionTails Thompson::processRegExpNode( const RegExpElement * Thompson::SubexpressionTails Thompson::processRegExpNode( const Iteration * node ) { - State head = m_fsm.createUniqueState( "iter__head", true ); - State tail = m_fsm.createUniqueState( "iter__tail", true ); + State head = m_fsm.createUniqueState( toBase26( m_stateId ) + "0", true ); + State tail = m_fsm.createUniqueState( toBase26( m_stateId ++ ) + "1", true ); SubexpressionTails st = processRegExpNode( node->getElement( ) ); @@ -81,8 +82,8 @@ Thompson::SubexpressionTails Thompson::processRegExpNode( const Iteration * node Thompson::SubexpressionTails Thompson::processRegExpNode( const Alternation * node ) { - State head = m_fsm.createUniqueState( "alt__head", true ); - State tail = m_fsm.createUniqueState( "alt__tail", true ); + State head = m_fsm.createUniqueState( toBase26( m_stateId ) + "0", true ); + State tail = m_fsm.createUniqueState( toBase26( m_stateId ++ ) + "1", true ); for( const auto & element : node->getElements( ) ) { @@ -110,8 +111,8 @@ Thompson::SubexpressionTails Thompson::processRegExpNode( const Concatenation * Thompson::SubexpressionTails Thompson::processRegExpNode( const RegExpSymbol * node ) { Symbol symb( node->getSymbol( ) ); - State head = m_fsm.createUniqueState( "sym__start", true ); - State tail = m_fsm.createUniqueState( "sym__end", true ); + State head = m_fsm.createUniqueState( toBase26( m_stateId ) + "0", true ); + State tail = m_fsm.createUniqueState( toBase26( m_stateId ++ ) + "1", true ); m_fsm.addTransition( head, symb, tail ); @@ -121,8 +122,8 @@ Thompson::SubexpressionTails Thompson::processRegExpNode( const RegExpSymbol * n Thompson::SubexpressionTails Thompson::processRegExpNode( const RegExpEpsilon * node ) { Symbol symb( "" ); - State head = m_fsm.createUniqueState( "epssym__start", true ); - State tail = m_fsm.createUniqueState( "epssym__end", true ); + State head = m_fsm.createUniqueState( toBase26( m_stateId ) + "0", true ); + State tail = m_fsm.createUniqueState( toBase26( m_stateId ++ ) + "1", true ); m_fsm.addTransition( head, symb, tail ); @@ -131,8 +132,8 @@ Thompson::SubexpressionTails Thompson::processRegExpNode( const RegExpEpsilon * Thompson::SubexpressionTails Thompson::processRegExpNode( const RegExpEmpty * node ) { - State head = m_fsm.createUniqueState( "empty__start", true ); - State tail = m_fsm.createUniqueState( "empty__end", true ); + State head = m_fsm.createUniqueState( toBase26( m_stateId ) + "0", true ); + State tail = m_fsm.createUniqueState( toBase26( m_stateId ++ ) + "1", true ); return SubexpressionTails( head, tail ); } diff --git a/aconversions/src/re2fa/Thompson.h b/aconversions/src/re2fa/Thompson.h index 970c77d399d1f7d7ca61a8fd46582a78a067b861..ae2f5452bbe7a6a09e694cc29d920cc56f493f34 100644 --- a/aconversions/src/re2fa/Thompson.h +++ b/aconversions/src/re2fa/Thompson.h @@ -18,6 +18,7 @@ #include "../interface/IConversionFSM.h" #include "../include/macros.h" +#include "../shared/Hexavigesimal.h" namespace conversions @@ -56,6 +57,7 @@ private: * output FSM ($\varepsilon$--NFA) */ automaton::FSM m_fsm; + int m_stateId; /** * Stores head and tail state of "subautomaton" created in regexp subtree. diff --git a/aconversions/src/re2rg/re2rrg/BrzozowskiDerivationRRG.cpp b/aconversions/src/re2rg/re2rrg/BrzozowskiDerivationRRG.cpp index 8ba4a892b59764d0452a6e32a577e515650a26da..246199f696901126e8f74da72ebf99102ebfa994 100644 --- a/aconversions/src/re2rg/re2rrg/BrzozowskiDerivationRRG.cpp +++ b/aconversions/src/re2rg/re2rrg/BrzozowskiDerivationRRG.cpp @@ -75,7 +75,7 @@ RightRegularGrammar BrzozowskiDerivationRRG::convert( void ) for( const auto & r : N ) { - Symbol nt = grammar.createUniqueNonTerminalSymbol( toBase26( ++ nonterminalId ) ); + Symbol nt = grammar.createUniqueNonTerminalSymbol( toBase26( nonterminalId ++ ) ); nonterminalMap.insert( pair<RegExp, Symbol>( r, nt ) ); } diff --git a/aconversions/src/re2rg/re2rrg/GlushkovRRG.cpp b/aconversions/src/re2rg/re2rrg/GlushkovRRG.cpp index e7dc539e770b096837b60ae5c921efec09f357ae..f28ec8c92762289f3a261da597668f2ca86cf4b4 100644 --- a/aconversions/src/re2rg/re2rrg/GlushkovRRG.cpp +++ b/aconversions/src/re2rg/re2rrg/GlushkovRRG.cpp @@ -46,9 +46,11 @@ RightRegularGrammar GlushkovRRG::convert( void ) Symbol S = grammar.createUniqueNonTerminalSymbol( "S" ); grammar.setStartSymbol( S ); + int nonterminalId = 0; + for( auto const& symbol : GlushkovTraversal::getSymbols( m_re ) ) { - Symbol a = grammar.createUniqueNonTerminalSymbol( symbol.getInputSymbol( ).getSymbol( ) + to_string( symbol.getId( ) ) ); + Symbol a = grammar.createUniqueNonTerminalSymbol( toBase26( nonterminalId ++ ) + to_string( symbol.getId( ) ) ); m_symbolMap.insert( std::pair<GlushkovSymbol, Symbol>( symbol, a ) ); } diff --git a/aconversions/src/re2rg/re2rrg/GlushkovRRG.h b/aconversions/src/re2rg/re2rrg/GlushkovRRG.h index fa9b74747070e8bcb1dcd228f3616f8f947590f9..f464aad0d70676be35e8e6ee2c282034195eecdd 100644 --- a/aconversions/src/re2rg/re2rrg/GlushkovRRG.h +++ b/aconversions/src/re2rg/re2rrg/GlushkovRRG.h @@ -16,6 +16,8 @@ #include "../../interface/IConversionRRG.h" #include "../../shared/glushkov/GlushkovTraversal.h" +#include "../../shared/Hexavigesimal.h" + namespace conversions { diff --git a/aconversions/src/rg2fa/rrg2fa/RRGtoFAConverter.cpp b/aconversions/src/rg2fa/rrg2fa/RRGtoFAConverter.cpp index ea121d2fdbc81a8f4af7859f2b38e1ec8dc65ea2..8c81927b11d68116e1a96fa4593484655f09a27e 100644 --- a/aconversions/src/rg2fa/rrg2fa/RRGtoFAConverter.cpp +++ b/aconversions/src/rg2fa/rrg2fa/RRGtoFAConverter.cpp @@ -28,7 +28,7 @@ FSM RRGtoFAConverter::convert( void ) for( const auto & symbol : m_grammar.getNonTerminalSymbols( ) ) automaton.addState( State( symbol.getSymbol( ) ) ); - const State & AState = automaton.createUniqueState( "A", true ); + const State & AState = automaton.createUniqueState( "A", false ); for( const auto & rule : m_grammar.getRules( ) ) { diff --git a/tests.aconversion.sh b/tests.aconversion.sh index 67d0c0975d263d94a4e05c0f1788329f3669011f..60d3d62f4ae6c463287f927cd5396d8ead302dcc 100755 --- a/tests.aconversion.sh +++ b/tests.aconversion.sh @@ -2,7 +2,7 @@ set -o pipefail -TESTCASE_ITERATIONS=200 +TESTCASE_ITERATIONS=100 TESTCASE_TIMEOUT=5 LOGFILE="log_tests.txt" @@ -58,7 +58,7 @@ function runTest2 { RETTMP=$? # segfault - if [ $RETTMP -eq 139 ]; then + if [ $RETTMP -eq 134 ]; then return 3 fi