diff --git a/alib2algo/src/regexp/RegExpOptimize.cpp b/alib2algo/src/regexp/RegExpOptimize.cpp index 03574a293590868da8b2df5b962fb2dc5c55b073..9203ccb549a6d302c7720ceca72fcde8b0ebff2e 100644 --- a/alib2algo/src/regexp/RegExpOptimize.cpp +++ b/alib2algo/src/regexp/RegExpOptimize.cpp @@ -13,6 +13,29 @@ namespace regexp { +regexp::RegExp RegExpOptimize::optimize(const regexp::RegExp& regexp) +{ + regexp::RegExp * out = NULL; + regexp.getData().Accept((void*) &out, *this); + regexp::RegExp res( std::move( * out ) ); + delete out; + return res; +} + +void RegExpOptimize::Visit(void* userData, const regexp::FormalRegExp& regexp) +{ + regexp::RegExp * &ret = *(regexp::RegExp **) userData; + + ret = new regexp::RegExp( this->optimize( regexp ) ); +} + +void RegExpOptimize::Visit(void* userData, const regexp::UnboundedRegExp& regexp) +{ + regexp::RegExp * &ret = *(regexp::RegExp **) userData; + + ret = new regexp::RegExp( this->optimize( regexp ) ); +} + FormalRegExp RegExpOptimize::optimize( FormalRegExp const & regexp ) { throw exception::AlibException("Unimplemented"); @@ -563,7 +586,9 @@ bool RegExpOptimize::A10( UnboundedRegExpAlternation * const & node ) { optimized = optimizedIter = true; + size_t off = it - node->elements.begin(); node->elements.push_back( iter->clone( ) ); + it = node->elements.begin() + off; delete childConcat; it = node->elements.erase( it ); @@ -1194,7 +1219,7 @@ bool RegExpOptimize::V9( UnboundedRegExpConcatenation * const & node ) // std::cout << RegExp( tmp ) << std::endl; // copy the range <it;sth>, delete it and go back to the iter node - std::vector<UnboundedRegExpElement*> copyRange; + std::vector<UnboundedRegExpElement*> copyRange; copyRange.insert( copyRange.end(), std::next( it ), c1Iter ); it = node->elements.erase( std::next( it ), c1Iter ); it = std::prev( it ); diff --git a/alib2algo/src/regexp/RegExpOptimize.h b/alib2algo/src/regexp/RegExpOptimize.h index 8f6ff40ee2f9fd4030588f0f8efc5695ba652ff2..56fe7ea06c6029d9a4eb538b5268faf2d03607f1 100644 --- a/alib2algo/src/regexp/RegExpOptimize.h +++ b/alib2algo/src/regexp/RegExpOptimize.h @@ -12,6 +12,8 @@ #include <functional> #include <iterator> +#include <regexp/RegExp.h> + #include <regexp/unbounded/UnboundedRegExp.h> #include <regexp/unbounded/UnboundedRegExpElements.h> @@ -57,9 +59,11 @@ namespace regexp { * * - X1 : -> : a* + \e = a* */ -class RegExpOptimize +class RegExpOptimize : public regexp::VisitableRegExpBase::visitor_type { public: + regexp::RegExp optimize( const regexp::RegExp & regexp ); + regexp::UnboundedRegExp optimize( const regexp::UnboundedRegExp & regexp ); void optimize( regexp::UnboundedRegExpElement & regexp ); @@ -74,7 +78,8 @@ private: regexp::UnboundedRegExpElement * optimize( regexp::UnboundedRegExpEpsilon const * const & node ); regexp::UnboundedRegExpElement * optimize( regexp::UnboundedRegExpEmpty const * const & node ); - + void Visit(void*, const regexp::UnboundedRegExp& regexp); + void Visit(void*, const regexp::FormalRegExp& regexp); private: bool A1( regexp::UnboundedRegExpAlternation * const & node );