diff --git a/aconversions/.cproject b/aconversions/.cproject index 73f91e809013fa33a703b459fa11166e20990fc9..2234d0ce3bb06130e69f82b9cb518011f701ce95 100644 --- a/aconversions/.cproject +++ b/aconversions/.cproject @@ -106,120 +106,6 @@ </storageModule> <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> </cconfiguration> - <cconfiguration id="cdt.managedbuild.config.gnu.exe.debug.923996745.1323144502"> - <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.debug.923996745.1323144502" moduleId="org.eclipse.cdt.core.settings" name="Debug.fa2rg"> - <externalSettings/> - <extensions> - <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> - <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> - <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> - <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> - <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> - <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> - </extensions> - </storageModule> - <storageModule moduleId="cdtBuildSystem" version="4.0.0"> - <configuration artifactName="${ProjName}.fa2rg" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.exe.debug.923996745.1323144502" name="Debug.fa2rg" parent="cdt.managedbuild.config.gnu.exe.debug"> - <folderInfo id="cdt.managedbuild.config.gnu.exe.debug.923996745.1323144502." name="/" resourcePath=""> - <toolChain id="cdt.managedbuild.toolchain.gnu.exe.debug.604421374" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.debug"> - <targetPlatform id="cdt.managedbuild.target.gnu.platform.exe.debug.171217329" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.debug"/> - <builder buildPath="${workspace_loc:/aconversions}/Debug" id="cdt.managedbuild.target.gnu.builder.exe.debug.911360895" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.exe.debug"/> - <tool id="cdt.managedbuild.tool.gnu.archiver.base.1147345420" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/> - <tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.697878346" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug"> - <option id="gnu.cpp.compiler.exe.debug.option.optimization.level.1741428562" name="Optimization Level" superClass="gnu.cpp.compiler.exe.debug.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/> - <option id="gnu.cpp.compiler.exe.debug.option.debugging.level.1335381260" name="Debug Level" superClass="gnu.cpp.compiler.exe.debug.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/> - <option id="gnu.cpp.compiler.option.include.paths.496289937" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath"> - <listOptionValue builtIn="false" value=""${workspace_loc:/alib/src}""/> - </option> - <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.2039472493" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/> - </tool> - <tool id="cdt.managedbuild.tool.gnu.c.compiler.exe.debug.680760064" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.exe.debug"> - <option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.exe.debug.option.optimization.level.1351058005" name="Optimization Level" superClass="gnu.c.compiler.exe.debug.option.optimization.level" valueType="enumerated"/> - <option id="gnu.c.compiler.exe.debug.option.debugging.level.1785101381" name="Debug Level" superClass="gnu.c.compiler.exe.debug.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/> - <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1511241353" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/> - </tool> - <tool id="cdt.managedbuild.tool.gnu.c.linker.exe.debug.485379647" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.debug"/> - <tool id="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug.1697144078" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug"> - <option id="gnu.cpp.link.option.libs.1211237825" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs"> - <listOptionValue builtIn="false" value="alib"/> - </option> - <option id="gnu.cpp.link.option.paths.886643827" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" valueType="libPaths"> - <listOptionValue builtIn="false" value=""${workspace_loc:/alib/Debug}""/> - </option> - <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1604949990" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input"> - <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> - <additionalInput kind="additionalinput" paths="$(LIBS)"/> - </inputType> - </tool> - <tool id="cdt.managedbuild.tool.gnu.assembler.exe.debug.75667575" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.exe.debug"> - <inputType id="cdt.managedbuild.tool.gnu.assembler.input.46006703" superClass="cdt.managedbuild.tool.gnu.assembler.input"/> - </tool> - </toolChain> - </folderInfo> - <sourceEntries> - <entry excluding="src/arg2fa.cpp" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/> - </sourceEntries> - </configuration> - </storageModule> - <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> - </cconfiguration> - <cconfiguration id="cdt.managedbuild.config.gnu.exe.debug.923996745.1323144502.51455777"> - <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.debug.923996745.1323144502.51455777" moduleId="org.eclipse.cdt.core.settings" name="Debug.rg2fa"> - <externalSettings/> - <extensions> - <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> - <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> - <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> - <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> - <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> - <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> - </extensions> - </storageModule> - <storageModule moduleId="cdtBuildSystem" version="4.0.0"> - <configuration artifactName="${ProjName}.rg2fa" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.exe.debug.923996745.1323144502.51455777" name="Debug.rg2fa" parent="cdt.managedbuild.config.gnu.exe.debug"> - <folderInfo id="cdt.managedbuild.config.gnu.exe.debug.923996745.1323144502.51455777." name="/" resourcePath=""> - <toolChain id="cdt.managedbuild.toolchain.gnu.exe.debug.1133348873" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.debug"> - <targetPlatform id="cdt.managedbuild.target.gnu.platform.exe.debug.1196604066" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.debug"/> - <builder buildPath="${workspace_loc:/aconversions}/Debug" id="cdt.managedbuild.target.gnu.builder.exe.debug.439014923" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.exe.debug"/> - <tool id="cdt.managedbuild.tool.gnu.archiver.base.756579878" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/> - <tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.713036044" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug"> - <option id="gnu.cpp.compiler.exe.debug.option.optimization.level.1350961549" name="Optimization Level" superClass="gnu.cpp.compiler.exe.debug.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/> - <option id="gnu.cpp.compiler.exe.debug.option.debugging.level.1494984597" name="Debug Level" superClass="gnu.cpp.compiler.exe.debug.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/> - <option id="gnu.cpp.compiler.option.include.paths.206435288" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath"> - <listOptionValue builtIn="false" value=""${workspace_loc:/alib/src}""/> - </option> - <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1867628733" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/> - </tool> - <tool id="cdt.managedbuild.tool.gnu.c.compiler.exe.debug.1967537471" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.exe.debug"> - <option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.exe.debug.option.optimization.level.828706130" name="Optimization Level" superClass="gnu.c.compiler.exe.debug.option.optimization.level" valueType="enumerated"/> - <option id="gnu.c.compiler.exe.debug.option.debugging.level.1020112809" name="Debug Level" superClass="gnu.c.compiler.exe.debug.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/> - <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1626369872" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/> - </tool> - <tool id="cdt.managedbuild.tool.gnu.c.linker.exe.debug.722161002" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.debug"/> - <tool id="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug.63113387" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug"> - <option id="gnu.cpp.link.option.libs.937989636" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs"> - <listOptionValue builtIn="false" value="alib"/> - </option> - <option id="gnu.cpp.link.option.paths.1969989980" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" valueType="libPaths"> - <listOptionValue builtIn="false" value=""${workspace_loc:/alib/Debug}""/> - </option> - <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1981097053" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input"> - <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> - <additionalInput kind="additionalinput" paths="$(LIBS)"/> - </inputType> - </tool> - <tool id="cdt.managedbuild.tool.gnu.assembler.exe.debug.1320459224" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.exe.debug"> - <inputType id="cdt.managedbuild.tool.gnu.assembler.input.611263798" superClass="cdt.managedbuild.tool.gnu.assembler.input"/> - </tool> - </toolChain> - </folderInfo> - <sourceEntries> - <entry excluding="src/afa2rg.cpp" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/> - </sourceEntries> - </configuration> - </storageModule> - <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> - </cconfiguration> </storageModule> <storageModule moduleId="cdtBuildSystem" version="4.0.0"> <project id="aconversions.cdt.managedbuild.target.gnu.exe.752321215" name="Executable" projectType="cdt.managedbuild.target.gnu.exe"/> @@ -244,6 +130,8 @@ <configuration configurationName="Release"> <resource resourceType="PROJECT" workspacePath="/aconversions"/> </configuration> + <configuration configurationName="Debug.rg2fa"/> + <configuration configurationName="Debug.fa2rg"/> <configuration configurationName="Debug"> <resource resourceType="PROJECT" workspacePath="/aconversions"/> </configuration> diff --git a/aconversions/Makefile b/aconversions/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..e914767b00fd005fb0244ed3003643a5ce694864 --- /dev/null +++ b/aconversions/Makefile @@ -0,0 +1,16 @@ +OUT_DIR = bin +export ALIB_SRC = $(realpath ../alib/src) +export ALIB_LIB = $(realpath ../alib/Debug) +export BIN_DIR = $(addsuffix /$(OUT_DIR), $(realpath .)) + +.PHONY: clean + +all: + @mkdir -p $(OUT_DIR) + @$(MAKE) -C src/conversions + +clean: + @echo "[Clean] Cleaning up" + @$(MAKE) -C src/conversions clean + @rm -f $(OUT_DIR)/* + @rm -rf $(OUT_DIR) \ No newline at end of file diff --git a/aconversions/src/afa2rg.cpp b/aconversions/src/afa2rg.cpp deleted file mode 100644 index e47f394408daf90d11d40eb893d0c1d9a4834a70..0000000000000000000000000000000000000000 --- a/aconversions/src/afa2rg.cpp +++ /dev/null @@ -1,47 +0,0 @@ -//============================================================================ -// Name : afsm2rg.cpp -// Author : Tomas Pecka -// Version : -// Copyright : -// Description : -//============================================================================ - -#include <iostream> - -#include <AlibException.h> -#include <AutomatonFactory.h> -#include <grammar/GrammarPrinter.h> -#include <grammar/RightRegularGrammar.h> - -#include "conversions/fa2rg/fa2rg.h" - -using namespace std; -using namespace automaton; -using namespace grammar; -using namespace alib; - -int main(int argc, char** argv) -{ - try - { - string input( istreambuf_iterator<char>(cin), ( istreambuf_iterator<char>( ) ) ); - - FSM fsm = AutomatonFactory::buildFSM( AutomatonFactory::fromString( input ) ); - - if( ! fsm.isEpsilonFree() ) - { - cout << "FSM has epsilon transitions" << endl; - return 1; - } - - RightRegularGrammar rg = FA2RGconvert::convert( fsm ); - GrammarPrinter::toXML( rg, cout ); - } - catch (AlibException& e) - { - cout << e.what() << endl; - return 1; - } - - return 0; -} diff --git a/aconversions/src/conversions/Makefile b/aconversions/src/conversions/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..0b61d66a9b40dbfc35d42a01b00f651a500d21eb --- /dev/null +++ b/aconversions/src/conversions/Makefile @@ -0,0 +1,23 @@ +export CXX=g++ +export CXXFLAGS=-O3 -std=c++11 -c -Wall -pedantic -I/usr/include/libxml2 -I$(ALIB_SRC) +export LD=g++ +export LDFLAGS=-L$(ALIB_LIB) -lalib +EXECUTABLE= + +CONVERSIONS_DIRS = fa2re fa2rg re2fa re2rg rg2fa rg2re + +.PHONY: clean $(CONVERSIONS_DIRS) + + +all: $(CONVERSIONS_DIRS) + +$(CONVERSIONS_DIRS): + @$(MAKE) -C $@ + +clean: + @$(MAKE) -C fa2rg/ clean + @$(MAKE) -C fa2re/ clean + @$(MAKE) -C re2fa/ clean + @$(MAKE) -C re2rg/ clean + @$(MAKE) -C rg2fa/ clean + @$(MAKE) -C rg2re/ clean \ No newline at end of file diff --git a/aconversions/src/conversions/fa2re/Makefile b/aconversions/src/conversions/fa2re/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..dcec28795b214f7e77bc9fbfced74e615176aaa0 --- /dev/null +++ b/aconversions/src/conversions/fa2re/Makefile @@ -0,0 +1,5 @@ +all: + +.PHONY: clean +clean: + rm -f *.o diff --git a/aconversions/src/conversions/fa2rg/AbstractFAtoRGConverter.cpp b/aconversions/src/conversions/fa2rg/AbstractFAtoRGConverter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..59bbe64dc3f28c7729d5516f3f187ff38b485221 --- /dev/null +++ b/aconversions/src/conversions/fa2rg/AbstractFAtoRGConverter.cpp @@ -0,0 +1,32 @@ +#include "AbstractFAtoRGConverter.h" + +using namespace automaton; +using namespace grammar; + +namespace conversions +{ + +AbstractFAtoRGConverter::AbstractFAtoRGConverter( const FSM & automaton, RegularGrammar * grammar) : m_automaton( automaton ), m_g( grammar ) +{ + if( ! m_automaton.isEpsilonFree( ) ) + throw ConversionException( "FSM has epsilon transitions" ); +} + +AbstractFAtoRGConverter::~AbstractFAtoRGConverter( void ) +{ + +} + +void AbstractFAtoRGConverter::createTerminalSymbols( void ) +{ + for( std::set<Symbol>::const_iterator i = m_automaton.getInputAlphabet( ).begin( ); i != m_automaton.getInputAlphabet( ).end( ); i++ ) + m_g->addTerminalSymbol( *i ); +} + +void AbstractFAtoRGConverter::createNonTerminalSymbols( void ) +{ + for( std::set<automaton::State>::const_iterator i = m_automaton.getStates( ).begin( ); i != m_automaton.getStates( ).end( ); i++ ) + m_g->addNonTerminalSymbol( alphabet::Symbol( i->getName( ) ) ); +} + +} /* namespace conversions */ diff --git a/aconversions/src/conversions/fa2rg/AbstractFAtoRGConverter.h b/aconversions/src/conversions/fa2rg/AbstractFAtoRGConverter.h new file mode 100644 index 0000000000000000000000000000000000000000..66e6e95e6d6be798e4370e58a88155ee62e272d1 --- /dev/null +++ b/aconversions/src/conversions/fa2rg/AbstractFAtoRGConverter.h @@ -0,0 +1,30 @@ +#ifndef __ABSTRACTFATORGCONVERTER_H__ +#define __ABSTRACTFATORGCONVERTER_H__ + +#include <automaton/FSM/FSM.h> +#include <grammar/RegularGrammar.h> +#include <memory> + +#include "../../utils/ConversionException.h" + +namespace conversions +{ + +class AbstractFAtoRGConverter +{ +public: + virtual const grammar::RegularGrammar & convert( ) = 0; + +protected: + AbstractFAtoRGConverter( const automaton::FSM & automaton, grammar::RegularGrammar * grammar ); + virtual ~AbstractFAtoRGConverter( void ); + void createNonTerminalSymbols( void ); + void createTerminalSymbols( void ); + + const automaton::FSM & m_automaton; + grammar::RegularGrammar * m_g; +}; + +} /* namespace conversions */ + +#endif /* __ABSTRACTFATORGCONVERTER_H__ */ diff --git a/aconversions/src/conversions/fa2rg/FAtoLRGConverter.cpp b/aconversions/src/conversions/fa2rg/FAtoLRGConverter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ca30840962a50b3dea015d571b23f6fe5fe6e466 --- /dev/null +++ b/aconversions/src/conversions/fa2rg/FAtoLRGConverter.cpp @@ -0,0 +1,45 @@ +#include "FAtoLRGConverter.h" + +using namespace std; +using namespace automaton; +using namespace grammar; + +namespace conversions +{ + +FAtoLRGConverter::FAtoLRGConverter( const FSM & automaton ) : AbstractFAtoRGConverter( automaton, new LeftRegularGrammar() ), m_grammar(* dynamic_cast<LeftRegularGrammar*>( m_g )) +{ +} + +const LeftRegularGrammar & FAtoLRGConverter::convert( void ) +{ + createTerminalSymbols( ); + createNonTerminalSymbols( ); + + // step 2 - create set of P in G + for( set<TransitionFSM>::const_iterator i = m_automaton.getTransitions( ).begin( ); i != m_automaton.getTransitions( ).end( ); i++ ) + { + // 2a + list<Symbol> leftSide, rightSide; + leftSide.push_back( Symbol( i->getTo( ).getName( ) ) ); + rightSide.push_back( Symbol( i->getFrom( ).getName( ) ) ); + rightSide.push_back( Symbol( i->getInput( ).getSymbol( ) ) ); + m_grammar.addRule( Rule( leftSide, rightSide ) ); + + // 2b + if( isInSet( i->getTo( ), m_automaton.getFinalStates( ) ) ) + { + list<Symbol> leftSide, rightSide; + leftSide.push_back( Symbol( i->getFrom( ).getName( ) ) ); + rightSide.push_back( Symbol( i->getInput( ).getSymbol( ) ) ); + Rule r( leftSide, rightSide ); + m_grammar.addRule( r ); + } + } + + // step 3 + m_grammar.setStartSymbol( Symbol( m_automaton.getInitialStates( ).begin( )->getName( ) ) ); + + return m_grammar; +} +} /* namespace conversions */ diff --git a/aconversions/src/conversions/fa2rg/FAtoLRGConverter.h b/aconversions/src/conversions/fa2rg/FAtoLRGConverter.h new file mode 100644 index 0000000000000000000000000000000000000000..2cbcc479a835f995b7f7bad4425d11b81da6cfa3 --- /dev/null +++ b/aconversions/src/conversions/fa2rg/FAtoLRGConverter.h @@ -0,0 +1,25 @@ +#ifndef __FATOLRGCONVERTER_H__ +#define __FATOLRGCONVERTER_H__ + +#include "AbstractFAtoRGConverter.h" +#include <grammar/LeftRegularGrammar.h> +#include <automaton/FSM/FSM.h> + +#include "../../utils/GrammarUtils.h" + +namespace conversions +{ + +class FAtoLRGConverter: public AbstractFAtoRGConverter +{ +public: + FAtoLRGConverter( const automaton::FSM & automaton ); + const grammar::LeftRegularGrammar & convert( ); + +protected: + grammar::LeftRegularGrammar& m_grammar; +}; + +} /* namespace conversions */ + +#endif /* __FATOLRGCONVERTER_H__ */ diff --git a/aconversions/src/conversions/fa2rg/FAtoRRGConverter.cpp b/aconversions/src/conversions/fa2rg/FAtoRRGConverter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..22f4ac7198a88693e26901e943df71d27bbf2558 --- /dev/null +++ b/aconversions/src/conversions/fa2rg/FAtoRRGConverter.cpp @@ -0,0 +1,78 @@ +#include "FAtoRRGConverter.h" + +using namespace std; +using namespace automaton; +using namespace grammar; + +namespace conversions +{ + +FAtoRRGConverter::FAtoRRGConverter( const FSM & automaton ) : AbstractFAtoRGConverter( automaton, new RightRegularGrammar() ), m_grammar(* dynamic_cast<RightRegularGrammar*>( m_g )) +{ +} + +const grammar::RightRegularGrammar & FAtoRRGConverter::convert( void ) +{ + createTerminalSymbols( ); + createNonTerminalSymbols( ); + + // step 2 - create set of P in G + for( set<TransitionFSM>::const_iterator i = m_automaton.getTransitions( ).begin( ); i != m_automaton.getTransitions( ).end( ); i++ ) + { + // 2a + list<Symbol> leftSide, rightSide; + leftSide.push_back( Symbol( i->getFrom( ).getName( ) ) ); + rightSide.push_back( Symbol( i->getInput( ).getSymbol( ) ) ); + rightSide.push_back( Symbol( i->getTo( ).getName( ) ) ); + m_grammar.addRule( Rule( leftSide, rightSide ) ); + + // 2b + if( isInSet( i->getTo( ), m_automaton.getFinalStates( ) ) ) + { + list<Symbol> leftSide, rightSide; + leftSide.push_back( Symbol( i->getFrom( ).getName( ) ) ); + rightSide.push_back( Symbol( i->getInput( ).getSymbol( ) ) ); + m_grammar.addRule( Rule( leftSide, rightSide ) ); + } + } + + // step 3 - set start symbol of G + m_grammar.setStartSymbol( Symbol( m_automaton.getInitialStates( ).begin( )->getName( ) ) ); + + // step 4 + if( isInSet( State( m_grammar.getStartSymbol( ).getSymbol( ) ), m_automaton.getFinalStates( ) ) ) + { + // 4a + if( !GrammarUtils::isNonterminalOnRightSide( m_grammar.getStartSymbol( ), m_grammar.getRules( ) ) ) + { + list<Symbol> leftSide, rightSide; + leftSide.push_back( m_grammar.getStartSymbol( ) ); + m_grammar.addRule( Rule( leftSide, rightSide ) ); + } + else // 4b + { + Symbol newStart = GrammarUtils::createUniqueSymbol( m_grammar.getStartSymbol( ).getSymbol( ), m_grammar, APOSTROPHE ); + m_grammar.addNonTerminalSymbol( newStart ); + + for( set<Rule>::const_iterator i = m_grammar.getRules( ).begin( ); i != m_grammar.getRules( ).end( ); i++ ) + { + if( *( i->getLeftSide( ).begin( ) ) == m_grammar.getStartSymbol( ) ) + { + list<Symbol> leftSide, rightSide( i->getRightSide( ) ); + leftSide.push_back( newStart ); + m_grammar.addRule( Rule( leftSide, rightSide ) ); + } + } + m_grammar.setStartSymbol( newStart ); + + list<Symbol> leftSide, rightSide; + leftSide.push_back( newStart ); + Rule rr( leftSide, rightSide ); + m_grammar.addRule( Rule( leftSide, rightSide ) ); + } + } + + return m_grammar; +} + +} /* namespace conversions */ diff --git a/aconversions/src/conversions/fa2rg/FAtoRRGConverter.h b/aconversions/src/conversions/fa2rg/FAtoRRGConverter.h new file mode 100644 index 0000000000000000000000000000000000000000..519166d13483f1ec579a6841fd6ce5a4b8650b00 --- /dev/null +++ b/aconversions/src/conversions/fa2rg/FAtoRRGConverter.h @@ -0,0 +1,25 @@ +#ifndef __FATORRGCONVERTER_H__ +#define __FATORRGCONVERTER_H__ + +#include "AbstractFAtoRGConverter.h" +#include <grammar/RightRegularGrammar.h> +#include <automaton/FSM/FSM.h> + +#include "../../utils/GrammarUtils.h" + +namespace conversions +{ + +class FAtoRRGConverter : public AbstractFAtoRGConverter +{ +public: + FAtoRRGConverter( const automaton::FSM & automaton ); + const grammar::RightRegularGrammar & convert ( ); + +protected: + grammar::RightRegularGrammar& m_grammar; +}; + +} /* namespace conversions */ + +#endif /* __FATORRGCONVERTER_H__ */ diff --git a/aconversions/src/conversions/fa2rg/Makefile b/aconversions/src/conversions/fa2rg/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..e98afebdea58f91af5786ea729d3e893e7bc3dc2 --- /dev/null +++ b/aconversions/src/conversions/fa2rg/Makefile @@ -0,0 +1,47 @@ +all: afa2rg afa2lrg afa2rrg + cp afa2rg $(BIN_DIR) + cp afa2lrg $(BIN_DIR) + cp afa2rrg $(BIN_DIR) + +afa2rg: afa2rg.o + $(LD) $(LDFLAGS) $^ -o afa2rg + +afa2lrg: afa2lrg.o AbstractFAtoRGConverter.o FAtoLRGConverter.o ConversionException.o + $(LD) $(LDFLAGS) $^ -o afa2lrg + +afa2rrg: afa2rrg.o AbstractFAtoRGConverter.o FAtoRRGConverter.o ConversionException.o GrammarUtils.o + $(LD) $(LDFLAGS) $^ -o afa2rrg + + +afa2rg.o: afa2rg.cpp + $(CXX) $(CXXFLAGS) $< -o $@ + +afa2lrg.o: afa2lrg.cpp FAtoLRGConverter.h AbstractFAtoRGConverter.h ../../utils/ConversionException.h ../../utils/GrammarUtils.h ../../utils/utils.h + $(CXX) $(CXXFLAGS) $< -o $@ + +afa2rrg.o: afa2rrg.cpp FAtoRRGConverter.h AbstractFAtoRGConverter.h ../../utils/ConversionException.h ../../utils/GrammarUtils.h ../../utils/utils.h + $(CXX) $(CXXFLAGS) $< -o $@ + +AbstractFAtoRGConverter.o: AbstractFAtoRGConverter.cpp AbstractFAtoRGConverter.h ../../utils/ConversionException.h + $(CXX) $(CXXFLAGS) $< -o $@ + +FAtoLRGConverter.o: FAtoLRGConverter.cpp FAtoLRGConverter.h AbstractFAtoRGConverter.h ../../utils/ConversionException.h ../../utils/GrammarUtils.h ../../utils/utils.h + $(CXX) $(CXXFLAGS) $< -o $@ + +FAtoRRGConverter.o: FAtoRRGConverter.cpp FAtoRRGConverter.h AbstractFAtoRGConverter.h ../../utils/ConversionException.h ../../utils/GrammarUtils.h ../../utils/utils.h + $(CXX) $(CXXFLAGS) $< -o $@ + + +AutomatonUtils.o: ../../utils/AutomatonUtils.cpp ../../utils/AutomatonUtils.h ../../utils/utils.h + $(CXX) $(CXXFLAGS) $< -o $@ + +ConversionException.o: ../../utils/ConversionException.cpp ../../utils/ConversionException.h + $(CXX) $(CXXFLAGS) $< -o $@ + +GrammarUtils.o: ../../utils/GrammarUtils.cpp ../../utils/GrammarUtils.h ../../utils/utils.h + $(CXX) $(CXXFLAGS) $< -o $@ + +.PHONY: clean +clean: + rm -f *.o + rm -f afa2rg afa2lrg afa2rrg \ No newline at end of file diff --git a/aconversions/src/conversions/fa2rg/afa2lrg.cpp b/aconversions/src/conversions/fa2rg/afa2lrg.cpp new file mode 100644 index 0000000000000000000000000000000000000000..59cc82fcc9fbb545a4ede64cf59f92267ede8ee6 --- /dev/null +++ b/aconversions/src/conversions/fa2rg/afa2lrg.cpp @@ -0,0 +1,34 @@ +#include <iostream> + +#include <AlibException.h> +#include <AutomatonFactory.h> +#include <grammar/GrammarPrinter.h> +#include <grammar/RightRegularGrammar.h> + +#include "FAtoLRGConverter.h" + +using namespace std; +using namespace automaton; +using namespace grammar; +using namespace alib; +using namespace conversions; + +int main(int argc, char** argv) +{ + try + { + string input( istreambuf_iterator<char>(cin), ( istreambuf_iterator<char>( ) ) ); + + FSM fsm = AutomatonFactory::buildFSM( AutomatonFactory::fromString( input ) ); + + FAtoLRGConverter conv( fsm ); + GrammarPrinter::toXML( conv.convert(), cout ); + } + catch( AlibException & e ) + { + cout << e.what() << endl; + return 1; + } + + return 0; +} diff --git a/aconversions/src/conversions/fa2rg/afa2rg.cpp b/aconversions/src/conversions/fa2rg/afa2rg.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8d8c3ad38b4e508c782c06cb8c858a9d46bb5ff9 --- /dev/null +++ b/aconversions/src/conversions/fa2rg/afa2rg.cpp @@ -0,0 +1,46 @@ +#include <cstdio> +#include <cstdlib> +#include <getopt.h> +#include <unistd.h> + +int main( int argc, char *argv [ ] ) +{ + int i, option_index = 0; + int left = 0, right = 0; + + static struct option long_options [ ] = + { + { "left", no_argument, NULL, 'l' }, + { "right", no_argument, NULL, 'r' }, + { 0, 0, 0, 0 } + }; + + while( ( i = getopt_long( argc, argv, "lr", long_options, &option_index ) ) != -1 ) + { + switch( i ) + { + case 'l': + left = 1; + break; + case 'r': + right = 1; + break; + } + } + + if( optind != argc - 1 || ( left == 1 && right == 1 ) ) + { + fprintf( stderr, "Usage: afa2rg [--left XOR --right] input\n" ); + return EXIT_FAILURE; + } + else if( left == 1 ) + { + execvp( "afa2lrg", argv + optind ); + return EXIT_SUCCESS; + } + else + { + execvp( "afa2rrg", argv + optind ); + return EXIT_SUCCESS; + } +} diff --git a/aconversions/src/conversions/fa2rg/afa2rrg.cpp b/aconversions/src/conversions/fa2rg/afa2rrg.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0dbf6c105865f5e5c5e75a1d6faa61f7bc95e5ab --- /dev/null +++ b/aconversions/src/conversions/fa2rg/afa2rrg.cpp @@ -0,0 +1,35 @@ +#include <iostream> +#include <memory> + +#include <AlibException.h> +#include <AutomatonFactory.h> +#include <grammar/GrammarPrinter.h> +#include <grammar/RegularGrammar.h> + +#include "FAtoRRGConverter.h" + +using namespace std; +using namespace automaton; +using namespace grammar; +using namespace alib; +using namespace conversions; + +int main(int argc, char** argv) +{ + try + { + string input( istreambuf_iterator<char>(cin), ( istreambuf_iterator<char>( ) ) ); + + FSM fsm = AutomatonFactory::buildFSM( AutomatonFactory::fromString( input ) ); + + FAtoRRGConverter conv( fsm ); + GrammarPrinter::toXML( conv.convert(), cout ); + } + catch( AlibException & e ) + { + cout << e.what() << endl; + return 1; + } + + return 0; +} diff --git a/aconversions/src/conversions/fa2rg/fa2rg.cpp b/aconversions/src/conversions/fa2rg/fa2rg.cpp deleted file mode 100644 index 34da8c2a0f71b21c84b8295a016ab4d10cbc3d30..0000000000000000000000000000000000000000 --- a/aconversions/src/conversions/fa2rg/fa2rg.cpp +++ /dev/null @@ -1,81 +0,0 @@ -#include "fa2rg.h" - -/* - * implements algorithm 2.104 in "[2] Melichar, B. Jazyky a překlady. Praha, Vydavatelstvà ČVUT 2007." - */ - -RightRegularGrammar FA2RGconvert::convert( const FSM & automaton ) -{ - RightRegularGrammar grammar; - - // step 0 - for( set<Symbol>::const_iterator i = automaton.getInputAlphabet().begin(); i != automaton.getInputAlphabet().end(); i++ ) - grammar.addTerminalSymbol( *i ); - - // step 1 - for( set<State>::const_iterator i = automaton.getStates().begin(); i != automaton.getStates().end(); i++) - grammar.addNonTerminalSymbol( Symbol( i->getName() ) ); - - // step 2 - create set of P in G - for( set<TransitionFSM>::const_iterator i = automaton.getTransitions().begin(); i != automaton.getTransitions().end(); i++ ) - { - // 2a - list<Symbol> leftSide, rightSide; - leftSide.push_back ( Symbol( i->getFrom().getName() ) ); - rightSide.push_back( Symbol( i->getInput().getSymbol() ) ); - rightSide.push_back( Symbol( i->getTo().getName() ) ); - Rule r( leftSide, rightSide ); - grammar.addRule(r); - - // 2b - if ( isInSet( i->getTo(), automaton.getFinalStates() ) ) - { - list<Symbol> leftSide, rightSide; - leftSide.push_back( Symbol( i->getFrom().getName() ) ); - rightSide.push_back( Symbol( i->getInput().getSymbol() ) ); - Rule r( leftSide, rightSide ); - grammar.addRule(r); - } - } - - // step 3 - Set S in G - grammar.setStartSymbol( Symbol( automaton.getInitialStates().begin() -> getName() )); - - // step 4 - if ( isInSet( State( grammar.getStartSymbol().getSymbol() ), automaton.getFinalStates() ) ) - { - // 4a - if ( ! GrammarUtils::isNonterminalOnRightSide( grammar.getStartSymbol(), grammar.getRules() ) ) - { - list<Symbol> leftSide, rightSide; - leftSide.push_back( grammar.getStartSymbol() ); - Rule r( leftSide, rightSide ); - grammar.addRule(r); - } - else // 4b - { - Symbol newStart = GrammarUtils::createUniqueSymbol( grammar.getStartSymbol().getSymbol(), grammar, APOSTROPHE ); - grammar.addNonTerminalSymbol( newStart ); - - for( set<Rule>::const_iterator i = grammar.getRules().begin(); i != grammar.getRules().end(); i++ ) - { - if( *(i->getLeftSide().begin()) == grammar.getStartSymbol()) - { - list<Symbol> leftSide, rightSide( i->getRightSide() ); - leftSide.push_back( newStart ); - Rule r( leftSide, rightSide ); - grammar.addRule(r); - } - } - grammar.setStartSymbol( newStart ); - - list<Symbol> leftSide, rightSide; - leftSide.push_back( newStart ); - Rule rr( leftSide, rightSide ); - grammar.addRule(rr); - } - } - - return grammar; -} - diff --git a/aconversions/src/conversions/fa2rg/fa2rg.h b/aconversions/src/conversions/fa2rg/fa2rg.h deleted file mode 100644 index c55fe3eadb818e671a786ad0f33f851df6de968a..0000000000000000000000000000000000000000 --- a/aconversions/src/conversions/fa2rg/fa2rg.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * FSM2RGConvert.h - * - * Created on: 10. 11. 2013 - * Author: Tomas Pecka - */ - -#ifndef FA2RG_CONVERT_H_ -#define FA2RG_CONVERT_H_ - -#include <automaton/FSM/FSM.h> -#include <grammar/RightRegularGrammar.h> - -#include "../../utils/GrammarUtils.h" -#include "../../utils/AutomatonUtils.h" - -using namespace std; -using namespace automaton; -using namespace grammar; - -class FA2RGconvert -{ -public: - static RightRegularGrammar convert( const FSM & automaton ); - -}; - -#endif /* FA2RG_CONVERT_H_ */ diff --git a/aconversions/src/conversions/re2fa/AbstractREtoFAConverter.cpp b/aconversions/src/conversions/re2fa/AbstractREtoFAConverter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..af481d488e637b0c8066bd7fc3173a57a4230c49 --- /dev/null +++ b/aconversions/src/conversions/re2fa/AbstractREtoFAConverter.cpp @@ -0,0 +1,18 @@ +#include "AbstractREtoFAConverter.h" + +using namespace regexp; + +namespace conversions +{ + +AbstractREtoFAConverter::AbstractREtoFAConverter(const RegExp & re ) : m_re(re) +{ + +} + +AbstractREtoFAConverter::~AbstractREtoFAConverter(void) +{ + +} + +} /* namespace conversions */ diff --git a/aconversions/src/conversions/re2fa/AbstractREtoFAConverter.h b/aconversions/src/conversions/re2fa/AbstractREtoFAConverter.h new file mode 100644 index 0000000000000000000000000000000000000000..940f256ad70d9f6c941744679836e309fd0d639d --- /dev/null +++ b/aconversions/src/conversions/re2fa/AbstractREtoFAConverter.h @@ -0,0 +1,25 @@ +#ifndef __ABSTRACTRETOFACONVERTER_H__ +#define __ABSTRACTRETOFACONVERTER_H__ + +#include <regexp/RegExp.h> +#include <automaton/FSM/FSM.h> + +namespace conversions +{ + +class AbstractREtoFAConverter +{ +public: + virtual const automaton::FSM convert( void ) = 0; + +protected: + AbstractREtoFAConverter(const regexp::RegExp & re ); + virtual ~AbstractREtoFAConverter( void ); + + const regexp::RegExp & m_re; + automaton::FSM m_fsm; +}; + +} /* namespace conversions */ + +#endif /* __ABSTRACTRETOFACONVERTER_H__ */ diff --git a/aconversions/src/conversions/re2fa/Brzozowski.cpp b/aconversions/src/conversions/re2fa/Brzozowski.cpp new file mode 100644 index 0000000000000000000000000000000000000000..479ffb37f1e4ebc07237c37254607769d08d679f --- /dev/null +++ b/aconversions/src/conversions/re2fa/Brzozowski.cpp @@ -0,0 +1,13 @@ +/* + * Brzozowski.cpp + * + * Created on: 11. 1. 2014 + * Author: tomas + */ + +#include "Brzozowski.h" + +namespace conversions +{ + +} /* namespace conversions */ diff --git a/aconversions/src/conversions/re2fa/Brzozowski.h b/aconversions/src/conversions/re2fa/Brzozowski.h new file mode 100644 index 0000000000000000000000000000000000000000..cae0c27c9a5ff88d2798256513c16fdc190bcf57 --- /dev/null +++ b/aconversions/src/conversions/re2fa/Brzozowski.h @@ -0,0 +1,25 @@ +/* + * Brzozowski.h + * + * Created on: 11. 1. 2014 + * Author: tomas + */ + +#ifndef BRZOZOWSKI_H_ +#define BRZOZOWSKI_H_ + +#include "AbstractREtoFAConverter.h" + +namespace conversions +{ + +/** + * Converts regular expression to finite automata using Brzozowski algorithm (derivations of regular expressions). + */ +class Brzozowski : public AbstractREtoFAConverter +{ +}; + +} /* namespace conversions */ + +#endif /* BRZOZOWSKI_H_ */ diff --git a/aconversions/src/conversions/re2fa/Glushkov.cpp b/aconversions/src/conversions/re2fa/Glushkov.cpp new file mode 100644 index 0000000000000000000000000000000000000000..be1c514c89b6eaad6f13e348b7810f4e370a726d --- /dev/null +++ b/aconversions/src/conversions/re2fa/Glushkov.cpp @@ -0,0 +1,13 @@ +/* + * Glushkov.cpp + * + * Created on: 11. 1. 2014 + * Author: tomas + */ + +#include "Glushkov.h" + +namespace conversions +{ + +} /* namespace conversions */ diff --git a/aconversions/src/conversions/re2fa/Glushkov.h b/aconversions/src/conversions/re2fa/Glushkov.h new file mode 100644 index 0000000000000000000000000000000000000000..44dfee8f4d037f41c0236550ed13a2eecf74c1a0 --- /dev/null +++ b/aconversions/src/conversions/re2fa/Glushkov.h @@ -0,0 +1,24 @@ +/* + * Glushkov.h + * + * Created on: 11. 1. 2014 + * Author: tomas + */ + +#ifndef GLUSHKOV_H_ +#define GLUSHKOV_H_ + +#include "AbstractREtoFAConverter.h" + +namespace conversions +{ + +/** + * Converts regular expression to finite automata using Glushkov's NFA construction algorithm. + */ +class Glushkov : public AbstractREtoFAConverter +{ + +} /* namespace conversions */ + +#endif /* GLUSHKOV_H_ */ diff --git a/aconversions/src/conversions/re2fa/Makefile b/aconversions/src/conversions/re2fa/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..7f78a561d2e785975d84b529689f5ef53a2edada --- /dev/null +++ b/aconversions/src/conversions/re2fa/Makefile @@ -0,0 +1,34 @@ +EXECUTABLE=are2fa + +all: $(EXECUTABLE).o AbstractREtoFAConverter.o Brzozowski.o Glushkov.o Thompson.o AutomatonUtils.o ConversionException.o + $(LD) $(LDFLAGS) $^ -o $(EXECUTABLE) + cp $(EXECUTABLE) $(BIN_DIR) + +$(EXECUTABLE).o: are2fa.cpp Brzozowski.h AbstractREtoFAConverter.h Glushkov.h Thompson.h + $(CXX) $(CXXFLAGS) $< -o $@ + +AbstractREtoFAConverter.o: AbstractREtoFAConverter.cpp AbstractREtoFAConverter.h + $(CXX) $(CXXFLAGS) $< -o $@ + +Brzozowski.o: Brzozowski.cpp Brzozowski.h AbstractREtoFAConverter.h + $(CXX) $(CXXFLAGS) $< -o $@ + +Glushkov.o: Glushkov.cpp Glushkov.h AbstractREtoFAConverter.h + $(CXX) $(CXXFLAGS) $< -o $@ + +Thompson.o: Thompson.cpp Thompson.h AbstractREtoFAConverter.h ../../utils/AutomatonUtils.h ../../utils/ConversionException.h + $(CXX) $(CXXFLAGS) $< -o $@ + + +AutomatonUtils.o: ../../utils/AutomatonUtils.cpp ../../utils/AutomatonUtils.h ../../utils/utils.h + $(CXX) $(CXXFLAGS) $< -o $@ + +ConversionException.o: ../../utils/ConversionException.cpp ../../utils/ConversionException.h + $(CXX) $(CXXFLAGS) $< -o $@ + + +.PHONY: clean + +clean: + rm -f *.o + rm -f $(EXECUTABLE) \ No newline at end of file diff --git a/aconversions/src/conversions/re2fa/Thompson.cpp b/aconversions/src/conversions/re2fa/Thompson.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3b606f8b5f836f30f9c93568f6759018299e73b7 --- /dev/null +++ b/aconversions/src/conversions/re2fa/Thompson.cpp @@ -0,0 +1,12 @@ +/* + * Thompson.cpp + * + * Created on: 11. 1. 2014 + * Author: tomas + */ +#include "Thompson.h" + +namespace conversions +{ + +} /* namespace conversions */ diff --git a/aconversions/src/conversions/re2fa/Thompson.h b/aconversions/src/conversions/re2fa/Thompson.h new file mode 100644 index 0000000000000000000000000000000000000000..0311c23f46930856308e6951e4ff262a94ab8974 --- /dev/null +++ b/aconversions/src/conversions/re2fa/Thompson.h @@ -0,0 +1,19 @@ +/* + * Thompson.h + * + * Created on: 11. 1. 2014 + * Author: tomas + */ + +#ifndef THOMPSON_H_ +#define THOMPSON_H_ + +namespace conversions +{ + +class Thompson : public AbstractREtoFAConverter +{ + +} /* namespace conversions */ + +#endif /* THOMPSON_H_ */ diff --git a/aconversions/src/arg2fa.cpp b/aconversions/src/conversions/re2fa/are2fa.cpp similarity index 52% rename from aconversions/src/arg2fa.cpp rename to aconversions/src/conversions/re2fa/are2fa.cpp index 9b4a60f4dcab4d25b7d04fe3810b5d053f032b14..715b5889041b9a72710a02d659684d7960199b9d 100644 --- a/aconversions/src/arg2fa.cpp +++ b/aconversions/src/conversions/re2fa/are2fa.cpp @@ -1,5 +1,5 @@ //============================================================================ -// Name : afsm2rg.cpp +// Name : are2fa.cpp // Author : Tomas Pecka // Version : // Copyright : @@ -8,32 +8,42 @@ #include <iostream> -#include <GrammarFactory.h> #include <AlibException.h> - #include <automaton/AutomatonPrinter.h> +#include <regexp/RegExp.h> +#include <regexp/RegExpParser.h> +#include <sax/SaxInterface.h> + +#include "Brzozowski.h" +#include "Glushkov.h" +#include "Thompson.h" -#include "conversions/rg2fa/rg2fa.h" using namespace std; -using namespace grammar; using namespace automaton; +using namespace regexp; using namespace alib; +using namespace conversions; int main(int argc, char** argv) { try { + list<Token> tokens; string input(istreambuf_iterator<char>(cin), (istreambuf_iterator<char>())); + SaxInterface::parseMemory(input, tokens); + RegExp re = RegExpParser::parse(tokens); - RightRegularGrammar rg = GrammarFactory::buildRightRegularGrammar( GrammarFactory::fromString( input ) ); - // LeftRegularGrammar rg = GrammarFactory::buildLeftRegularGrammar( GrammarFactory::fromString( input ) ); - FSM* fsm = RG2FSMConvert::convert( rg ); - AutomatonPrinter::toXML(*fsm, cout); + Thompson conv( re ); + FSM fsm = conv.convert( ); + + AutomatonPrinter::toXML( fsm, cout ); } - catch (AlibException& e) + catch( AlibException & e ) { cout << e.what() << endl; - return 0; + return 1; } + + return 0; } diff --git a/aconversions/src/conversions/re2rg/Makefile b/aconversions/src/conversions/re2rg/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..59f2f1d0f5d8d7212f43bacd1437e590c688e79e --- /dev/null +++ b/aconversions/src/conversions/re2rg/Makefile @@ -0,0 +1,5 @@ +all: + +.PHONY: clean +clean: + rm -f *.o \ No newline at end of file diff --git a/aconversions/src/conversions/rg2fa/AbstractRGtoFAConverter.cpp b/aconversions/src/conversions/rg2fa/AbstractRGtoFAConverter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a6b56bdd8a5c1c9c195d6ce331c8cf9eb53f93fd --- /dev/null +++ b/aconversions/src/conversions/rg2fa/AbstractRGtoFAConverter.cpp @@ -0,0 +1,32 @@ +#include "AbstractRGtoFAConverter.h" + +using namespace alphabet; +using namespace automaton; +using namespace grammar; + +namespace conversions +{ + +AbstractRGtoFAConverter::AbstractRGtoFAConverter( const RegularGrammar& grammar ) : m_grammar( grammar ) +{ + +} + +AbstractRGtoFAConverter::~AbstractRGtoFAConverter( void ) +{ + +} + +void AbstractRGtoFAConverter::createInputAlphabet( void ) +{ + for( set<Symbol>::const_iterator i = m_grammar.getTerminalSymbols().begin(); i != m_grammar.getTerminalSymbols().end(); i++ ) + m_automaton . addInputSymbol( *i ); +} + +void AbstractRGtoFAConverter::createStates( void ) +{ + for( set<Symbol>::const_iterator i = m_grammar.getNonTerminalSymbols().begin(); i != m_grammar.getNonTerminalSymbols().end(); i++ ) + m_automaton . addState( State( i-> getSymbol() ) ); +} + +} /* namespace conversions */ diff --git a/aconversions/src/conversions/rg2fa/AbstractRGtoFAConverter.h b/aconversions/src/conversions/rg2fa/AbstractRGtoFAConverter.h new file mode 100644 index 0000000000000000000000000000000000000000..67575b57afdf08583fecc725e3fa78381715eb68 --- /dev/null +++ b/aconversions/src/conversions/rg2fa/AbstractRGtoFAConverter.h @@ -0,0 +1,27 @@ +#ifndef __ABSTRACTRGTOFACONVERTER_H__ +#define __ABSTRACTRGTOFACONVERTER_H__ + +#include <automaton/FSM/FSM.h> +#include <grammar/RegularGrammar.h> + +namespace conversions +{ + +class AbstractRGtoFAConverter +{ +public: + virtual const automaton::FSM convert( void ) = 0; + +protected: + AbstractRGtoFAConverter( const grammar::RegularGrammar& grammar ); + virtual ~AbstractRGtoFAConverter( void ); + void createStates( void ); + void createInputAlphabet( void ); + + const grammar::RegularGrammar& m_grammar; + automaton::FSM m_automaton; +}; + +} /* namespace conversions */ + +#endif /* __ABSTRACTRGTOFACONVERTER_H__ */ diff --git a/aconversions/src/conversions/rg2fa/LRGtoFAConverter.cpp b/aconversions/src/conversions/rg2fa/LRGtoFAConverter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7802f3040b610e304f7abdd4e2b97d2ef4b677f2 --- /dev/null +++ b/aconversions/src/conversions/rg2fa/LRGtoFAConverter.cpp @@ -0,0 +1,57 @@ +#include "LRGtoFAConverter.h" + +using namespace alphabet; +using namespace automaton; +using namespace grammar; + +namespace conversions +{ + +LRGtoFAConverter::LRGtoFAConverter( const LeftRegularGrammar & grammar ) : AbstractRGtoFAConverter( grammar ) +{ + //TODO: if is not LRG throw Exception +} + +const FSM LRGtoFAConverter::convert( void ) +{ + createInputAlphabet( ); + createStates( ); + + State startState = AutomatonUtils::createUniqueState( "q0", m_automaton.getStates() ); + m_automaton.addState( startState ); + + // step 3, constructing \delta + for( set<Rule>::const_iterator i = m_grammar.getRules().begin(); i != m_grammar.getRules().end(); i++ ) + { + if( GrammarUtils::isEpsilonRule( *i ) ) + continue; + + State current( GrammarUtils::getFirstSymbolFromSet( i->getLeftSide(), m_grammar.getNonTerminalSymbols() ) -> getSymbol() ); + Symbol input( GrammarUtils::getFirstSymbolFromSet( i->getRightSide(), m_grammar.getTerminalSymbols() ) -> getSymbol() ); + + // if B->a => \delta(B,a)=AState + if( i->getRightSide().size() == 1 ) + { + m_automaton.addTransition( startState, input, current ); + } + // if B->aC => \delta(B,a)=C + else if( i->getRightSide().size() == 2 ) + { + State next( GrammarUtils::getFirstSymbolFromSet( i -> getRightSide(), m_grammar.getNonTerminalSymbols() ) -> getSymbol() ); + m_automaton.addTransition( next, input, current ); + } + } + + // step 4 + m_automaton.addInitialState( startState ); + + // step 5 + m_automaton.addFinalState( State( m_grammar.getStartSymbol().getSymbol() ) ); + for( set<Rule>::const_iterator i = m_grammar.getRules().begin(); i != m_grammar.getRules().end(); i++ ) + if( GrammarUtils::isEpsilonRule( *i ) ) + m_automaton.addFinalState( startState ); + + return m_automaton; +} + +} /* namespace conversions */ diff --git a/aconversions/src/conversions/rg2fa/LRGtoFAConverter.h b/aconversions/src/conversions/rg2fa/LRGtoFAConverter.h new file mode 100644 index 0000000000000000000000000000000000000000..856a0cbe80018674592b428ffc38a93ab5e8587a --- /dev/null +++ b/aconversions/src/conversions/rg2fa/LRGtoFAConverter.h @@ -0,0 +1,23 @@ +#ifndef __LRGTOFACONVERTER_H__ +#define __LRGTOFACONVERTER_H__ + +#include <automaton/FSM/FSM.h> +#include <grammar/LeftRegularGrammar.h> + +#include "../../utils/AutomatonUtils.h" +#include "../../utils/GrammarUtils.h" +#include "AbstractRGtoFAConverter.h" + +namespace conversions +{ + +class LRGtoFAConverter : public AbstractRGtoFAConverter +{ +public: + LRGtoFAConverter( const grammar::LeftRegularGrammar & grammar ); + const automaton::FSM convert( ); +}; + +} /* namespace conversions */ + +#endif /* __LRGTOFACONVERTER_H__ */ diff --git a/aconversions/src/conversions/rg2fa/Makefile b/aconversions/src/conversions/rg2fa/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..02b4e2f63eb7ed197d81c70ee5c7249880953b82 --- /dev/null +++ b/aconversions/src/conversions/rg2fa/Makefile @@ -0,0 +1,34 @@ +EXECUTABLE=are2fa + +all: $(EXECUTABLE).o AbstractRGtoFAConverter.o LRGtoFAConverter.o RRGtoFAConverter.o AutomatonUtils.o GrammarUtils.o ConversionException.o + $(LD) $(LDFLAGS) $^ -o $(EXECUTABLE) + cp $(EXECUTABLE) $(BIN_DIR) + +$(EXECUTABLE).o: arg2fa.cpp LRGtoFAConverter.h ../../utils/AutomatonUtils.h ../../utils/utils.h ../../utils/GrammarUtils.h AbstractRGtoFAConverter.h RRGtoFAConverter.h + $(CXX) $(CXXFLAGS) $< -o $@ + +AbstractRGtoFAConverter.o: AbstractRGtoFAConverter.cpp AbstractRGtoFAConverter.h + $(CXX) $(CXXFLAGS) $< -o $@ + +LRGtoFAConverter.o: LRGtoFAConverter.cpp LRGtoFAConverter.h ../../utils/AutomatonUtils.h ../../utils/utils.h ../../utils/GrammarUtils.h AbstractRGtoFAConverter.h + $(CXX) $(CXXFLAGS) $< -o $@ + +RRGtoFAConverter.o: RRGtoFAConverter.cpp RRGtoFAConverter.h ../../utils/AutomatonUtils.h ../../utils/utils.h ../../utils/GrammarUtils.h AbstractRGtoFAConverter.h + $(CXX) $(CXXFLAGS) $< -o $@ + + +AutomatonUtils.o: ../../utils/AutomatonUtils.cpp ../../utils/AutomatonUtils.h ../../utils/utils.h + $(CXX) $(CXXFLAGS) $< -o $@ + +ConversionException.o: ../../utils/ConversionException.cpp ../../utils/ConversionException.h + $(CXX) $(CXXFLAGS) $< -o $@ + +GrammarUtils.o: ../../utils/GrammarUtils.cpp ../../utils/GrammarUtils.h ../../utils/utils.h + $(CXX) $(CXXFLAGS) $< -o $@ + + + +.PHONY: clean +clean: + rm -f *.o + rm -f $(EXECUTABLE) \ No newline at end of file diff --git a/aconversions/src/conversions/rg2fa/RRGtoFAConverter.cpp b/aconversions/src/conversions/rg2fa/RRGtoFAConverter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..aebb1bd8f7fa56671ae63a13fa6d2be7e095dbd6 --- /dev/null +++ b/aconversions/src/conversions/rg2fa/RRGtoFAConverter.cpp @@ -0,0 +1,54 @@ +#include "RRGtoFAConverter.h" + +using namespace alphabet; +using namespace automaton; +using namespace grammar; + +namespace conversions +{ + +RRGtoFAConverter::RRGtoFAConverter( const RightRegularGrammar & grammar ) : AbstractRGtoFAConverter( grammar ) +{ + //TODO: if is not RRG throw Exception +} + +const FSM RRGtoFAConverter::convert( void ) +{ + createInputAlphabet( ); + createStates( ); + + State AState = AutomatonUtils::createUniqueState( "A", m_automaton.getStates() ); + m_automaton.addState( AState ); + + for( set<Rule>::const_iterator i = m_grammar.getRules().begin(); i != m_grammar.getRules().end(); i++ ) + { + if( GrammarUtils::isEpsilonRule(*i) ) + continue; + + State current( GrammarUtils::getFirstSymbolFromSet( i->getLeftSide(), m_grammar.getNonTerminalSymbols() ) -> getSymbol() ); + Symbol input( GrammarUtils::getFirstSymbolFromSet( i->getRightSide(), m_grammar.getTerminalSymbols() ) -> getSymbol() ); + + if( i->getRightSide().size() == 1 ) // if B->a => \delta(B,a)=AState + { + m_automaton.addTransition( current, input, AState ); + } + else if( i->getRightSide().size() == 2 ) // if B->aC => \delta(B,a)=C + { + State next( GrammarUtils::getFirstSymbolFromSet( i -> getRightSide(), m_grammar.getNonTerminalSymbols() ) -> getSymbol() ); + m_automaton.addTransition( current, input, next ); + } + } + + // step 4 + m_automaton.addInitialState( m_grammar.getStartSymbol().getSymbol() ); + + // step 5 + m_automaton.addFinalState( AState ); + for( set<Rule>::const_iterator i = m_grammar.getRules().begin(); i != m_grammar.getRules().end(); i++ ) + if( GrammarUtils::isEpsilonRule( *i ) ) + m_automaton.addFinalState( State( m_grammar.getStartSymbol().getSymbol() )); + + return m_automaton; +} + +} /* namespace conversions */ diff --git a/aconversions/src/conversions/rg2fa/RRGtoFAConverter.h b/aconversions/src/conversions/rg2fa/RRGtoFAConverter.h new file mode 100644 index 0000000000000000000000000000000000000000..1d6af194f5556d18b31c9d0d1661cf9d7ddb3604 --- /dev/null +++ b/aconversions/src/conversions/rg2fa/RRGtoFAConverter.h @@ -0,0 +1,23 @@ +#ifndef __RRGTOFACONVERTER_H__ +#define __RRGTOFACONVERTER_H__ + +#include <grammar/RightRegularGrammar.h> +#include <automaton/FSM/FSM.h> + +#include "../../utils/AutomatonUtils.h" +#include "../../utils/GrammarUtils.h" +#include "AbstractRGtoFAConverter.h" + +namespace conversions +{ + +class RRGtoFAConverter : public AbstractRGtoFAConverter +{ +public: + RRGtoFAConverter( const grammar::RightRegularGrammar & grammar ); + const automaton::FSM convert( ); +}; + +} /* namespace conversions */ + +#endif /* __RRGTOFACONVERTER_H__ */ diff --git a/aconversions/src/conversions/rg2fa/arg2fa.cpp b/aconversions/src/conversions/rg2fa/arg2fa.cpp new file mode 100644 index 0000000000000000000000000000000000000000..83c81929b2278e9935fdd159c5372252dfc6c3af --- /dev/null +++ b/aconversions/src/conversions/rg2fa/arg2fa.cpp @@ -0,0 +1,52 @@ +//============================================================================ +// Name : afsm2rg.cpp +// Author : Tomas Pecka +// Version : +// Copyright : +// Description : +//============================================================================ + +#include <iostream> +#include <cstdlib> + +#include <GrammarFactory.h> +#include <AlibException.h> + +#include <automaton/AutomatonPrinter.h> + +#include "LRGtoFAConverter.h" +#include "RRGtoFAConverter.h" + +using namespace std; +using namespace grammar; +using namespace automaton; +using namespace alib; +using namespace conversions; + +int main(int argc, char** argv) +{ + try + { + string input( istreambuf_iterator<char>( cin ), ( istreambuf_iterator<char>( ) ) ); + + UnknownGrammar rg = GrammarFactory::fromString( input ); + //if( isLeftRegularGrammar( rg ) ) + // LRGtoFSMConverter conv( GrammarFactory::buildLeftRegularGrammar( rg ) ) + //else if( isRightRegularGrammar( rg ) ) + RightRegularGrammar rrg = GrammarFactory::buildRightRegularGrammar( rg ); + RRGtoFAConverter conv( rrg ); + //else + //{ + // cout << "Unknow regular grammar type. Neither left nor right. WTF?" << endl; + // return EXIT_FAILURE; + //} + + FSM fsm = conv.convert( ); + AutomatonPrinter::toXML( fsm, cout ); + } + catch( AlibException & e ) + { + cout << e.what( ) << endl; + return 0; + } +} diff --git a/aconversions/src/conversions/rg2fa/rg2fa.cpp b/aconversions/src/conversions/rg2fa/rg2fa.cpp deleted file mode 100644 index 171d3d7b3788a9e7579cc38d7a7369adfa8b2871..0000000000000000000000000000000000000000 --- a/aconversions/src/conversions/rg2fa/rg2fa.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* - * FSM2RGConvert.cpp - * - * Created on: 10. 11. 2013 - * Author: tomas - */ - -#include "rg2fa.h" - -/* - * implements 2.98 in "[2] Melichar, B. Jazyky a překlady. Praha, Vydavatelstvà ČVUT 2007." - */ -FSM * RG2FSMConvert::convert( const RightRegularGrammar & grammar ) -{ - FSM* automaton = new FSM(); - - // step 1 - for( set<Symbol>::const_iterator i = grammar.getTerminalSymbols().begin(); i != grammar.getTerminalSymbols().end(); i++ ) - automaton -> addInputSymbol( *i ); - - // step 2 - for( set<Symbol>::const_iterator i = grammar.getNonTerminalSymbols().begin(); i != grammar.getNonTerminalSymbols().end(); i++ ) - automaton -> addState( State( i-> getSymbol() ) ); - - State AState = AutomatonUtils::createUniqueState( "A", automaton->getStates() ); - automaton -> addState( AState ); - - // step 3, constructing \delta - for( set<Rule>::const_iterator i = grammar.getRules().begin(); i != grammar.getRules().end(); i++ ) - { - if( GrammarUtils::isEpsilonRule(*i) ) - continue; - - State current( GrammarUtils::getFirstSymbolFromSet( i->getLeftSide(), grammar.getNonTerminalSymbols() ) -> getSymbol() ); - Symbol input( GrammarUtils::getFirstSymbolFromSet( i->getRightSide(), grammar.getTerminalSymbols() ) -> getSymbol() ); - - // if B->a => \delta(B,a)=AState - if( i->getRightSide().size() == 1 ) - automaton->addTransition( current, input, AState ); - - // if B->aC => \delta(B,a)=C - if( i->getRightSide().size() == 2 ) - { - State next( GrammarUtils::getFirstSymbolFromSet( i -> getRightSide(), grammar.getNonTerminalSymbols() ) -> getSymbol() ); - automaton->addTransition( current, input, next ); - } - } - - // step 4 - automaton -> addInitialState( grammar.getStartSymbol().getSymbol() ); - - // step 5 - automaton -> addFinalState( AState ); - for( set<Rule>::const_iterator i = grammar.getRules().begin(); i != grammar.getRules().end(); i++ ) - if( GrammarUtils::isEpsilonRule( *i ) ) - automaton -> addFinalState( State( grammar.getStartSymbol().getSymbol() )); - - return automaton; -} - - -/* - * implements 2.102 in "[2] Melichar, B. Jazyky a překlady. Praha, Vydavatelstvà ČVUT 2007." - */ -FSM * RG2FSMConvert::convert( const LeftRegularGrammar & grammar ) -{ - FSM* automaton = new FSM(); - - // step 1 - for( set<Symbol>::const_iterator i = grammar.getTerminalSymbols().begin(); i != grammar.getTerminalSymbols().end(); i++ ) - automaton -> addInputSymbol( *i ); - - // step 2 - for( set<Symbol>::const_iterator i = grammar.getNonTerminalSymbols().begin(); i != grammar.getNonTerminalSymbols().end(); i++ ) - automaton -> addState( State( i-> getSymbol() ) ); - - State startState = AutomatonUtils::createUniqueState( "q0", automaton->getStates() ); - automaton -> addState( startState ); - - // step 3, constructing \delta - for( set<Rule>::const_iterator i = grammar.getRules().begin(); i != grammar.getRules().end(); i++ ) - { - if( i->getRightSide().size() == 0 ) continue; - - State current( GrammarUtils::getFirstSymbolFromSet( i->getLeftSide(), grammar.getNonTerminalSymbols() ) -> getSymbol() ); - Symbol input( GrammarUtils::getFirstSymbolFromSet( i->getRightSide(), grammar.getTerminalSymbols() ) -> getSymbol() ); - - // if B->a => \delta(B,a)=AState - if( i->getRightSide().size() == 1 ) - automaton->addTransition( startState, input, current ); - - // if B->aC => \delta(B,a)=C - if( i->getRightSide().size() == 2 ) - { - State next( GrammarUtils::getFirstSymbolFromSet( i -> getRightSide(), grammar.getNonTerminalSymbols() ) -> getSymbol() ); - automaton->addTransition( next, input, current ); - } - } - - // step 4 - automaton -> addInitialState( startState ); - - // step 5 - automaton -> addFinalState( State( grammar.getStartSymbol().getSymbol() ) ); - for( set<Rule>::const_iterator i = grammar.getRules().begin(); i != grammar.getRules().end(); i++ ) - if( GrammarUtils::isEpsilonRule( *i ) ) - automaton -> addFinalState( startState ); - - - return automaton; -} diff --git a/aconversions/src/conversions/rg2fa/rg2fa.h b/aconversions/src/conversions/rg2fa/rg2fa.h deleted file mode 100644 index 69d4c97c3fef1048fc82e71e71176edf02c66039..0000000000000000000000000000000000000000 --- a/aconversions/src/conversions/rg2fa/rg2fa.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * RG2FSMConvert.h - * - * Created on: 10. 11. 2013 - * Author: Tomas Pecka - */ - -#ifndef RG2FA_CONVERT_H_ -#define RG2FA_CONVERT_H_ - -#include <map> - -#include <automaton/FSM/FSM.h> -#include <grammar/RightRegularGrammar.h> -#include <grammar/LeftRegularGrammar.h> - -#include "../../utils/AutomatonUtils.h" -#include "../../utils/GrammarUtils.h" - -using namespace std; -using namespace automaton; -using namespace grammar; - -class RG2FSMConvert -{ -public: - static FSM* convert( const RightRegularGrammar & grammar ); - static FSM* convert( const LeftRegularGrammar & grammar ); -}; - -#endif /* RG2FA_CONVERT_H_ */ diff --git a/aconversions/src/conversions/rg2re/Makefile b/aconversions/src/conversions/rg2re/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..fc51491dbea8d504dfeb62fcc8bef3dbea8e111f --- /dev/null +++ b/aconversions/src/conversions/rg2re/Makefile @@ -0,0 +1,6 @@ +all: + +.PHONY: clean +clean: + rm -f *.o + rm -f $(EXECUTABLE) \ No newline at end of file diff --git a/aconversions/src/utils/ConversionException.cpp b/aconversions/src/utils/ConversionException.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d7683ec5e617a1c095446d4f5693bc7e54683fdb --- /dev/null +++ b/aconversions/src/utils/ConversionException.cpp @@ -0,0 +1,23 @@ +/* + * ConversionException.cpp + * + * Created on: 22. 12. 2013 + * Author: tomas + */ + +#include "ConversionException.h" + +ConversionException::ConversionException( void ) +{ + +} + +ConversionException::ConversionException( const string & cause ) : AlibException( cause ) +{ + +} + +ConversionException::~ConversionException( void ) throw ( ) +{ + +} diff --git a/aconversions/src/utils/ConversionException.h b/aconversions/src/utils/ConversionException.h new file mode 100644 index 0000000000000000000000000000000000000000..c789ca3c30e4c9f73400fdb7e4c70651c2bcdf89 --- /dev/null +++ b/aconversions/src/utils/ConversionException.h @@ -0,0 +1,24 @@ +/* + * ConversionException.h + * + * Created on: 22. 12. 2013 + * Author: tomas + */ + +#ifndef CONVERSIONEXCEPTION_H_ +#define CONVERSIONEXCEPTION_H_ + +#include <AlibException.h> + +using namespace std; +using namespace alib; + +class ConversionException : public AlibException +{ +public: + ConversionException( void ); + ConversionException( const string & cause ); + virtual ~ConversionException( void ) throw (); +}; + +#endif /* CONVERSIONEXCEPTION_H_ */ diff --git a/aconversions/src/utils/GrammarUtils.cpp b/aconversions/src/utils/GrammarUtils.cpp index 88f5b322bc7af0e72df077f7d5392c3fe7417ff5..b5947046317d1e8908d72be1645ae38bb9ae315c 100644 --- a/aconversions/src/utils/GrammarUtils.cpp +++ b/aconversions/src/utils/GrammarUtils.cpp @@ -59,8 +59,11 @@ Symbol GrammarUtils::createUniqueSymbol( const string & name, const RegularGramm while( true ) { ostringstream oss; + if( suffix == INTEGER ) + { oss << name << i++; + } else { oss << name << str; diff --git a/aconversions/src/utils/utils.h b/aconversions/src/utils/utils.h index dea4501b7ae6ca216a4330ced59deca5ad82437c..56c69e78569563b3aaee1de7a43c6f77157633cb 100644 --- a/aconversions/src/utils/utils.h +++ b/aconversions/src/utils/utils.h @@ -8,14 +8,13 @@ #include <set> #include <list> - #define isInSet(x,set) ( (set).find((x)) != (set).end()) enum SuffixType { INTEGER, APOSTROPHE, - UNDEFINED, + UNDEFINED }; #endif /* UTILS_H_ */