diff --git a/aconversions/makefile b/aconversions/makefile deleted file mode 100644 index fe10f923049b7f5191f9a408e8acca9a591d1fa5..0000000000000000000000000000000000000000 --- 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 735e2299484b0c9ff8d72ec4e4910c95c740d83e..0000000000000000000000000000000000000000 --- 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 dcd2a5b53884c4d41f7a6ba16d6bc5d69203cb6c..0000000000000000000000000000000000000000 --- 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 3d8036596167e1018fe160f01703563afa7aa5f0..0000000000000000000000000000000000000000 --- 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 261d6827327e181201f014ffddaaaba708f9ec6d..0000000000000000000000000000000000000000 --- 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 62ac23c4046530c45ded7dfab67121d761fc79bc..0000000000000000000000000000000000000000 --- 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 47f03aec8887c3661a28c6e0a0af05d0d45bbf16..0000000000000000000000000000000000000000 --- 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 f3e56bbe87f86d92833c9d5f2f8c17cfcb8c764e..0000000000000000000000000000000000000000 --- 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 03c3c4c1ec2de89ad9b07c8294a712f5a099602d..0000000000000000000000000000000000000000 --- 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 70658fa3f5a83b982290a405584b7d0f8ce85cb6..0000000000000000000000000000000000000000 --- 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 b358409101151b2a696b0084aab822bd018d47d5..0000000000000000000000000000000000000000 --- 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 40a5382747979938b1886c75ae9cd8f0648c2f5f..0000000000000000000000000000000000000000 --- 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 b4fed3c3e3d470493fed1207a60442eb1a84e501..0000000000000000000000000000000000000000 --- 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 dcd36c4425ecf42eeb0efe6ac85540c10fe7edc1..0000000000000000000000000000000000000000 --- 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 a1060197ca78d77d7cbf1ac78b2ea62b15f6a0c4..0000000000000000000000000000000000000000 --- 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 3b6f663a468bf739628472ca84ea5e4ac07fcfaa..0000000000000000000000000000000000000000 --- 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 654200e390c5e53e9131353d60bdcead9e980ddc..09075ac94351bd3b8ed7c39f808f2acff3e9cfb9 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 0000000000000000000000000000000000000000..041d78ef61d5d9f38478a952c329d8047d2a4dc7 --- /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 0000000000000000000000000000000000000000..142749d1b0c9625e45b8c515235b997fdb957b14 --- /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 5aa24eda5310056ef9a740cdee8aadeb9bb27afd..f215ef265f05b5aecaba6eb347aa8296abd31703 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"