From 2b7d1a23ca6c58a5f9cc02e29b9db8b93919df95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <peckato1@fit.cvut.cz> Date: Fri, 12 Sep 2014 11:34:10 +0200 Subject: [PATCH] algo: rg2re. aconversion rewrite finished. (quality may be questioned though) --- aconversions/makefile | 20 --- aconversions/src/include/macros.h | 17 -- aconversions/src/interface/Conversion.cpp | 18 -- aconversions/src/interface/Conversion.h | 26 --- aconversions/src/interface/IConversionFSM.cpp | 18 -- aconversions/src/interface/IConversionFSM.h | 35 ---- aconversions/src/interface/IConversionLRG.cpp | 18 -- aconversions/src/interface/IConversionLRG.h | 35 ---- aconversions/src/interface/IConversionRE.cpp | 18 -- aconversions/src/interface/IConversionRE.h | 35 ---- aconversions/src/interface/IConversionRRG.cpp | 18 -- aconversions/src/interface/IConversionRRG.h | 35 ---- .../src/rg2re/lrg2re/LRGAlgebraic.cpp | 57 ------ aconversions/src/rg2re/lrg2re/LRGAlgebraic.h | 44 ----- .../src/rg2re/rrg2re/RRGAlgebraic.cpp | 57 ------ aconversions/src/rg2re/rrg2re/RRGAlgebraic.h | 44 ----- aconversions2/src/ConversionHandler.cpp | 54 ++---- .../src/conversions/rg2re/RGtoREAlgebraic.cpp | 162 ++++++++++++++++++ .../src/conversions/rg2re/RGtoREAlgebraic.h | 57 ++++++ tests.aconversion.sh | 48 +++--- 20 files changed, 253 insertions(+), 563 deletions(-) delete mode 100644 aconversions/makefile delete mode 100644 aconversions/src/include/macros.h delete mode 100644 aconversions/src/interface/Conversion.cpp delete mode 100644 aconversions/src/interface/Conversion.h delete mode 100644 aconversions/src/interface/IConversionFSM.cpp delete mode 100644 aconversions/src/interface/IConversionFSM.h delete mode 100644 aconversions/src/interface/IConversionLRG.cpp delete mode 100644 aconversions/src/interface/IConversionLRG.h delete mode 100644 aconversions/src/interface/IConversionRE.cpp delete mode 100644 aconversions/src/interface/IConversionRE.h delete mode 100644 aconversions/src/interface/IConversionRRG.cpp delete mode 100644 aconversions/src/interface/IConversionRRG.h delete mode 100644 aconversions/src/rg2re/lrg2re/LRGAlgebraic.cpp delete mode 100644 aconversions/src/rg2re/lrg2re/LRGAlgebraic.h delete mode 100644 aconversions/src/rg2re/rrg2re/RRGAlgebraic.cpp delete mode 100644 aconversions/src/rg2re/rrg2re/RRGAlgebraic.h create mode 100644 alib2algo/src/conversions/rg2re/RGtoREAlgebraic.cpp create mode 100644 alib2algo/src/conversions/rg2re/RGtoREAlgebraic.h diff --git a/aconversions/makefile b/aconversions/makefile deleted file mode 100644 index fe10f92304..0000000000 --- a/aconversions/makefile +++ /dev/null @@ -1,20 +0,0 @@ -CC=g++ -EXECUTABLE=aconversion -CCFLAGS= -std=c++11 -O2 -c -Wall -I../alib/src -I/usr/include/libxml2/ -I../libaregexptree/src -LDFLAGS= -L../alib/lib -L../libaregexptree/lib -lxml2 -laregexptree -lalib -Wl,-rpath,. - -SOURCES=$(shell find src/ -name *cpp) -OBJECTS=$(patsubst src/%.cpp, obj/%.o, $(SOURCES)) - -all: $(SOURCES) bin/$(EXECUTABLE) - -bin/$(EXECUTABLE): $(OBJECTS) - mkdir -p bin - $(CC) $(OBJECTS) -o $@ $(LDFLAGS) - -obj/%.o: src/%.cpp - mkdir -p $(dir $@) - $(CC) $(CCFLAGS) $< -o $@ - -clean: - $(RM) -r *.o *.d bin obj diff --git a/aconversions/src/include/macros.h b/aconversions/src/include/macros.h deleted file mode 100644 index 735e229948..0000000000 --- a/aconversions/src/include/macros.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef MACROS_H_ -#define MACROS_H_ - -#include <algorithm> -#include <set> -#include <list> - -namespace conversions -{ - -#define isInSet(x,set) ( (set).find((x)) != (set).end() ) -#define isInList(x,list) ( find((list).begin(), (list).end(), (x)) != (list).end() ) -#define isKeyInMap(key,map) ( (map).find((key)) != (map).end() ) - -} /* namespace conversions */ - -#endif /* MACROS_H_ */ diff --git a/aconversions/src/interface/Conversion.cpp b/aconversions/src/interface/Conversion.cpp deleted file mode 100644 index dcd2a5b538..0000000000 --- a/aconversions/src/interface/Conversion.cpp +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Conversion.cpp - * - * Created on: 23. 2. 2014 - * Author: tomas - */ - -#include "Conversion.h" - -namespace conversions -{ - -Conversion::Conversion() -{ - -} - -} /* namespace conversions */ diff --git a/aconversions/src/interface/Conversion.h b/aconversions/src/interface/Conversion.h deleted file mode 100644 index 3d80365961..0000000000 --- a/aconversions/src/interface/Conversion.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Conversion.h - * - * Created on: 23. 2. 2014 - * Author: tomas - */ - -#ifndef CONVERSION_H_ -#define CONVERSION_H_ - -namespace conversions -{ - -/** - * Base conversion class for all the conversions. - * Although this class brings order into chaos, feel free to remove it. - */ -class Conversion -{ -public: - Conversion( void ); -}; - -} /* namespace conversions */ - -#endif /* CONVERSION_H_ */ diff --git a/aconversions/src/interface/IConversionFSM.cpp b/aconversions/src/interface/IConversionFSM.cpp deleted file mode 100644 index 261d682732..0000000000 --- a/aconversions/src/interface/IConversionFSM.cpp +++ /dev/null @@ -1,18 +0,0 @@ -/* - * IConversionFSM.cpp - * - * Created on: 19. 4. 2014 - * Author: tomas - */ - -#include "IConversionFSM.h" - -namespace conversions -{ - -IConversionFSM::~IConversionFSM( void ) -{ - -} - -} /* namespace conversions */ diff --git a/aconversions/src/interface/IConversionFSM.h b/aconversions/src/interface/IConversionFSM.h deleted file mode 100644 index 62ac23c404..0000000000 --- a/aconversions/src/interface/IConversionFSM.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * IConversionFSM.h - * - * Created on: 19. 4. 2014 - * Author: tomas - */ - -#ifndef __ICONVERSIONFSM_H__ -#define __ICONVERSIONFSM_H__ - -#include "Conversion.h" - -#include <automaton/FSM/FSM.h> - -namespace conversions -{ - -/** - * Interface for conversion to finite automaton. - */ -class IConversionFSM : public Conversion -{ -public: - /** - * @return fsm equivalent to input. - */ - virtual automaton::FSM convert( void ) = 0; - - virtual ~IConversionFSM( void ); - -}; - -} /* namespace conversions */ - -#endif /* __ICONVERSIONFSM_H__ */ diff --git a/aconversions/src/interface/IConversionLRG.cpp b/aconversions/src/interface/IConversionLRG.cpp deleted file mode 100644 index 47f03aec88..0000000000 --- a/aconversions/src/interface/IConversionLRG.cpp +++ /dev/null @@ -1,18 +0,0 @@ -/* - * IConversionLRG.cpp - * - * Created on: 19. 4. 2014 - * Author: tomas - */ - -#include "IConversionLRG.h" - -namespace conversions -{ - -IConversionLRG::~IConversionLRG( void ) -{ - -} - -} /* namespace conversions */ diff --git a/aconversions/src/interface/IConversionLRG.h b/aconversions/src/interface/IConversionLRG.h deleted file mode 100644 index f3e56bbe87..0000000000 --- a/aconversions/src/interface/IConversionLRG.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * IConversionLRG.h - * - * Created on: 19. 4. 2014 - * Author: tomas - */ - -#ifndef __ICONVERSIONLRG_H__ -#define __ICONVERSIONLRG_H__ - -#include "Conversion.h" - -#include <grammar/Regular/LeftRegularGrammar.h> - -namespace conversions -{ - -/** - * Interface for conversion to left regular grammar. - */ -class IConversionLRG : public Conversion -{ -public: - /** - * @return rrg equivalent to input. - */ - virtual grammar::LeftRegularGrammar convert( void ) = 0; - - virtual ~IConversionLRG( void ); - -}; - -} /* namespace conversions */ - -#endif /* __ICONVERSIONLRG_H__ */ diff --git a/aconversions/src/interface/IConversionRE.cpp b/aconversions/src/interface/IConversionRE.cpp deleted file mode 100644 index 03c3c4c1ec..0000000000 --- a/aconversions/src/interface/IConversionRE.cpp +++ /dev/null @@ -1,18 +0,0 @@ -/* - * IConversionRE.cpp - * - * Created on: 19. 4. 2014 - * Author: tomas - */ - -#include "IConversionRE.h" - -namespace conversions -{ - -IConversionRE::~IConversionRE( void ) -{ - -} - -} /* namespace conversions */ diff --git a/aconversions/src/interface/IConversionRE.h b/aconversions/src/interface/IConversionRE.h deleted file mode 100644 index 70658fa3f5..0000000000 --- a/aconversions/src/interface/IConversionRE.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * IConversionRE.h - * - * Created on: 19. 4. 2014 - * Author: tomas - */ - -#ifndef __ICONVERSIONRE_H__ -#define __ICONVERSIONRE_H__ - -#include "Conversion.h" - -#include <regexp/RegExp.h> - -namespace conversions -{ - -/** - * Interface for conversion to regexp. - */ -class IConversionRE : public Conversion -{ -public: - /** - * @return regexp equivalent to input. - */ - virtual regexp::RegExp convert( void ) = 0; - - virtual ~IConversionRE( void ); - -}; - -} /* namespace conversions */ - -#endif /* __ICONVERSIONRE_H__ */ diff --git a/aconversions/src/interface/IConversionRRG.cpp b/aconversions/src/interface/IConversionRRG.cpp deleted file mode 100644 index b358409101..0000000000 --- a/aconversions/src/interface/IConversionRRG.cpp +++ /dev/null @@ -1,18 +0,0 @@ -/* - * IConversionRRG.cpp - * - * Created on: 19. 4. 2014 - * Author: tomas - */ - -#include "IConversionRRG.h" - -namespace conversions -{ - -IConversionRRG::~IConversionRRG( void ) -{ - -} - -} /* namespace conversions */ diff --git a/aconversions/src/interface/IConversionRRG.h b/aconversions/src/interface/IConversionRRG.h deleted file mode 100644 index 40a5382747..0000000000 --- a/aconversions/src/interface/IConversionRRG.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * IConversionRRG.h - * - * Created on: 19. 4. 2014 - * Author: tomas - */ - -#ifndef __ICONVERSIONRRG_H__ -#define __ICONVERSIONRRG_H__ - -#include "Conversion.h" - -#include <grammar/Regular/RightRegularGrammar.h> - -namespace conversions -{ - -/** - * Interface for conversion to right regular grammar. - */ -class IConversionRRG : public Conversion -{ -public: - /** - * @return rrg equivalent to input. - */ - virtual grammar::RightRegularGrammar convert( void ) = 0; - - virtual ~IConversionRRG( void ); - -}; - -} /* namespace conversions */ - -#endif /* __ICONVERSIONRRG_H__ */ diff --git a/aconversions/src/rg2re/lrg2re/LRGAlgebraic.cpp b/aconversions/src/rg2re/lrg2re/LRGAlgebraic.cpp deleted file mode 100644 index b4fed3c3e3..0000000000 --- a/aconversions/src/rg2re/lrg2re/LRGAlgebraic.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* - * LRGAlgebraic.cpp - * - * Created on: 4. 3. 2014 - * Author: tomas - */ - -#include "LRGAlgebraic.h" - -using namespace alphabet; -using namespace grammar; -using namespace regexp; - -namespace conversions -{ - -LRGAlgebraic::LRGAlgebraic( const LeftRegularGrammar & lrg ) : m_grammar( lrg ) -{ - -} - -LRGAlgebraic::~LRGAlgebraic( void ) -{ - -} - -RegExp LRGAlgebraic::convert( void ) -{ - LeftRegularEquationSolver solver; - - for( const auto & symb : m_grammar.getNonTerminalSymbols( ) ) - solver.addSymbol( symb ); - - for( const auto & rule : m_grammar.getRules( ) ) - { - const Symbol & leftSide = rule.getLeftSide( ).front( ); - if( rule.getRightSide( ).size( ) == 0 ) - { - solver.addEquation( leftSide, new RegExpEpsilon( ) ); - } - else if( rule.getRightSide( ).size( ) == 1 ) - { - const Symbol & input = rule.getRightSide( ).front( ); - solver.addEquation( leftSide, new RegExpSymbol( input.getSymbol( ) ) ); - } - else - { - const Symbol nt = rule.getRightSide( ).front( ); - const Symbol input = rule.getRightSide( ).back( ); - solver.addEquation( leftSide, nt, new RegExpSymbol( input.getSymbol( ) ) ); - } - } - - return solver.solve( m_grammar.getStartSymbol( ) ); -} - -} /* namespace conversions */ diff --git a/aconversions/src/rg2re/lrg2re/LRGAlgebraic.h b/aconversions/src/rg2re/lrg2re/LRGAlgebraic.h deleted file mode 100644 index dcd36c4425..0000000000 --- a/aconversions/src/rg2re/lrg2re/LRGAlgebraic.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * LRGAlgebraic.h - * - * Created on: 4. 3. 2014 - * Author: tomas - */ - -#ifndef LRGALGEBRAIC_H_ -#define LRGALGEBRAIC_H_ - -#include <grammar/Regular/LeftRegularGrammar.h> -#include <regexp/RegExp.h> - -#include "../../shared/equations/LeftRegularEquationSolver.h" -#include "../../interface/IConversionRE.h" - -namespace conversions -{ - -class LRGAlgebraic: public IConversionRE -{ -public: - /** - * @param rg Source left regular grammar. - */ - LRGAlgebraic( const grammar::LeftRegularGrammar & rg ); - - ~LRGAlgebraic( void ); - - /** - * @return regexp equivalent to source left regular grammar. - */ - regexp::RegExp convert( void ); - -protected: - /** - * input grammar - */ - const grammar::LeftRegularGrammar & m_grammar; -}; - -} /* namespace conversions */ - -#endif /* LRGALGEBRAIC_H_ */ diff --git a/aconversions/src/rg2re/rrg2re/RRGAlgebraic.cpp b/aconversions/src/rg2re/rrg2re/RRGAlgebraic.cpp deleted file mode 100644 index a1060197ca..0000000000 --- a/aconversions/src/rg2re/rrg2re/RRGAlgebraic.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* - * RRGAlgebraic.cpp - * - * Created on: 4. 3. 2014 - * Author: tomas - */ - -#include "RRGAlgebraic.h" - -using namespace alphabet; -using namespace grammar; -using namespace regexp; - -namespace conversions -{ - -RRGAlgebraic::RRGAlgebraic( const RightRegularGrammar & rrg ) : m_grammar( rrg ) -{ - -} - -RRGAlgebraic::~RRGAlgebraic( void ) -{ - -} - -RegExp RRGAlgebraic::convert( void ) -{ - RightRegularEquationSolver solver; - - for( const auto & symb : m_grammar.getNonTerminalSymbols( ) ) - solver.addSymbol( symb ); - - for( const auto & rule : m_grammar.getRules( ) ) - { - const Symbol & leftSide = rule.getLeftSide( ).front( ); - if( rule.getRightSide( ).size( ) == 0 ) - { - solver.addEquation( leftSide, new RegExpEpsilon( ) ); - } - else if( rule.getRightSide( ).size( ) == 1 ) - { - const Symbol & input = rule.getRightSide( ).front( ); - solver.addEquation( leftSide, new RegExpSymbol( input.getSymbol( ) ) ); - } - else - { - const Symbol input = rule.getRightSide( ).front( ); - const Symbol nt = rule.getRightSide( ).back( ); - solver.addEquation( leftSide, nt, new RegExpSymbol( input.getSymbol( ) ) ); - } - } - - return solver.solve( m_grammar.getStartSymbol( ) ); -} - -} /* namespace conversions */ diff --git a/aconversions/src/rg2re/rrg2re/RRGAlgebraic.h b/aconversions/src/rg2re/rrg2re/RRGAlgebraic.h deleted file mode 100644 index 3b6f663a46..0000000000 --- a/aconversions/src/rg2re/rrg2re/RRGAlgebraic.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * RRGAlgebraic.h - * - * Created on: 4. 3. 2014 - * Author: tomas - */ - -#ifndef RRGALGEBRAIC_H_ -#define RRGALGEBRAIC_H_ - -#include <grammar/Regular/RightRegularGrammar.h> -#include <regexp/RegExp.h> - -#include "../../shared/equations/RightRegularEquationSolver.h" -#include "../../interface/IConversionRE.h" - -namespace conversions -{ - -class RRGAlgebraic: public IConversionRE -{ -public: - /** - * @param rg Source right regular grammar. - */ - RRGAlgebraic( const grammar::RightRegularGrammar & rg ); - - ~RRGAlgebraic( void ); - - /** - * @return regexp equivalent to source right regular grammar. - */ - regexp::RegExp convert( void ); - -protected: - /** - * input grammar - */ - const grammar::RightRegularGrammar & m_grammar; -}; - -} /* namespace conversions */ - -#endif /* RRGALGEBRAIC_H_ */ diff --git a/aconversions2/src/ConversionHandler.cpp b/aconversions2/src/ConversionHandler.cpp index 654200e390..09075ac943 100644 --- a/aconversions2/src/ConversionHandler.cpp +++ b/aconversions2/src/ConversionHandler.cpp @@ -21,8 +21,7 @@ #include "conversions/rg2fa/lrg2fa/LRGtoFAConverter.h" #include "conversions/rg2fa/rrg2fa/RRGtoFAConverter.h" -//#include "conversions/rg2re/rrg2re/RRGAlgebraic.h" -//#include "conversions/rg2re/lrg2re/LRGAlgebraic.h" +#include "conversions/rg2re/RGtoREAlgebraic.h" #include "conversions/re2rg/re2rrg/GlushkovRRG.h" #include "conversions/re2rg/re2rrg/BrzozowskiDerivationRRG.h" @@ -287,16 +286,15 @@ void ConversionHandler::convertRGtoRG( void ) void ConversionHandler::convertRGtoRE( void ) { - if( m_source == LEFT_REGULAR_GRAMMAR ) - convertLRGtoRE( ); - else if( m_source == RIGHT_REGULAR_GRAMMAR ) - convertRRGtoRE( ); - else if( m_source == LEFT_LINEAR_GRAMMAR ) - throw exception::AlibException( "ConversionHandler: Conversions from linear grammars are not yet implemented." ); - else if( m_source == RIGHT_LINEAR_GRAMMAR ) - throw exception::AlibException( "ConversionHandler: Conversions from linear grammars are not yet implemented." ); - else - throw exception::AlibException( "ConversionHandler: Unknown target formalism." ); + const grammar::Grammar grammar = alib::DataFactory::fromTokens<grammar::Grammar>(m_tokens); + + switch( m_algorithm ) + { + case BRZOZOWSKI_ALGEBRAIC: + default: + alib::DataFactory::toStdout(rg2re::RGtoREAlgebraic::convert(grammar)); + break; + } } void ConversionHandler::convertLRGtoFSM( void ) @@ -327,38 +325,6 @@ void ConversionHandler::convertRRGtoFSM( void ) } } -void ConversionHandler::convertLRGtoRE( void ) -{ - const grammar::LeftRG lrg = alib::DataFactory::fromTokens<grammar::LeftRG>( m_tokens ); - - switch( m_algorithm ) - { - case BRZOZOWSKI_ALGEBRAIC: - default: { -/* lrg2re::LRGAlgebraic conv( lrg ); - regexp::UnboundedRegExp regexp = conv.convert(); - alib::DataFactory::toStdout(regexp);*/ - break; - } - } -} - -void ConversionHandler::convertRRGtoRE( void ) -{ - const grammar::RightRG rrg = alib::DataFactory::fromTokens<grammar::RightRG>( m_tokens ); - - switch( m_algorithm ) - { - case BRZOZOWSKI_ALGEBRAIC: - default: { -/* rrg2re::RRGAlgebraic conv( rrg ); - regexp::UnboundedRegExp regexp = conv.convert(); - alib::DataFactory::toStdout(regexp);*/ - break; - } - } -} - void ConversionHandler::convertLRGtoRRG( void ) { const grammar::LeftRG lrg = alib::DataFactory::fromTokens<grammar::LeftRG>( m_tokens ); diff --git a/alib2algo/src/conversions/rg2re/RGtoREAlgebraic.cpp b/alib2algo/src/conversions/rg2re/RGtoREAlgebraic.cpp new file mode 100644 index 0000000000..041d78ef61 --- /dev/null +++ b/alib2algo/src/conversions/rg2re/RGtoREAlgebraic.cpp @@ -0,0 +1,162 @@ +/* + * RGtoREAlgebraic.cpp + * + * Created on: 4. 3. 2014 + * Author: Tomas Pecka + */ + +#include "RGtoREAlgebraic.h" + +#include "../../equations/LeftRegularEquationSolver.h" +#include "../../equations/RightRegularEquationSolver.h" + +#include <regexp/unbounded/UnboundedRegExpElements.h> + +namespace rg2re +{ + +regexp::RegExp RGtoREAlgebraic::convert(const grammar::Grammar& grammar) +{ + regexp::RegExp* out = NULL; + grammar.getData().Accept((void*) &out, RGtoREAlgebraic::RG_TO_RE_ALGEBRAIC); + regexp::RegExp res = std::move(*out); + delete out; + return res; +} + +regexp::RegExp RGtoREAlgebraic::convert(const grammar::LeftRG& grammar) +{ + equations::LeftRegularEquationSolver solver; + + for(const auto& symbol : grammar.getNonterminalAlphabet()) + solver.addSymbol(symbol); + + for(const auto & rule : grammar.getRules()) + { + const alphabet::Symbol& lhs = rule.first; + + for(const auto& ruleRHS : rule.second) + { + if(ruleRHS.is<alphabet::Symbol>()) + { + const alphabet::Symbol& rhs = ruleRHS.get<alphabet::Symbol>(); + solver.addEquation(lhs, regexp::UnboundedRegExpSymbol(rhs)); + } + else + { + const std::pair<alphabet::Symbol, alphabet::Symbol>& rhs = ruleRHS.get<std::pair<alphabet::Symbol, alphabet::Symbol>>(); + solver.addEquation(lhs, rhs.first, regexp::UnboundedRegExpSymbol(rhs.second)); + } + } + } + if(grammar.getGeneratesEpsilon()) + solver.addEquation(grammar.getInitialSymbol(), regexp::UnboundedRegExpEpsilon()); + + return regexp::RegExp{solver.solve(grammar.getInitialSymbol())}; +} +regexp::RegExp RGtoREAlgebraic::convert(const grammar::RightRG& grammar) +{ + equations::RightRegularEquationSolver solver; + + for(const auto& symbol : grammar.getNonterminalAlphabet()) + solver.addSymbol(symbol); + + for(const auto & rule : grammar.getRules()) + { + const alphabet::Symbol& lhs = rule.first; + + for(const auto& ruleRHS : rule.second) + { + if(ruleRHS.is<alphabet::Symbol>()) + { + const alphabet::Symbol& rhs = ruleRHS.get<alphabet::Symbol>(); + solver.addEquation(lhs, regexp::UnboundedRegExpSymbol(rhs)); + } + else + { + const std::pair<alphabet::Symbol, alphabet::Symbol>& rhs = ruleRHS.get<std::pair<alphabet::Symbol, alphabet::Symbol>>(); + solver.addEquation(lhs, rhs.second, regexp::UnboundedRegExpSymbol(rhs.first)); + } + } + } + if(grammar.getGeneratesEpsilon()) + solver.addEquation(grammar.getInitialSymbol(), regexp::UnboundedRegExpEpsilon()); + + return regexp::RegExp{solver.solve(grammar.getInitialSymbol())}; +} + +void RGtoREAlgebraic::Visit(void*, const grammar::UnknownGrammar&) const +{ + throw exception::AlibException("Unsupported grammar type UnknownGrammar"); +} + +void RGtoREAlgebraic::Visit(void*, const grammar::ContextPreservingUnrestrictedGrammar&) const +{ + throw exception::AlibException("Unsupported grammar type ContextPreservingUnrestrictedGrammar"); +} + +void RGtoREAlgebraic::Visit(void*, const grammar::UnrestrictedGrammar&) const +{ + throw exception::AlibException("Unsupported grammar type UnrestrictedGrammar"); +} + +void RGtoREAlgebraic::Visit(void*, const grammar::CSG&) const +{ + throw exception::AlibException("Unsupported grammar type CSG"); +} + +void RGtoREAlgebraic::Visit(void*, const grammar::NonContractingGrammar&) const +{ + throw exception::AlibException("Unsupported grammar type NonContractingGrammar"); +} + +void RGtoREAlgebraic::Visit(void*, const grammar::CNF&) const +{ + throw exception::AlibException("Unsupported grammar type CNF"); +} + +void RGtoREAlgebraic::Visit(void*, const grammar::CFG&) const +{ + throw exception::AlibException("Unsupported grammar type CFG"); +} + +void RGtoREAlgebraic::Visit(void*, const grammar::EpsilonFreeCFG&) const +{ + throw exception::AlibException("Unsupported grammar type EpsilonFreeCFG"); +} + +void RGtoREAlgebraic::Visit(void*, const grammar::GNF&) const +{ + throw exception::AlibException("Unsupported grammar type GNF"); +} + +void RGtoREAlgebraic::Visit(void*, const grammar::LG&) const +{ + throw exception::AlibException("Unsupported grammar type LG"); +} + +void RGtoREAlgebraic::Visit(void* userData, const grammar::RightRG& grammar) const +{ + regexp::RegExp* & out = *((regexp::RegExp**) userData); + out = new regexp::RegExp(this->convert(grammar)); +} + +void RGtoREAlgebraic::Visit(void* userData, const grammar::LeftRG& grammar) const +{ + regexp::RegExp* & out = *((regexp::RegExp**) userData); + out = new regexp::RegExp(this->convert(grammar)); +} + +void RGtoREAlgebraic::Visit(void*, const grammar::RightLG&) const +{ + throw exception::AlibException("Unsupported grammar type RightLG"); +} + +void RGtoREAlgebraic::Visit(void*, const grammar::LeftLG&) const +{ + throw exception::AlibException("Unsupported grammar type LeftLG"); +} + +const RGtoREAlgebraic RGtoREAlgebraic::RG_TO_RE_ALGEBRAIC; + +} /* namespace rg2re */ diff --git a/alib2algo/src/conversions/rg2re/RGtoREAlgebraic.h b/alib2algo/src/conversions/rg2re/RGtoREAlgebraic.h new file mode 100644 index 0000000000..142749d1b0 --- /dev/null +++ b/alib2algo/src/conversions/rg2re/RGtoREAlgebraic.h @@ -0,0 +1,57 @@ +/* + * RGtoREAlgebraic.h + * + * Created on: 4. 3. 2014 + * Author: Tomas Pecka + */ + +#ifndef RGTOREALGEBRAIC_H_ +#define RGTOREALGEBRAIC_H_ + +#include <grammar/Grammar.h> +#include <grammar/Regular/RightRG.h> +#include <grammar/Regular/LeftRG.h> + +#include <regexp/RegExp.h> + +namespace rg2re +{ + +class RGtoREAlgebraic : public grammar::VisitableGrammarBase::const_visitor_type +{ +public: + /** + * @return regexp equivalent to source right regular grammar. + * @param grammar Grammar to convert + */ + static regexp::RegExp convert(const grammar::Grammar& grammar); + + static regexp::RegExp convert(const grammar::RightRG& grammar); + static regexp::RegExp convert(const grammar::LeftRG& grammar); + +protected: + void Visit(void*, const grammar::UnknownGrammar& grammar) const; + + void Visit(void*, const grammar::ContextPreservingUnrestrictedGrammar& grammar) const; + void Visit(void*, const grammar::UnrestrictedGrammar& grammar) const; + + void Visit(void*, const grammar::CSG& grammar) const; + void Visit(void*, const grammar::NonContractingGrammar& grammar) const; + + void Visit(void*, const grammar::CNF& grammar) const; + void Visit(void*, const grammar::CFG& grammar) const; + void Visit(void*, const grammar::EpsilonFreeCFG& grammar) const; + void Visit(void*, const grammar::GNF& grammar) const; + void Visit(void*, const grammar::LG& grammar) const; + + void Visit(void*, const grammar::RightRG& grammar) const; + void Visit(void*, const grammar::LeftRG& grammar) const; + void Visit(void*, const grammar::RightLG& grammar) const; + void Visit(void*, const grammar::LeftLG& grammar) const; + + static const RGtoREAlgebraic RG_TO_RE_ALGEBRAIC; +}; + +} /* namespace rg2re */ + +#endif /* RGTOREALGEBRAIC_H_ */ diff --git a/tests.aconversion.sh b/tests.aconversion.sh index 5aa24eda53..f215ef265f 100755 --- a/tests.aconversion.sh +++ b/tests.aconversion.sh @@ -159,30 +159,30 @@ function runTest { ## FA -> RG -> FA ## covers: FA -> LRG, FA -> RRG, RRG <-> LRG, RRG -> FA, LRG -> FA -runTest "./aconversions2 -t RRG | ./aconversions2 -t LRG | ./aconversions2 -t FA" -runTest "./aconversions2 -t LRG | ./aconversions2 -t RRG | ./aconversions2 -t FA" - -# FA -> RE -> FA -# covers: FA -> RE (Brzozowski algebraic, elimination), RE -> FA (Brzozowski derivation, Thompson, Glushkov) -runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t FA -a brzozowski" -runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t FA -a thompson" -runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t FA -a glushkov " -runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t FA -a brzozowski" -runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t FA -a thompson" -runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t FA -a glushkov" - -# FA -> RE -> RRG -> LRG -> FA -# covers: FA -> RE (Brz. algebraic, elimination), RE -> RRG ( Brz. derivation, Glushkov), RRG -> LRG, LRG -> FA -runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t RRG -a brzozowski | ./aconversions2 -t LRG | ./aconversions2 -t FA" -runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t RRG -a glushkov | ./aconversions2 -t LRG | ./aconversions2 -t FA" -runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t RRG -a brzozowski | ./aconversions2 -t LRG | ./aconversions2 -t FA" -runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t RRG -a glushkov | ./aconversions2 -t LRG | ./aconversions2 -t FA" +#runTest "./aconversions2 -t RRG | ./aconversions2 -t LRG | ./aconversions2 -t FA" +#runTest "./aconversions2 -t LRG | ./aconversions2 -t RRG | ./aconversions2 -t FA" +# +## FA -> RE -> FA +## covers: FA -> RE (Brzozowski algebraic, elimination), RE -> FA (Brzozowski derivation, Thompson, Glushkov) +#runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t FA -a brzozowski" +#runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t FA -a thompson" +#runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t FA -a glushkov " +#runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t FA -a brzozowski" +#runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t FA -a thompson" +#runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t FA -a glushkov" +# +## FA -> RE -> RRG -> LRG -> FA +## covers: FA -> RE (Brz. algebraic, elimination), RE -> RRG ( Brz. derivation, Glushkov), RRG -> LRG, LRG -> FA +#runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t RRG -a brzozowski | ./aconversions2 -t LRG | ./aconversions2 -t FA" +#runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t RRG -a glushkov | ./aconversions2 -t LRG | ./aconversions2 -t FA" +#runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t RRG -a brzozowski | ./aconversions2 -t LRG | ./aconversions2 -t FA" +#runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t RRG -a glushkov | ./aconversions2 -t LRG | ./aconversions2 -t FA" # FA -> RRG -> RE -> FA # covers: FA -> RRG, FA -> LRG, RRG -> RE, LRG -> RE, RE -> FA (Brz. derivation, Thompson, Glushkov) -# runTest "./aconversions2 -t RRG | ./aconversions2 -t RE | ./aconversion2 -t FA -a brzozowski" -# runTest "./aconversions2 -t LRG | ./aconversions2 -t RE | ./aconversion2 -t FA -a brzozowski" -# runTest "./aconversions2 -t RRG | ./aconversions2 -t RE | ./aconversion2 -t FA -a thompson" -# runTest "./aconversions2 -t LRG | ./aconversions2 -t RE | ./aconversion2 -t FA -a thompson" -# runTest "./aconversions2 -t RRG | ./aconversions2 -t RE | ./aconversion2 -t FA -a glushkov" -# runTest "./aconversions2 -t LRG | ./aconversions2 -t RE | ./aconversion2 -t FA -a glushkov" +runTest "./aconversions2 -t RRG | ./aconversions2 -t RE | ./aconversions2 -t FA -a brzozowski" +runTest "./aconversions2 -t LRG | ./aconversions2 -t RE | ./aconversions2 -t FA -a brzozowski" +runTest "./aconversions2 -t RRG | ./aconversions2 -t RE | ./aconversions2 -t FA -a thompson" +runTest "./aconversions2 -t LRG | ./aconversions2 -t RE | ./aconversions2 -t FA -a thompson" +runTest "./aconversions2 -t RRG | ./aconversions2 -t RE | ./aconversions2 -t FA -a glushkov" +runTest "./aconversions2 -t LRG | ./aconversions2 -t RE | ./aconversions2 -t FA -a glushkov" -- GitLab