diff --git a/aconversions/src/re2fa/Brzozowski.cpp b/aconversions/src/re2fa/Brzozowski.cpp index 90e268a22701eaf44bc1501bd559b5d85dedf616..24415f77393dde06cdef2d2cd349bc730c44368e 100644 --- a/aconversions/src/re2fa/Brzozowski.cpp +++ b/aconversions/src/re2fa/Brzozowski.cpp @@ -54,14 +54,9 @@ FSM Brzozowski::convert( void ) RegExp derived = deriv.derivation( a ); derived = opt.optimize( derived ); - // no "trash state" (though algorithm probably considers it) - if( ! derived.isEmpty( ) ) - { - if( ! isInSet( derived, Q ) ) // if this state has already been found, do not add - Qi.at( i ).insert( derived ); - - m_transitions.insert( Transition( regexp, Symbol( a.getSymbol( ) ), derived ) ); - } + // this will also add \emptyset as a regexp (and as FA state) + if( ! isInSet( derived, Q ) ) // if this state has already been found, do not add + Qi.at( i ).insert( derived ); } } @@ -82,8 +77,20 @@ FSM Brzozowski::convert( void ) for( const auto & a : alphabet ) m_fsm.addInputSymbol( a.getSymbol( ) ); - for( const auto & t : m_transitions ) - m_fsm.addTransition( builder.getState( t.m_from ), t.m_symbol, builder.getState( t.m_to ) ); + for( const auto & r : Q ) + { + RegExpDerivation deriv( r ); + + for( const auto & a: m_fsm.getInputAlphabet( ) ) + { + RegExp derived = deriv.derivation( a ); + derived = opt.optimize( derived ); + + TransitionFSM t( builder.getState( r ), a, builder.getState( derived ) ); + if( ! isInSet( t, m_fsm.getTransitions( ) ) ) + m_fsm.addTransition( t ); + } + } m_fsm.addInitialState( builder.getState( V ) ); @@ -96,24 +103,6 @@ FSM Brzozowski::convert( void ) // ---------------------------------------------------------------------------- -Brzozowski::Transition::Transition( const RegExp & from, const Symbol & symb, const RegExp & to ) - : m_from( from ), m_to( to ), m_symbol( symb ) -{ - -} - -bool Brzozowski::Transition::operator<( const Transition & x ) const -{ - if( m_from != x.m_from ) - return m_from < x.m_from; - else if( m_symbol != x.m_symbol ) - return m_symbol < x.m_symbol; - else - return m_to < x.m_to; -} - -// ---------------------------------------------------------------------------- - Brzozowski::StateBuilder::StateBuilder( const set<RegExp> & Q ) { m_stateId = 0; diff --git a/aconversions/src/re2fa/Brzozowski.h b/aconversions/src/re2fa/Brzozowski.h index d455ff530834d194509eca2dd3a461b0c044642c..c858dfb5c7cb37297aaf20709ceb382b528be00f 100644 --- a/aconversions/src/re2fa/Brzozowski.h +++ b/aconversions/src/re2fa/Brzozowski.h @@ -77,30 +77,6 @@ private: unsigned int m_stateId; }; - - /** - * Stores original regular epxression (m_from), and result of derivation (m_to) over m_symbol. - */ - struct Transition - { - const regexp::RegExp m_from, m_to; - const alphabet::Symbol m_symbol; - - /** - * @param from original regexp - * @param to resulting regexp - * @param symb - */ - Transition( const regexp::RegExp & from, const alphabet::Symbol & symb, const regexp::RegExp & to ); - - bool operator<( const Transition & other ) const; - }; - - /** - * Set of transitions. - * @see Brzozowski::Transition - */ - std::set<Transition> m_transitions; }; } /* namespace conversions */ diff --git a/aconversions/src/re2rg/re2rrg/BrzozowskiDerivationRRG.cpp b/aconversions/src/re2rg/re2rrg/BrzozowskiDerivationRRG.cpp index eff5b812bff92ef24fe699490d4b8e953999091b..0797f640ce957dc7494ab8e44a147368078d20cf 100644 --- a/aconversions/src/re2rg/re2rrg/BrzozowskiDerivationRRG.cpp +++ b/aconversions/src/re2rg/re2rrg/BrzozowskiDerivationRRG.cpp @@ -56,13 +56,8 @@ RightRegularGrammar BrzozowskiDerivationRRG::convert( void ) RegExp derived = deriv.derivation( a ); derived = opt.optimize( derived ); - if( ! derived.isEmpty( ) ) - { - if( ! isInSet( derived, N ) ) // if this state has already been found, do not add - Ni.at( i ).insert( derived ); - - m_transitions.insert( Transition( regexp, Symbol( a.getSymbol( ) ), derived ) ); - } + if( ! isInSet( derived, N ) ) // if this state has already been found, do not add + Ni.at( i ).insert( derived ); } } @@ -77,18 +72,27 @@ RightRegularGrammar BrzozowskiDerivationRRG::convert( void ) NonTerminalBuilder builder( N, m_grammar ); - for( const auto & t : m_transitions ) + for( const auto & r : N ) { - list<Symbol> leftSide = { builder.getNonTerminal( t.m_from ) }; - list<Symbol> rightSide = { t.m_symbol, builder.getNonTerminal( t.m_to ) }; - Rule r( leftSide, rightSide ); - m_grammar.addRule( r ); + RegExpDerivation deriv( r ); - if( t.m_to.containsEmptyString( ) ) + for( const auto & a : alphabet ) { - list<Symbol> rightSide = { t.m_symbol }; + RegExp derived = deriv.derivation( a ); + derived = opt.optimize( derived ); + + list<Symbol> leftSide = { builder.getNonTerminal( r ) }; + list<Symbol> rightSide = { a, builder.getNonTerminal( derived ) }; + Rule r( leftSide, rightSide ); m_grammar.addRule( r ); + + if( derived.containsEmptyString( ) ) + { + list<Symbol> rightSide = { a }; + Rule r( leftSide, rightSide ); + m_grammar.addRule( r ); + } } } @@ -122,24 +126,6 @@ RightRegularGrammar BrzozowskiDerivationRRG::convert( void ) // ---------------------------------------------------------------------------- -BrzozowskiDerivationRRG::Transition::Transition( const RegExp & from, const Symbol & symb, const RegExp & to ) - : m_from( from ), m_to( to ), m_symbol( symb ) -{ - -} - -bool BrzozowskiDerivationRRG::Transition::operator<( const Transition & x ) const -{ - if( m_from != x.m_from ) - return m_from < x.m_from; - else if( m_symbol != x.m_symbol ) - return m_symbol < x.m_symbol; - else - return m_to < x.m_to; -} - -// ---------------------------------------------------------------------------- - BrzozowskiDerivationRRG::NonTerminalBuilder::NonTerminalBuilder( const set<RegExp> & Q, RightRegularGrammar & grammar ) : m_grammar( grammar ) { m_nonTerminalId = 0; diff --git a/aconversions/src/re2rg/re2rrg/BrzozowskiDerivationRRG.h b/aconversions/src/re2rg/re2rrg/BrzozowskiDerivationRRG.h index 47b1546dccf67f8af173d41848b4b0dc527063b4..90182cf0cc046be93762dfb98dbd69ade66957b9 100644 --- a/aconversions/src/re2rg/re2rrg/BrzozowskiDerivationRRG.h +++ b/aconversions/src/re2rg/re2rrg/BrzozowskiDerivationRRG.h @@ -45,15 +45,6 @@ public: grammar::RightRegularGrammar convert( void ); protected: - struct Transition - { - const regexp::RegExp m_from, m_to; - const alphabet::Symbol m_symbol; - - Transition( const regexp::RegExp & from, const alphabet::Symbol & symb, const regexp::RegExp & to ); - bool operator<( const Transition & other ) const; - }; - class NonTerminalBuilder { public: @@ -66,8 +57,6 @@ protected: std::string createNewName( void ); unsigned int m_nonTerminalId; }; - - std::set<Transition> m_transitions; }; } /* namespace conversions */