diff --git a/aconversions/src/conversions/re2fa/BrzozowskiDerivative.cpp b/aconversions/src/conversions/re2fa/BrzozowskiDerivative.cpp index d2c9f896b6545931d4191ff1cb15129ced916608..1ae3d80fd6143f36a2130456d2fd4fe8d788c036 100644 --- a/aconversions/src/conversions/re2fa/BrzozowskiDerivative.cpp +++ b/aconversions/src/conversions/re2fa/BrzozowskiDerivative.cpp @@ -92,7 +92,7 @@ RegExpElement * BrzozowskiDerivative::derivativeConcatenation( Concatenation * e l.push_back( e->clone() ); } - if( containsEpsilon( * element->getElements( ).begin( ) ) ) + if( RegExpUtils::containsEpsilon( * element->getElements( ).begin( ) ) ) { Alternation* alt = new Alternation( ); list<RegExpElement*> & al = alt->getElements( ); @@ -133,32 +133,4 @@ RegExpElement * BrzozowskiDerivative::derivativeSymbol( RegExpSymbol * element, return dSymbol == element->getSymbol( ) ? new RegExpSymbol( "" ) : NULL; } -bool BrzozowskiDerivative::containsEpsilon( RegExpElement * element ) const -{ - Alternation* alternation = dynamic_cast<Alternation*>( element ); - Concatenation* concatenation = dynamic_cast<Concatenation*>( element ); - Iteration* iteration = dynamic_cast<Iteration*>( element ); - RegExpSymbol* symbol = dynamic_cast<RegExpSymbol*>( element ); - - if( alternation ) - { - for( auto e : alternation->getElements( ) ) - if( containsEpsilon( e ) ) - return true; - - return false; - } - - if( concatenation ) - { - for( auto e : concatenation->getElements( ) ) - if( ! containsEpsilon( e ) ) - return false; - - return true; - } - - return iteration || ( symbol && *symbol == RegExpSymbol( "" ) ); -} - } /* namespace conversions */ diff --git a/aconversions/src/conversions/re2fa/BrzozowskiDerivative.h b/aconversions/src/conversions/re2fa/BrzozowskiDerivative.h index aaf55c4d133501cf7d4fb2d97d1866985fd49077..dfb6df5965939753b90b40bed094ef31a0d83a40 100644 --- a/aconversions/src/conversions/re2fa/BrzozowskiDerivative.h +++ b/aconversions/src/conversions/re2fa/BrzozowskiDerivative.h @@ -19,6 +19,7 @@ #include "BrzozowskiDerivativeNormalize.h" #include "../../utils/ConversionException.h" +#include "../../utils/RegExpUtils.h" namespace conversions { diff --git a/aconversions/src/conversions/re2fa/Makefile b/aconversions/src/conversions/re2fa/Makefile index d1943d04daf3c06f55fdb60ef58025b7cd7706a0..56235e2da2ea2f04ea25ae47b9ac3d748e1793a5 100644 --- a/aconversions/src/conversions/re2fa/Makefile +++ b/aconversions/src/conversions/re2fa/Makefile @@ -1,19 +1,19 @@ all: are2fa.glushkov are2fa.brzozowski are2fa.thompson mv are2fa.glushkov $(BIN_DIR) - #mv are2fa.brzozowski $(BIN_DIR) + mv are2fa.brzozowski $(BIN_DIR) mv are2fa.thompson $(BIN_DIR) are2fa.glushkov: are2fa.glushkov.o Glushkov.o AbstractREtoFAConverter.o RegExpUtils.o ConversionException.o $(LD) $(LDFLAGS) $^ -o $@ -are2fa.brzozowski: are2fa.brzozowski.o Brzozowski.o AbstractREtoFAConverter.o - #$(LD) $(LDFLAGS) $^ -o $@ +are2fa.brzozowski: are2fa.brzozowski.o Brzozowski.o AbstractREtoFAConverter.o BrzozowskiDerivative.o ConversionException.o BrzozowskiDerivativeNormalize.o RegExpUtils.o + $(LD) $(LDFLAGS) $^ -o $@ are2fa.thompson: are2fa.thompson.o Thompson.o AbstractREtoFAConverter.o AutomatonUtils.o ConversionException.o $(LD) $(LDFLAGS) $^ -o $@ -are2fa.brzozowski.o: are2fa.brzozowski.cpp Brzozowski.h AbstractREtoFAConverter.h +are2fa.brzozowski.o: are2fa.brzozowski.cpp Brzozowski.h BrzozowskiDerivative.h BrzozowskiDerivativeNormalize.h AbstractREtoFAConverter.h $(CXX) $(CXXFLAGS) $< -o $@ are2fa.glushkov.o: are2fa.glushkov.cpp Glushkov.h AbstractREtoFAConverter.h @@ -22,12 +22,19 @@ are2fa.glushkov.o: are2fa.glushkov.cpp Glushkov.h AbstractREtoFAConverter.h are2fa.thompson.o: are2fa.thompson.cpp Thompson.h AbstractREtoFAConverter.h $(CXX) $(CXXFLAGS) $< -o $@ + AbstractREtoFAConverter.o: AbstractREtoFAConverter.cpp AbstractREtoFAConverter.h $(CXX) $(CXXFLAGS) $< -o $@ Brzozowski.o: Brzozowski.cpp Brzozowski.h AbstractREtoFAConverter.h $(CXX) $(CXXFLAGS) $< -o $@ +BrzozowskiDerivative.o: BrzozowskiDerivative.cpp BrzozowskiDerivative.h BrzozowskiDerivativeNormalize.h ../../utils/ConversionException.h ../../utils/RegExpUtils.h + $(CXX) $(CXXFLAGS) $< -o $@ + +BrzozowskiDerivativeNormalize.o: BrzozowskiDerivativeNormalize.cpp BrzozowskiDerivativeNormalize.h ../../utils/ConversionException.h + $(CXX) $(CXXFLAGS) $< -o $@ + Glushkov.o: Glushkov.cpp Glushkov.h AbstractREtoFAConverter.h $(CXX) $(CXXFLAGS) $< -o $@ diff --git a/aconversions/src/conversions/re2fa/are2fa.brzozowski.cpp b/aconversions/src/conversions/re2fa/are2fa.brzozowski.cpp index e23912e8993bd74263e2fc89c3d2f97e036d4677..63efce4a2e25c420f7aef76dc2a6d70a80a3c0cb 100644 --- a/aconversions/src/conversions/re2fa/are2fa.brzozowski.cpp +++ b/aconversions/src/conversions/re2fa/are2fa.brzozowski.cpp @@ -25,7 +25,7 @@ int main(int argc, char** argv) RegExp re = RegExpParser::parse(tokens); Brzozowski conv( re ); - conv.convert( ).toXML( cout ); + conv.convert( );//.toXML( cout ); } catch( AlibException & e ) { diff --git a/aconversions/src/utils/RegExpUtils.cpp b/aconversions/src/utils/RegExpUtils.cpp index 6d7feab78c133c05d5b1fe5a3bb251c762f99d98..827a856c0528efc5199da2f0095b0d73c4be88f9 100644 --- a/aconversions/src/utils/RegExpUtils.cpp +++ b/aconversions/src/utils/RegExpUtils.cpp @@ -45,4 +45,32 @@ void RegExpUtils::traverseSymbols( RegExpElement * element, list<RegExpSymbol> & throw ConversionException( "Captain's log. Stardate 3413.6. Approaching TraverseUtils, class RegExpUtils planet. Encountered invalid RegExpElement. Sending away team to explore." ); } +bool RegExpUtils::containsEpsilon( RegExpElement * element ) +{ + Alternation* alternation = dynamic_cast<Alternation*>( element ); + Concatenation* concatenation = dynamic_cast<Concatenation*>( element ); + Iteration* iteration = dynamic_cast<Iteration*>( element ); + RegExpSymbol* symbol = dynamic_cast<RegExpSymbol*>( element ); + + if( alternation ) + { + for( auto e : alternation->getElements( ) ) + if( containsEpsilon( e ) ) + return true; + + return false; + } + + if( concatenation ) + { + for( auto e : concatenation->getElements( ) ) + if( ! containsEpsilon( e ) ) + return false; + + return true; + } + + return iteration || ( symbol && *symbol == RegExpSymbol( "" ) ); +} + } /* namespace conversions */ diff --git a/aconversions/src/utils/RegExpUtils.h b/aconversions/src/utils/RegExpUtils.h index e67b227bf32ea510aef76d6c66ad0757e86ed509..876af27945d6b399c8ac27cee4298a6db4c06eb1 100644 --- a/aconversions/src/utils/RegExpUtils.h +++ b/aconversions/src/utils/RegExpUtils.h @@ -18,6 +18,7 @@ class RegExpUtils { public: static std::list<regexp::RegExpSymbol> getRegExpSymbols( const regexp::RegExp & re ); + static bool containsEpsilon( regexp::RegExpElement * element ); private: static void traverseSymbols( regexp::RegExpElement * element, std::list<regexp::RegExpSymbol> & alphabet );