From 05ae3b4622ae57598d4ddbf567cc7d2361e8ba6a Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Mon, 11 Sep 2017 08:33:33 +0200
Subject: [PATCH] use cli in conversions

---
 aconversions2/makefile.conf                   |   6 +-
 aconversions2/src/ConversionHandler.cpp       | 344 ++++--------------
 aconversions2/src/ConversionHandler.h         |  42 +--
 aconversions2/src/aconversion.cpp             |  31 +-
 .../src/automaton/convert/ToGrammarLeftRG.cpp |   9 +-
 .../src/automaton/convert/ToGrammarLeftRG.h   |   8 +-
 .../automaton/convert/ToGrammarRightRG.cpp    |   9 +-
 .../src/automaton/convert/ToGrammarRightRG.h  |   8 +-
 .../convert/ToPostfixPushdownAutomaton.cpp    |   8 +-
 .../convert/ToPostfixPushdownAutomaton.h      |   7 +-
 .../automaton/convert/ToRegExpAlgebraic.cpp   |  15 +-
 .../src/automaton/convert/ToRegExpAlgebraic.h |   8 +-
 .../convert/ToRegExpStateElimination.cpp      |  24 +-
 .../convert/ToRegExpStateElimination.h        |   8 +-
 alib2algo/src/grammar/convert/ToAutomaton.cpp |  14 +-
 alib2algo/src/grammar/convert/ToAutomaton.h   |   8 +-
 .../grammar/convert/ToAutomatonBottomUp.cpp   |   8 +-
 .../src/grammar/convert/ToAutomatonBottomUp.h |   7 +-
 .../src/grammar/convert/ToRegExpAlgebraic.cpp |   8 +-
 .../src/grammar/convert/ToRegExpAlgebraic.h   |   9 +-
 .../regexp/convert/ToAutomatonDerivation.cpp  |   8 +-
 .../regexp/convert/ToAutomatonDerivation.h    |   7 +-
 .../regexp/convert/ToAutomatonGlushkov.cpp    |  10 +-
 .../src/regexp/convert/ToAutomatonGlushkov.h  |   6 +-
 .../regexp/convert/ToAutomatonThompson.cpp    |   9 +-
 .../src/regexp/convert/ToAutomatonThompson.h  |   7 +-
 .../convert/ToGrammarRightRGDerivation.cpp    |   8 +-
 .../convert/ToGrammarRightRGDerivation.h      |   7 +-
 .../convert/ToGrammarRightRGGlushkov.cpp      |   9 +-
 .../regexp/convert/ToGrammarRightRGGlushkov.h |   8 +-
 .../ToPostfixPushdownAutomatonGlushkov.cpp    |   9 +-
 .../ToPostfixPushdownAutomatonGlushkov.h      |   6 +-
 ...oPostfixPushdownAutomatonGlushkovNaive.cpp |   8 +-
 .../ToPostfixPushdownAutomatonGlushkovNaive.h |   6 +-
 .../test-src/regexp/toAutomaton/re2faTest.cpp |  10 +-
 35 files changed, 182 insertions(+), 517 deletions(-)

diff --git a/aconversions2/makefile.conf b/aconversions2/makefile.conf
index d4df0fe977..b02ee8d1f9 100644
--- a/aconversions2/makefile.conf
+++ b/aconversions2/makefile.conf
@@ -1,4 +1,4 @@
 EXECUTABLE:=aconversions2
-LINK_PATHS=../alib2elgo/ ../alib2algo/ ../alib2data/ ../alib2common/ ../alib2std/
-LINK_LIBRARIES=alib2elgo alib2algo alib2data alib2common alib2std xml2
-INCLUDE_PATHS=\$$(SOURCES_BASE_DIR)/../../alib2elgo/src/ \$$(SOURCES_BASE_DIR)/../../alib2algo/src/ \$$(SOURCES_BASE_DIR)/../../alib2data/src/ \$$(SOURCES_BASE_DIR)/../../alib2common/src/ \$$(SOURCES_BASE_DIR)/../../alib2std/src/ /usr/include/libxml2/
+LINK_PATHS=../alib2cli/ ../alib2elgo/ ../alib2algo/ ../alib2data/ ../alib2common/ ../alib2std/
+LINK_LIBRARIES=alib2cli alib2elgo alib2algo alib2data alib2common alib2std xml2
+INCLUDE_PATHS=\$$(SOURCES_BASE_DIR)/../../alib2cli/src/ \$$(SOURCES_BASE_DIR)/../../alib2common/src/ \$$(SOURCES_BASE_DIR)/../../alib2std/src/ /usr/include/libxml2/
diff --git a/aconversions2/src/ConversionHandler.cpp b/aconversions2/src/ConversionHandler.cpp
index b799488ec1..aaa2bf951d 100644
--- a/aconversions2/src/ConversionHandler.cpp
+++ b/aconversions2/src/ConversionHandler.cpp
@@ -5,174 +5,108 @@
  *	  Author: Tomas Pecka
  */
 
-#include <measure>
 #include "ConversionHandler.h"
-
-#include "automaton/convert/ToRegExpStateElimination.h"
-#include "automaton/convert/ToRegExpAlgebraic.h"
-#include "automaton/convert/ToGrammarLeftRG.h"
-#include "automaton/convert/ToGrammarRightRG.h"
-#include "automaton/convert/ToPostfixPushdownAutomaton.h"
-
-#include "regexp/convert/ToAutomatonGlushkov.h"
-#include "regexp/convert/ToAutomatonThompson.h"
-#include "regexp/convert/ToAutomatonDerivation.h"
-
-#include "grammar/convert/ToAutomaton.h"
-#include "grammar/convert/ToAutomatonBottomUp.h"
-#include "grammar/convert/ToRegExpAlgebraic.h"
-
-#include "regexp/convert/ToGrammarRightRGGlushkov.h"
-#include "regexp/convert/ToGrammarRightRGDerivation.h"
-
-#include "rte/convert/ToPostfixPushdownAutomatonGlushkovNaive.h"
-#include "rte/convert/ToPostfixPushdownAutomatonGlushkov.h"
-
-#include <factory/XmlDataFactory.hpp>
 #include <exception/CommonException.h>
 
-ConversionHandler::ConversionHandler( ext::deque<sax::Token> && tokens, const std::string & target, const std::string & algorithm ) :
-	m_tokens( std::move( tokens ) ),
-	m_source( parseFormalismFromTokens( ) ),
+ConversionHandler::ConversionHandler( const std::string & inputType, const std::string & target, const std::string & algorithm ) :
+	m_source( parseFormalismFromType( inputType ) ),
 	m_target( parseFormalismFromString( target ) ),
 	m_algorithm( parseAlgorithmFromString( algorithm ) )
 {
 }
 
-void ConversionHandler::convert ( void ) {
+std::string ConversionHandler::convert ( ) {
 	if ( m_source == FINITE_AUTOMATON )
-		convertFA ( );
+		return convertFA ( );
 	else if ( m_source == REGULAR_EXPRESSION )
-		convertRE ( );
+		return convertRE ( );
 	else if ( m_source == REGULAR_GRAMMAR )
-		convertRG ( );
+		return convertRG ( );
 	else if ( m_source == PUSHDOWN_AUTOMATON )
-		convertPDA ( );
+		return convertPDA ( );
 	else if ( m_source == CONTEXTFREE_GRAMMAR )
-		convertCFG ( );
+		return convertCFG ( );
 	else if ( m_source == REGULAR_TREE_EXPRESSION )
-		convertRTE ( );
+		return convertRTE ( );
 	else
 		throw exception::CommonException( "ConversionHandler: Unknown source formalism." );
 }
 
 // ----------------------------------------------------------------------------
 
-void ConversionHandler::convertFA ( void ) {
+std::string ConversionHandler::convertFA ( ) {
 	if ( m_target == REGULAR_EXPRESSION )
-		convertFAtoRE ( );
+		return convertFAtoRE ( );
 	else if ( m_target == REGULAR_GRAMMAR )
-		convertFAtoRG ( );
+		return convertFAtoRG ( );
 	else
 		throw exception::CommonException( "ConversionHandler: Unknown target formalism." );
 }
 
-void ConversionHandler::convertRE ( void ) {
+std::string ConversionHandler::convertRE ( ) {
 	if ( m_target == FINITE_AUTOMATON )
-		convertREtoFA ( );
+		return convertREtoFA ( );
 	else if ( m_target == REGULAR_GRAMMAR )
-		convertREtoRG ( );
+		return convertREtoRG ( );
 	else
 		throw exception::CommonException( "ConversionHandler: Invalid target formalism." );
 }
 
-void ConversionHandler::convertRG ( void ) {
+std::string ConversionHandler::convertRG ( ) {
 	if ( m_target == FINITE_AUTOMATON )
-		convertRGtoFA ( );
+		return convertRGtoFA ( );
 	else if ( m_target == REGULAR_EXPRESSION )
-		convertRGtoRE ( );
+		return convertRGtoRE ( );
 	else
 		throw exception::CommonException( "ConversionHandler: Invalid target formalism." );
 }
 
-void ConversionHandler::convertPDA ( void ) {
+std::string ConversionHandler::convertPDA ( ) {
 	throw exception::CommonException ( "ConversionHandler: Invalid source formalism." );
 }
 
-void ConversionHandler::convertCFG ( void ) {
+std::string ConversionHandler::convertCFG ( ) {
 	if ( m_target == PUSHDOWN_AUTOMATON )
-		convertCFGtoPDA ( );
+		return convertCFGtoPDA ( );
 	else
 		throw exception::CommonException ( "ConversionHandler: Invalid target formalism." );
 }
 
-void ConversionHandler::convertRTE ( void ) {
+std::string ConversionHandler::convertRTE ( ) {
 	if ( m_target == PUSHDOWN_AUTOMATON )
-		convertRTEtoPDA ( );
+		return convertRTEtoPDA ( );
 	else
 		throw exception::CommonException( "ConversionHandler: Invalid target formalism." );
 }
 
-void ConversionHandler::convertFTA ( void ) {
+std::string ConversionHandler::convertFTA ( ) {
 	if ( m_target == PUSHDOWN_AUTOMATON )
-		convertFTAtoPDA ( );
+		return convertFTAtoPDA ( );
 	else
 		throw exception::CommonException( "ConversionHandler: Invalid target formalism." );
 }
 
 // ----------------------------------------------------------------------------
 
-void ConversionHandler::convertFAtoRE ( void ) {
-	const automaton::Automaton automaton = alib::XmlDataFactory::fromTokens ( std::move ( m_tokens ) );
-
-	measurements::end ( );
-	measurements::start ( "Algorithm", measurements::Type::MAIN );
-
+std::string ConversionHandler::convertFAtoRE ( ) {
 	switch ( m_algorithm ) {
-	case BRZOZOWSKI_ALGEBRAIC: {
-		regexp::RegExp regexp = automaton::convert::ToRegExpAlgebraic::convert ( automaton );
-
-		measurements::end ( );
-		measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-		alib::XmlDataFactory::toStdout ( regexp );
-		break;
-	}
-
+	case BRZOZOWSKI_ALGEBRAIC:
+		return "execute automaton::convert::ToRegExpAlgebraic $input > $output";
 	case STATE_ELIMINATION:
-	case DEFAULT: {
-		regexp::RegExp regexp = automaton::convert::ToRegExpStateElimination::convert ( automaton );
-
-		measurements::end ( );
-		measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-		alib::XmlDataFactory::toStdout ( regexp );
-		break;
-	}
-
+	case DEFAULT:
+		return "execute automaton::convert::ToRegExpStateElimination $input > $output";
 	default:
 		throw exception::CommonException ( "ConversionHandler: Invalid algorithm." );
 	}
 }
 
-void ConversionHandler::convertFAtoRG ( void ) {
-	const automaton::Automaton fsm = alib::XmlDataFactory::fromTokens ( std::move ( m_tokens ) );
-
-	measurements::end ( );
-	measurements::start ( "Algorithm", measurements::Type::MAIN );
-
+std::string ConversionHandler::convertFAtoRG ( ) {
 	switch ( m_algorithm ) {
-	case INCOMING_TRANSITIONS: {
-		grammar::LeftRG < > grammar = automaton::convert::ToGrammarLeftRG::convert ( fsm );
-
-		measurements::end ( );
-		measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-		alib::XmlDataFactory::toStdout ( grammar );
-		break;
-	}
-
+	case INCOMING_TRANSITIONS:
+		return "execute automaton::convert::ToGrammarLeftRG $input > $output";
 	case OUTGOING_TRANSITIONS:
-	case DEFAULT: {
-		grammar::RightRG < > grammar = automaton::convert::ToGrammarRightRG::convert ( fsm );
-
-		measurements::end ( );
-		measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-		alib::XmlDataFactory::toStdout ( grammar );
-		break;
-	}
-
+	case DEFAULT:
+		return "execute automaton::convert::ToGrammarRightRG $input > $output";
 	default:
 		throw exception::CommonException( "ConversionHandler: Invalid algorithm." );
 	}
@@ -180,77 +114,27 @@ void ConversionHandler::convertFAtoRG ( void ) {
 
 // ----------------------------------------------------------------------------
 
-void ConversionHandler::convertREtoFA ( void ) {
-	const regexp::RegExp regexp = alib::XmlDataFactory::fromTokens ( std::move ( m_tokens ) );
-
-	measurements::end ( );
-	measurements::start ( "Algorithm", measurements::Type::MAIN );
-
+std::string ConversionHandler::convertREtoFA ( ) {
 	switch ( m_algorithm ) {
-	case BRZOZOWSKI_DERIVATION: {
-		automaton::DFA<> automaton = regexp::convert::ToAutomatonDerivation::convert ( regexp );
-
-		measurements::end ( );
-		measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-		alib::XmlDataFactory::toStdout ( automaton );
-		break;
-	}
-
-	case THOMPSON_NFA: {
-		automaton::EpsilonNFA < > automaton = regexp::convert::ToAutomatonThompson::convert ( regexp );
-
-		measurements::end ( );
-		measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-		alib::XmlDataFactory::toStdout ( automaton );
-		break;
-	}
-
+	case BRZOZOWSKI_DERIVATION:
+		return "execute regexp::convert::ToAutomatonDerivation $input > $output";
+	case THOMPSON_NFA:
+		return "execute regexp::convert::ToAutomatonThompson $input > $output";
 	case GLUSHKOV_NFA:
-	case DEFAULT: {
-		automaton::NFA < > automaton = regexp::convert::ToAutomatonGlushkov::convert ( regexp );
-
-		measurements::end ( );
-		measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-		alib::XmlDataFactory::toStdout ( automaton );
-		break;
-	}
-
+	case DEFAULT:
+		return "execute regexp::convert::ToAutomatonGlushkov $input > $output";
 	default:
 		throw exception::CommonException( "ConversionHandler: Invalid algorithm." );
 	}
 }
 
-void ConversionHandler::convertREtoRG ( void ) {
-	const regexp::RegExp regexp = alib::XmlDataFactory::fromTokens ( std::move ( m_tokens ) );
-
-	measurements::end ( );
-	measurements::start ( "Algorithm", measurements::Type::MAIN );
-
+std::string ConversionHandler::convertREtoRG ( ) {
 	switch ( m_algorithm ) {
-	case BRZOZOWSKI_DERIVATION: {
-		grammar::RightRG < > grammar = regexp::convert::ToGrammarRightRGDerivation::convert ( regexp );
-
-		measurements::end ( );
-		measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-		alib::XmlDataFactory::toStdout ( grammar );
-		break;
-	}
-
+	case BRZOZOWSKI_DERIVATION:
+		return "execute regexp::convert::ToGrammarRightRGDerivation $input > $output";
 	case GLUSHKOV_NFA:
-	case DEFAULT: {
-		grammar::RightRG < > grammar = regexp::convert::ToGrammarRightRGGlushkov::convert ( regexp );
-
-		measurements::end ( );
-		measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-		alib::XmlDataFactory::toStdout ( grammar );
-		break;
-	}
-
+	case DEFAULT:
+		return "execute regexp::convert::ToGrammarRightRGGlushkov $input > $output";
 	default:
 		throw exception::CommonException( "ConversionHandler: Invalid algorithm." );
 	}
@@ -258,133 +142,53 @@ void ConversionHandler::convertREtoRG ( void ) {
 
 // ----------------------------------------------------------------------------
 
-void ConversionHandler::convertRGtoFA( void ) {
-	const grammar::Grammar grammar = alib::XmlDataFactory::fromTokens (std::move(m_tokens));
-
-	measurements::end ( );
-	measurements::start ( "Algorithm", measurements::Type::MAIN );
-
+std::string ConversionHandler::convertRGtoFA( ) {
 	switch ( m_algorithm ) {
-	case DEFAULT: {
-		automaton::Automaton automaton = grammar::convert::ToAutomaton::convert ( grammar );
-
-		measurements::end ( );
-		measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-		alib::XmlDataFactory::toStdout ( automaton );
-		break;
-	}
-
+	case DEFAULT:
+		return "execute grammar::convert::ToAutomaton $input > $output";
 	default:
 		throw exception::CommonException( "ConversionHandler: Invalid algorithm." );
 	}
 }
 
-void ConversionHandler::convertRGtoRE ( void ) {
-	const grammar::Grammar grammar = alib::XmlDataFactory::fromTokens ( std::move ( m_tokens ) );
-
-	measurements::end ( );
-	measurements::start ( "Algorithm", measurements::Type::MAIN );
-
+std::string ConversionHandler::convertRGtoRE ( ) {
 	switch ( m_algorithm ) {
 	case BRZOZOWSKI_ALGEBRAIC:
-	case DEFAULT: {
-		regexp::RegExp regexp = grammar::convert::ToRegExpAlgebraic::convert ( grammar );
-
-		measurements::end ( );
-		measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-		alib::XmlDataFactory::toStdout ( regexp );
-		break;
-	}
-
+	case DEFAULT:
+		return "execute grammar::convert::ToRegExpAlgebraic $input > $output";
 	default:
 		throw exception::CommonException( "ConversionHandler: Invalid algorithm." );
 	}
 }
 
-void ConversionHandler::convertCFGtoPDA ( void ) {
-	const grammar::Grammar grammar = alib::XmlDataFactory::fromTokens ( std::move ( m_tokens ) );
-
-	measurements::end ( );
-	measurements::start ( "Algorithm", measurements::Type::MAIN );
-
+std::string ConversionHandler::convertCFGtoPDA ( ) {
 	switch ( m_algorithm ) {
-	case TOP_DOWN: {
-		automaton::Automaton automaton = grammar::convert::ToAutomaton::convert ( grammar );
-
-		measurements::end ( );
-		measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-		alib::XmlDataFactory::toStdout ( automaton );
-		break;
-	}
-
-	case BOTTOM_UP: {
-		automaton::Automaton automaton = grammar::convert::ToAutomatonBottomUp::convert ( grammar );
-
-		measurements::end ( );
-		measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-		alib::XmlDataFactory::toStdout ( automaton );
-		break;
-	}
-
+	case TOP_DOWN:
+		return "execute grammar::convert::ToAutomaton $input > $output";
+	case BOTTOM_UP:
+		return "execute grammar::convert::ToAutomatonBottomUp $input > $output";
 	default:
 		throw exception::CommonException ( "ConversionHandler: Invalid algorithm." );
 	}
 }
 
-void ConversionHandler::convertRTEtoPDA ( void ) {
-	const rte::RTE rte = alib::XmlDataFactory::fromTokens ( std::move ( m_tokens ) );
-
-	measurements::end ( );
-	measurements::start ( "Algorithm", measurements::Type::MAIN );
-
+std::string ConversionHandler::convertRTEtoPDA ( ) {
 	switch ( m_algorithm ) {
-	case GLUSHKOV_RTE_NAIVE: {
-		automaton::NPDA < > automaton = rte::convert::ToPostfixPushdownAutomatonGlushkovNaive::convert ( rte );
-
-		measurements::end ( );
-		measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-		alib::XmlDataFactory::toStdout ( automaton );
-		break;
-	}
-	case GLUSHKOV_RTE: {
-		automaton::Automaton automaton = rte::convert::ToPostfixPushdownAutomatonGlushkov::convert ( rte );
-
-		measurements::end ( );
-		measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-		alib::XmlDataFactory::toStdout ( automaton );
-		break;
-	}
-
+	case GLUSHKOV_RTE_NAIVE:
+		return "execute rte::convert::ToPostfixPushdownAutomatonGlushkovNaive $input > $output";
+	case GLUSHKOV_RTE:
+		return "execute rte::convert::ToPostfixPushdownAutomatonGlushkov $input > $output";
 	default:
 		throw exception::CommonException ( "ConversionHandler: Invalid algorithm." );
 	}
 }
 
-void ConversionHandler::convertFTAtoPDA() {
-	const automaton::Automaton automaton = alib::XmlDataFactory::fromTokens ( std::move ( m_tokens ) );
-
-	measurements::end ( );
-	measurements::start ( "Algorithm", measurements::Type::MAIN );
-
+std::string ConversionHandler::convertFTAtoPDA ( ) {
 	switch ( m_algorithm ) {
-		case DEFAULT: {
-			automaton::Automaton result = automaton::convert::ToPostfixPushdownAutomaton::convert ( automaton );
-
-			measurements::end ( );
-			measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-			alib::XmlDataFactory::toStdout ( result );
-			break;
-		}
-
-		default:
-			throw exception::CommonException( "ConversionHandler: Invalid algorithm." );
+	case DEFAULT:
+		return "execute automaton::convert::ToPostfixPushdownAutomaton $input > $output";
+	default:
+		throw exception::CommonException( "ConversionHandler: Invalid algorithm." );
 	}
 }
 
@@ -406,20 +210,20 @@ ConversionHandler::TFormalism ConversionHandler::parseFormalismFromString ( cons
 	throw exception::CommonException ( "ConversionHandler: Unknown target type." );
 }
 
-ConversionHandler::TFormalism ConversionHandler::parseFormalismFromTokens ( void ) const {
-	if ( alib::XmlDataFactory::first < automaton::Automaton > ( m_tokens ) )
+ConversionHandler::TFormalism ConversionHandler::parseFormalismFromType ( const std::string & type ) const {
+	if ( type.find ( "automaton::" ) == 0 )
 		return FINITE_AUTOMATON;
 
-	if ( alib::XmlDataFactory::first < regexp::RegExp > ( m_tokens ) )
+	if ( type.find ( "regexp::" ) == 0 )
 		return REGULAR_EXPRESSION;
 
-	if ( alib::XmlDataFactory::first < grammar::CFG < > > ( m_tokens ) )
+	if ( type.find ( "grammar::CFG" ) == 0 )
 		return CONTEXTFREE_GRAMMAR;
 
-	if ( alib::XmlDataFactory::first < grammar::Grammar > ( m_tokens ) )
+	if ( type.find ( "grammar::" ) == 0 )
 		return REGULAR_GRAMMAR;
 
-	if ( alib::XmlDataFactory::first < rte::RTE > ( m_tokens ) )
+	if ( type.find ( "rte::" ) == 0 )
 		return REGULAR_TREE_EXPRESSION;
 
 	throw exception::CommonException ( "ConversionHandler: Invalid input formalism." );
diff --git a/aconversions2/src/ConversionHandler.h b/aconversions2/src/ConversionHandler.h
index 5d9ae39fd9..c591a9cd01 100644
--- a/aconversions2/src/ConversionHandler.h
+++ b/aconversions2/src/ConversionHandler.h
@@ -8,8 +8,7 @@
 #ifndef ALGORITHMCHOOSER_H_
 #define ALGORITHMCHOOSER_H_
 
-#include <deque>
-#include <sax/Token.h>
+#include <string>
 
 /**
  * Wraps all conversions.
@@ -44,38 +43,37 @@ public:
 		FINITE_TREE_AUTOMATON, REGULAR_TREE_EXPRESSION,
 	};
 
-	ConversionHandler ( ext::deque < sax::Token > && tokens, const std::string & target, const std::string & algorithm );
-	void convert ( void );
+	ConversionHandler ( const std::string & tokens, const std::string & target, const std::string & algorithm );
+	std::string convert ( );
 
 private:
 	TFormalism parseFormalismFromString ( const std::string & _target ) const;
-	TFormalism parseFormalismFromTokens ( void ) const;
+	TFormalism parseFormalismFromType ( const std::string & type ) const;
 	TAlgorithm parseAlgorithmFromString ( const std::string & _algorithm ) const;
 
-	void convertFA ( void );
-	void convertFAtoRE ( void );
-	void convertFAtoRG ( void );
+	std::string convertFA ( );
+	std::string convertFAtoRE ( );
+	std::string convertFAtoRG ( );
 
-	void convertRE ( void );
-	void convertREtoFA ( void );
-	void convertREtoRG ( void );
+	std::string convertRE ( );
+	std::string convertREtoFA ( );
+	std::string convertREtoRG ( );
 
-	void convertRG ( void );
-	void convertRGtoFA ( void );
-	void convertRGtoRE ( void );
+	std::string convertRG ( );
+	std::string convertRGtoFA ( );
+	std::string convertRGtoRE ( );
 
-	void convertPDA ( void );
+	std::string convertPDA ( );
 
-	void convertCFG ( void );
-	void convertCFGtoPDA ( void );
+	std::string convertCFG ( );
+	std::string convertCFGtoPDA ( );
 
-	void convertRTE ( void );
-	void convertRTEtoPDA ( void );
+	std::string convertRTE ( );
+	std::string convertRTEtoPDA ( );
 
-	void convertFTA ( void );
-	void convertFTAtoPDA ( void );
+	std::string convertFTA ( );
+	std::string convertFTAtoPDA ( );
 
-	ext::deque < sax::Token > m_tokens;
 	TFormalism m_source, m_target;
 	TAlgorithm m_algorithm;
 };
diff --git a/aconversions2/src/aconversion.cpp b/aconversions2/src/aconversion.cpp
index 07e44cdc09..0f0dd9fe9b 100644
--- a/aconversions2/src/aconversion.cpp
+++ b/aconversions2/src/aconversion.cpp
@@ -8,10 +8,10 @@
 #include <tclap/CmdLine.h>
 #include <global/GlobalData.h>
 #include <measure>
-#include <sax/FromXMLParserHelper.h>
 
-#include <factory/XmlDataFactory.hpp>
 #include <exception/CommonException.h>
+#include <lexer/Lexer.h>
+#include <parser/Parser.h>
 
 #include "ConversionHandler.h"
 
@@ -53,16 +53,33 @@ int main ( int argc, char * argv[] ) {
 		if ( measure.isSet ( ) )
 			common::GlobalData::measure = true;
 
+		cli::Environment environment;
+		environment.setBinding ( "stdin", input.getValue ( ) );
+		environment.setBinding ( "stdout", "-" );
+
 		measurements::start ( "Overal", measurements::Type::OVERALL );
 		measurements::start ( "Input read", measurements::Type::AUXILIARY );
 
-		ext::deque < sax::Token > inputTokens;
-
-		ConversionHandler conv( sax::FromXMLParserHelper::parseInput(input), target.getValue(), algorithm.getValue() );
-		conv.convert( );
+		cli::Parser parser ( cli::Lexer ( "execute <#stdin > $input" ) );
+		parser.parse ( )->run ( environment );
+		std::string inputType = environment.getVariable ( "input" )->getReturnType ( );
 
 		measurements::end ( );
-		measurements::end ( );
+		measurements::start ( "Algorithm", measurements::Type::MAIN );
+
+		ConversionHandler conv( inputType, target.getValue(), algorithm.getValue() );
+		std::string convertString = conv.convert( );
+		parser = cli::Parser ( cli::Lexer ( convertString ) );
+		parser.parse ( )->run ( environment );
+
+		measurements::end();
+		measurements::start("Output write", measurements::Type::AUXILIARY);
+
+		parser = cli::Parser ( cli::Lexer ( "execute $output >#stdout" ) );
+		parser.parse ( )->run ( environment );
+
+		measurements::end();
+		measurements::end();
 
 		if ( measure.getValue ( ) ) ext::cmeasure << measurements::results ( ) << std::endl;
 
diff --git a/alib2algo/src/automaton/convert/ToGrammarLeftRG.cpp b/alib2algo/src/automaton/convert/ToGrammarLeftRG.cpp
index 4c4d1d1d00..511c03ec2e 100644
--- a/alib2algo/src/automaton/convert/ToGrammarLeftRG.cpp
+++ b/alib2algo/src/automaton/convert/ToGrammarLeftRG.cpp
@@ -16,10 +16,6 @@ namespace automaton {
 
 namespace convert {
 
-grammar::LeftRG < > ToGrammarLeftRG::convert(const automaton::Automaton& automaton) {
-	return dispatch(automaton.getData());
-}
-
 grammar::LeftRG < > ToGrammarLeftRG::convert(const automaton::NFA < > & automaton) {
 	ext::map<DefaultStateType, DefaultSymbolType> nonterminalMap;
 	// step 2
@@ -65,8 +61,6 @@ grammar::LeftRG < > ToGrammarLeftRG::convert(const automaton::NFA < > & automato
 	return grammar;
 }
 
-auto ToGrammarLeftRGNFA = registration::OverloadRegister < ToGrammarLeftRG, grammar::LeftRG < >, automaton::NFA < >  >(ToGrammarLeftRG::convert);
-
 grammar::LeftRG < > ToGrammarLeftRG::convert(const automaton::DFA<>& automaton) {
 	ext::map<DefaultStateType, DefaultSymbolType> nonterminalMap;
 	// step 2
@@ -110,7 +104,8 @@ grammar::LeftRG < > ToGrammarLeftRG::convert(const automaton::DFA<>& automaton)
 	return grammar;
 }
 
-auto ToGrammarLeftRGDFA = registration::OverloadRegister < ToGrammarLeftRG, grammar::LeftRG < >, automaton::DFA < > >( ToGrammarLeftRG::convert );
+auto ToGrammarLeftRGNFA = registration::AbstractRegister < ToGrammarLeftRG, grammar::LeftRG < >, const automaton::NFA < > & > ( ToGrammarLeftRG::convert );
+auto ToGrammarLeftRGDFA = registration::AbstractRegister < ToGrammarLeftRG, grammar::LeftRG < >, const automaton::DFA < > & > ( ToGrammarLeftRG::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/automaton/convert/ToGrammarLeftRG.h b/alib2algo/src/automaton/convert/ToGrammarLeftRG.h
index 057de30a6f..bd95158ee6 100644
--- a/alib2algo/src/automaton/convert/ToGrammarLeftRG.h
+++ b/alib2algo/src/automaton/convert/ToGrammarLeftRG.h
@@ -8,14 +8,10 @@
 #ifndef __TO_GRAMMAR_LEFT_RG_H__
 #define __TO_GRAMMAR_LEFT_RG_H__
 
-#include <core/multipleDispatch.hpp>
-
 #include <grammar/Regular/LeftRG.h>
 #include <automaton/FSM/NFA.h>
 #include <automaton/FSM/DFA.h>
 
-#include <automaton/Automaton.h>
-
 namespace automaton {
 
 namespace convert {
@@ -24,14 +20,12 @@ namespace convert {
  * Finite automaton to right regular grammar converter.
  * Source: My own :)
  */
-class ToGrammarLeftRG : public alib::SingleDispatch<ToGrammarLeftRG, grammar::LeftRG < >, const automaton::AutomatonBase &> {
+class ToGrammarLeftRG {
 public:
 	/**
 	 * Performs conversion.
 	 * @return left regular grammar equivalent to source automaton.
 	 */
-	static grammar::LeftRG < > convert(const automaton::Automaton& automaton);
-
 	static grammar::LeftRG < > convert(const automaton::NFA < > & automaton);
 	static grammar::LeftRG < > convert(const automaton::DFA<>& automaton);
 };
diff --git a/alib2algo/src/automaton/convert/ToGrammarRightRG.cpp b/alib2algo/src/automaton/convert/ToGrammarRightRG.cpp
index 0c17f756b8..b4acef5b64 100644
--- a/alib2algo/src/automaton/convert/ToGrammarRightRG.cpp
+++ b/alib2algo/src/automaton/convert/ToGrammarRightRG.cpp
@@ -13,10 +13,6 @@ namespace automaton {
 
 namespace convert {
 
-grammar::RightRG < > ToGrammarRightRG::convert(const automaton::Automaton& automaton) {
-	return dispatch(automaton.getData());
-}
-
 grammar::RightRG < > ToGrammarRightRG::convert(const automaton::NFA < > & automaton) {
 	ext::map<DefaultStateType, DefaultSymbolType> nonterminalMap;
 
@@ -58,8 +54,6 @@ grammar::RightRG < > ToGrammarRightRG::convert(const automaton::NFA < > & automa
 	return grammar;
 }
 
-auto ToGrammarRightRGNFA = registration::OverloadRegister < ToGrammarRightRG, grammar::RightRG < >, automaton::NFA < >  >(ToGrammarRightRG::convert);
-
 grammar::RightRG < > ToGrammarRightRG::convert(const automaton::DFA<>& automaton) {
 	ext::map<DefaultStateType, DefaultSymbolType> nonterminalMap;
 
@@ -101,7 +95,8 @@ grammar::RightRG < > ToGrammarRightRG::convert(const automaton::DFA<>& automaton
 	return grammar;
 }
 
-auto ToGrammarRightRGDFA = registration::OverloadRegister < ToGrammarRightRG, grammar::RightRG < >, automaton::DFA < > >( ToGrammarRightRG::convert );
+auto ToGrammarRightRGNFA = registration::AbstractRegister < ToGrammarRightRG, grammar::RightRG < >, const automaton::NFA < > & > ( ToGrammarRightRG::convert );
+auto ToGrammarRightRGDFA = registration::AbstractRegister < ToGrammarRightRG, grammar::RightRG < >, const automaton::DFA < > & > ( ToGrammarRightRG::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/automaton/convert/ToGrammarRightRG.h b/alib2algo/src/automaton/convert/ToGrammarRightRG.h
index 41401a796d..a6b7f54e44 100644
--- a/alib2algo/src/automaton/convert/ToGrammarRightRG.h
+++ b/alib2algo/src/automaton/convert/ToGrammarRightRG.h
@@ -8,14 +8,10 @@
 #ifndef __TO_GRAMMAR_RIGHT_RG_H__
 #define __TO_GRAMMAR_RIGHT_RG_H__
 
-#include <core/multipleDispatch.hpp>
-
 #include <grammar/Regular/RightRG.h>
 #include <automaton/FSM/NFA.h>
 #include <automaton/FSM/DFA.h>
 
-#include <automaton/Automaton.h>
-
 namespace automaton {
 
 namespace convert {
@@ -24,14 +20,12 @@ namespace convert {
  * Finite automaton to right regular grammar converter.
  * Source: Melichar 2.104
  */
-class ToGrammarRightRG : public alib::SingleDispatch<ToGrammarRightRG, grammar::RightRG < >, const automaton::AutomatonBase &> {
+class ToGrammarRightRG {
 public:
 	/**
 	 * Performs conversion.
 	 * @return left regular grammar equivalent to source automaton.
 	 */
-	static grammar::RightRG < > convert(const automaton::Automaton& automaton);
-
 	static grammar::RightRG < > convert(const automaton::NFA < > & automaton);
 	static grammar::RightRG < > convert(const automaton::DFA<>& automaton);
 };
diff --git a/alib2algo/src/automaton/convert/ToPostfixPushdownAutomaton.cpp b/alib2algo/src/automaton/convert/ToPostfixPushdownAutomaton.cpp
index 47a16b6a80..adee3fdb78 100644
--- a/alib2algo/src/automaton/convert/ToPostfixPushdownAutomaton.cpp
+++ b/alib2algo/src/automaton/convert/ToPostfixPushdownAutomaton.cpp
@@ -25,10 +25,6 @@ namespace automaton {
 
 namespace convert {
 
-automaton::Automaton ToPostfixPushdownAutomaton::convert ( const automaton::Automaton & automaton ) {
-	return dispatch ( automaton.getData ( ) );
-}
-
 automaton::DPDA < > ToPostfixPushdownAutomaton::convert ( const automaton::DFTA < > & dfta ) {
 	automaton::DPDA < > automaton(label::InitialStateLabel::instance < DefaultStateType > ( ), alphabet::BottomOfTheStackSymbol::instance < DefaultSymbolType > ( ));
 
@@ -101,8 +97,8 @@ automaton::NPDA < > ToPostfixPushdownAutomaton::convert ( const automaton::NFTA
 	return automaton;
 }
 
-auto ToAutomatonDFTA = registration::OverloadRegister < ToPostfixPushdownAutomaton, automaton::DPDA < >, automaton::DFTA < > > ( ToPostfixPushdownAutomaton::convert );
-auto ToAutomatonNFTA = registration::OverloadRegister < ToPostfixPushdownAutomaton, automaton::NPDA < >, automaton::NFTA < > > ( ToPostfixPushdownAutomaton::convert );
+auto ToAutomatonDFTA = registration::AbstractRegister < ToPostfixPushdownAutomaton, automaton::DPDA < >, const automaton::DFTA < > & > ( ToPostfixPushdownAutomaton::convert );
+auto ToAutomatonNFTA = registration::AbstractRegister < ToPostfixPushdownAutomaton, automaton::NPDA < >, const automaton::NFTA < > & > ( ToPostfixPushdownAutomaton::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/automaton/convert/ToPostfixPushdownAutomaton.h b/alib2algo/src/automaton/convert/ToPostfixPushdownAutomaton.h
index b935b6c380..6e9c9a4588 100644
--- a/alib2algo/src/automaton/convert/ToPostfixPushdownAutomaton.h
+++ b/alib2algo/src/automaton/convert/ToPostfixPushdownAutomaton.h
@@ -8,9 +8,6 @@
 #ifndef AUTOMATON_TO_AUTOMATON_H_
 #define AUTOMATON_TO_AUTOMATON_H_
 
-#include <core/multipleDispatch.hpp>
-
-#include <automaton/Automaton.h>
 #include <automaton/TA/DFTA.h>
 #include <automaton/TA/NFTA.h>
 #include <automaton/PDA/NPDA.h>
@@ -20,14 +17,12 @@ namespace automaton {
 
 namespace convert {
 
-class ToPostfixPushdownAutomaton : public alib::SingleDispatch < ToPostfixPushdownAutomaton, automaton::Automaton, const automaton::AutomatonBase & > {
+class ToPostfixPushdownAutomaton {
 public:
 	/**
 	 * Performs conversion.
 	 * @return PDA equivalent to original finite tree automaton reading linearized postfix tree
 	 */
-	static automaton::Automaton convert ( const automaton::Automaton & automaton );
-
 	static automaton::DPDA < > convert ( const automaton::DFTA < > & dfta );
 
 	static automaton::NPDA < > convert ( const automaton::NFTA < > & nfta );
diff --git a/alib2algo/src/automaton/convert/ToRegExpAlgebraic.cpp b/alib2algo/src/automaton/convert/ToRegExpAlgebraic.cpp
index 4a08999697..63981fc7ff 100644
--- a/alib2algo/src/automaton/convert/ToRegExpAlgebraic.cpp
+++ b/alib2algo/src/automaton/convert/ToRegExpAlgebraic.cpp
@@ -20,10 +20,6 @@ namespace automaton {
 
 namespace convert {
 
-regexp::RegExp ToRegExpAlgebraic::convert(const automaton::Automaton& automaton) {
-	return dispatch(automaton.getData());
-}
-
 regexp::UnboundedRegExp < > ToRegExpAlgebraic::convert( const automaton::EpsilonNFA < > & automaton ) {
 	equations::RightRegularEquationSolver < DefaultSymbolType > solver;
 
@@ -51,8 +47,6 @@ regexp::UnboundedRegExp < > ToRegExpAlgebraic::convert( const automaton::Epsilon
 	return solver.solve( DefaultSymbolType( automaton.getInitialState() ) );
 }
 
-auto ToRegExpAlgebraicEpsilonNFA = registration::OverloadRegister < ToRegExpAlgebraic, regexp::UnboundedRegExp < >, automaton::EpsilonNFA < > > ( ToRegExpAlgebraic::convert );
-
 regexp::UnboundedRegExp < > ToRegExpAlgebraic::convert( const automaton::MultiInitialStateNFA < > & automaton ) {
 	equations::RightRegularEquationSolver < DefaultSymbolType > solver;
 
@@ -82,8 +76,6 @@ regexp::UnboundedRegExp < > ToRegExpAlgebraic::convert( const automaton::MultiIn
 	return regexp::UnboundedRegExp < > { regexp::UnboundedRegExpStructure < DefaultSymbolType > ( alternation ) };
 }
 
-auto ToRegExpAlgebraicMultiInitialStateNFA = registration::OverloadRegister < ToRegExpAlgebraic, regexp::UnboundedRegExp < >, automaton::MultiInitialStateNFA < > > ( ToRegExpAlgebraic::convert );
-
 regexp::UnboundedRegExp < > ToRegExpAlgebraic::convert( const automaton::NFA < > & automaton ) {
 	equations::RightRegularEquationSolver < DefaultSymbolType > solver;
 
@@ -105,8 +97,6 @@ regexp::UnboundedRegExp < > ToRegExpAlgebraic::convert( const automaton::NFA < >
 	return solver.solve( DefaultSymbolType( automaton.getInitialState() ) );
 }
 
-auto ToRegExpAlgebraicNFA = registration::OverloadRegister < ToRegExpAlgebraic, regexp::UnboundedRegExp < >, automaton::NFA < > > ( ToRegExpAlgebraic::convert );
-
 regexp::UnboundedRegExp < > ToRegExpAlgebraic::convert( const automaton::DFA < > & automaton ) {
 	equations::RightRegularEquationSolver < DefaultSymbolType > solver;
 
@@ -126,7 +116,10 @@ regexp::UnboundedRegExp < > ToRegExpAlgebraic::convert( const automaton::DFA < >
 	return solver.solve( DefaultSymbolType( automaton.getInitialState() ) );
 }
 
-auto ToRegExpAlgebraicDFA = registration::OverloadRegister < ToRegExpAlgebraic, regexp::UnboundedRegExp < >, automaton::DFA < > > ( ToRegExpAlgebraic::convert );
+auto ToRegExpAlgebraicEpsilonNFA = registration::AbstractRegister < ToRegExpAlgebraic, regexp::UnboundedRegExp < >, const automaton::EpsilonNFA < > & > ( ToRegExpAlgebraic::convert );
+auto ToRegExpAlgebraicMultiInitialStateNFA = registration::AbstractRegister < ToRegExpAlgebraic, regexp::UnboundedRegExp < >, const automaton::MultiInitialStateNFA < > & > ( ToRegExpAlgebraic::convert );
+auto ToRegExpAlgebraicNFA = registration::AbstractRegister < ToRegExpAlgebraic, regexp::UnboundedRegExp < >, const automaton::NFA < > & > ( ToRegExpAlgebraic::convert );
+auto ToRegExpAlgebraicDFA = registration::AbstractRegister < ToRegExpAlgebraic, regexp::UnboundedRegExp < >, const automaton::DFA < > & > ( ToRegExpAlgebraic::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/automaton/convert/ToRegExpAlgebraic.h b/alib2algo/src/automaton/convert/ToRegExpAlgebraic.h
index 72b78b383d..d96b39e7f4 100644
--- a/alib2algo/src/automaton/convert/ToRegExpAlgebraic.h
+++ b/alib2algo/src/automaton/convert/ToRegExpAlgebraic.h
@@ -12,11 +12,7 @@
 #include <map>
 #include <queue>
 
-#include <core/multipleDispatch.hpp>
-
-#include <regexp/RegExp.h>
 #include <regexp/unbounded/UnboundedRegExp.h>
-#include <automaton/Automaton.h>
 #include <automaton/AutomatonFeatures.h>
 
 namespace automaton {
@@ -30,14 +26,12 @@ namespace convert {
  * Converts FA to RE using Brzozowski's algebraic method using right regular equations.
  * Source : Melichar 2.122
  */
-class ToRegExpAlgebraic : public alib::SingleDispatch<ToRegExpAlgebraic, regexp::RegExp, const automaton::AutomatonBase &> {
+class ToRegExpAlgebraic {
 public:
 	/**
 	 * Performs conversion.
 	 * @return regular expression equivalent to input automaton.
 	 */
-	static regexp::RegExp convert(const automaton::Automaton& automaton);
-
 	static regexp::UnboundedRegExp < > convert(const automaton::EpsilonNFA < > & automaton);
 	static regexp::UnboundedRegExp < > convert(const automaton::MultiInitialStateNFA < > & automaton);
 	static regexp::UnboundedRegExp < > convert(const automaton::NFA < > & automaton);
diff --git a/alib2algo/src/automaton/convert/ToRegExpStateElimination.cpp b/alib2algo/src/automaton/convert/ToRegExpStateElimination.cpp
index 6c74aea492..3dd0819a54 100644
--- a/alib2algo/src/automaton/convert/ToRegExpStateElimination.cpp
+++ b/alib2algo/src/automaton/convert/ToRegExpStateElimination.cpp
@@ -7,10 +7,10 @@
 
 #include "ToRegExpStateElimination.h"
 
-#include "../../regexp/simplify/RegExpOptimize.h"
-#include "../../regexp/transform/RegExpAlternate.h"
-#include "../../regexp/transform/RegExpConcatenate.h"
-#include "../../regexp/transform/RegExpIterate.h"
+#include <regexp/simplify/RegExpOptimize.h>
+#include <regexp/transform/RegExpAlternate.h>
+#include <regexp/transform/RegExpConcatenate.h>
+#include <regexp/transform/RegExpIterate.h>
 
 #include <common/createUnique.hpp>
 
@@ -21,10 +21,6 @@ namespace automaton {
 
 namespace convert {
 
-regexp::RegExp ToRegExpStateElimination::convert(const automaton::Automaton& automaton) {
-	return dispatch(automaton.getData());
-}
-
 template<class T>
 regexp::UnboundedRegExp < > ToRegExpStateElimination::convert(const T& automaton) {
 	if(automaton.getFinalStates().size() == 0)
@@ -49,12 +45,12 @@ regexp::UnboundedRegExp < > ToRegExpStateElimination::convert(const T& automaton
 	return regexp::UnboundedRegExp < > (regexp::simplify::RegExpOptimize::optimize(initialToFinalState));
 }
 
-auto ToRegExpStateEliminationEpsilonNFA = registration::OverloadRegister < ToRegExpStateElimination, regexp::UnboundedRegExp < >, automaton::EpsilonNFA < > >(ToRegExpStateElimination::convert);
-auto ToRegExpStateEliminationMultiInitialStateNFA = registration::OverloadRegister < ToRegExpStateElimination, regexp::UnboundedRegExp < >, automaton::MultiInitialStateNFA < > >(ToRegExpStateElimination::convert);
-auto ToRegExpStateEliminationNFA = registration::OverloadRegister < ToRegExpStateElimination, regexp::UnboundedRegExp < >, automaton::NFA < > >(ToRegExpStateElimination::convert);
-auto ToRegExpStateEliminationDFA = registration::OverloadRegister < ToRegExpStateElimination, regexp::UnboundedRegExp < >, automaton::DFA < > >(ToRegExpStateElimination::convert);
-auto ToRegExpStateEliminationExtendedNFA = registration::OverloadRegister < ToRegExpStateElimination, regexp::UnboundedRegExp < >, automaton::ExtendedNFA < > >(ToRegExpStateElimination::convert);
-auto ToRegExpStateEliminationCompactNFA = registration::OverloadRegister < ToRegExpStateElimination, regexp::UnboundedRegExp < >, automaton::CompactNFA < > >(ToRegExpStateElimination::convert);
+auto ToRegExpStateEliminationEpsilonNFA = registration::AbstractRegister < ToRegExpStateElimination, regexp::UnboundedRegExp < >, const automaton::EpsilonNFA < > & >(ToRegExpStateElimination::convert);
+auto ToRegExpStateEliminationMultiInitialStateNFA = registration::AbstractRegister < ToRegExpStateElimination, regexp::UnboundedRegExp < >, const automaton::MultiInitialStateNFA < > & >(ToRegExpStateElimination::convert);
+auto ToRegExpStateEliminationNFA = registration::AbstractRegister < ToRegExpStateElimination, regexp::UnboundedRegExp < >, const automaton::NFA < > & >(ToRegExpStateElimination::convert);
+auto ToRegExpStateEliminationDFA = registration::AbstractRegister < ToRegExpStateElimination, regexp::UnboundedRegExp < >, const automaton::DFA < > & >(ToRegExpStateElimination::convert);
+auto ToRegExpStateEliminationExtendedNFA = registration::AbstractRegister < ToRegExpStateElimination, regexp::UnboundedRegExp < >, const automaton::ExtendedNFA < > & >(ToRegExpStateElimination::convert);
+auto ToRegExpStateEliminationCompactNFA = registration::AbstractRegister < ToRegExpStateElimination, regexp::UnboundedRegExp < >, const automaton::CompactNFA < > & >(ToRegExpStateElimination::convert);
 
 automaton::ExtendedNFA < > ToRegExpStateElimination::eliminateState(const automaton::ExtendedNFA < > & extendedAutomaton, const DefaultStateType& q) {
 	automaton::ExtendedNFA < > newAutomaton(extendedAutomaton.getInitialState()); // sure that q is neither initial nor final (follows from step 2 - extending ExtendedNFA)
diff --git a/alib2algo/src/automaton/convert/ToRegExpStateElimination.h b/alib2algo/src/automaton/convert/ToRegExpStateElimination.h
index 7df66ecd71..c4a3cb5e7e 100644
--- a/alib2algo/src/automaton/convert/ToRegExpStateElimination.h
+++ b/alib2algo/src/automaton/convert/ToRegExpStateElimination.h
@@ -8,12 +8,8 @@
 #ifndef TO_REG_EXP_STATE_ELIMINATION_H_
 #define TO_REG_EXP_STATE_ELIMINATION_H_
 
-#include <core/multipleDispatch.hpp>
-
-#include <regexp/RegExp.h>
 #include <regexp/unbounded/UnboundedRegExp.h>
 
-#include <automaton/Automaton.h>
 #include <automaton/FSM/DFA.h>
 #include <automaton/FSM/NFA.h>
 #include <automaton/FSM/MultiInitialStateNFA.h>
@@ -28,15 +24,13 @@ namespace convert {
  * Converts FSM to RE using State Elimination algorithm.
  * Source: Melichar 2.118
  */
-class ToRegExpStateElimination : public alib::SingleDispatch<ToRegExpStateElimination, regexp::RegExp, const automaton::AutomatonBase &> {
+class ToRegExpStateElimination {
 public:
 	/**
 	 * Performs conversion.
 	 * @param automaton automaton to convert
 	 * @return regular expression equivalent to source NFA.
 	 */
-	static regexp::RegExp convert(const automaton::Automaton& automaton);
-
 	template<class T>
 	static regexp::UnboundedRegExp < > convert(const T& automaton);
 
diff --git a/alib2algo/src/grammar/convert/ToAutomaton.cpp b/alib2algo/src/grammar/convert/ToAutomaton.cpp
index fe393a9bbd..e76d5f55e4 100644
--- a/alib2algo/src/grammar/convert/ToAutomaton.cpp
+++ b/alib2algo/src/grammar/convert/ToAutomaton.cpp
@@ -16,10 +16,6 @@ namespace grammar {
 
 namespace convert {
 
-automaton::Automaton ToAutomaton::convert(const grammar::Grammar& grammar) {
-	 return dispatch(grammar.getData());
-}
-
 automaton::NFA < > ToAutomaton::convert(const grammar::LeftRG < > & grammar) {
 	ext::map<DefaultSymbolType, DefaultStateType> stateMap;
 	ext::set<DefaultStateType> states;
@@ -61,8 +57,6 @@ automaton::NFA < > ToAutomaton::convert(const grammar::LeftRG < > & grammar) {
 	return automaton;
 }
 
-auto ToAutomatonLeftRG = registration::OverloadRegister < ToAutomaton, automaton::NFA < >, grammar::LeftRG < > > ( ToAutomaton::convert );
-
 automaton::NFA < > ToAutomaton::convert(const grammar::RightRG < > & grammar) {
 	ext::map<DefaultSymbolType, DefaultStateType> stateMap;
 	ext::set<DefaultStateType> states;
@@ -105,8 +99,6 @@ automaton::NFA < > ToAutomaton::convert(const grammar::RightRG < > & grammar) {
 	return automaton;
 }
 
-auto ToAutomatonRightRG = registration::OverloadRegister < ToAutomaton, automaton::NFA < >, grammar::RightRG < > > ( ToAutomaton::convert );
-
 template <class T>
 automaton::NPDA < > ToAutomaton::convert(const T& grammar) {
 	automaton::NPDA < > automaton(label::InitialStateLabel::instance < DefaultStateType > ( ), grammar.getInitialSymbol());
@@ -127,8 +119,10 @@ automaton::NPDA < > ToAutomaton::convert(const T& grammar) {
 	return automaton;
 }
 
-auto ToAutomatonCFG = registration::OverloadRegister < ToAutomaton, automaton::NPDA < >, grammar::CFG < > > ( ToAutomaton::convert );
-auto ToAutomatonEpsilonFreeCFG = registration::OverloadRegister < ToAutomaton, automaton::NPDA < >, grammar::EpsilonFreeCFG < > > ( ToAutomaton::convert );
+auto ToAutomatonLeftRG = registration::AbstractRegister < ToAutomaton, automaton::NFA < >, const grammar::LeftRG < > & > ( ToAutomaton::convert );
+auto ToAutomatonRightRG = registration::AbstractRegister < ToAutomaton, automaton::NFA < >, const grammar::RightRG < > & > ( ToAutomaton::convert );
+auto ToAutomatonCFG = registration::AbstractRegister < ToAutomaton, automaton::NPDA < >, const grammar::CFG < > & > ( ToAutomaton::convert );
+auto ToAutomatonEpsilonFreeCFG = registration::AbstractRegister < ToAutomaton, automaton::NPDA < >, const grammar::EpsilonFreeCFG < > & > ( ToAutomaton::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/grammar/convert/ToAutomaton.h b/alib2algo/src/grammar/convert/ToAutomaton.h
index 3c198b0306..541b154f79 100644
--- a/alib2algo/src/grammar/convert/ToAutomaton.h
+++ b/alib2algo/src/grammar/convert/ToAutomaton.h
@@ -8,15 +8,11 @@
 #ifndef _GRAMMAR_TO_AUTOMATON_H_
 #define _GRAMMAR_TO_AUTOMATON_H_
 
-#include <core/multipleDispatch.hpp>
-
-#include <grammar/Grammar.h>
 #include <grammar/Regular/LeftRG.h>
 #include <grammar/Regular/RightRG.h>
 #include <grammar/ContextFree/CFG.h>
 #include <grammar/ContextFree/EpsilonFreeCFG.h>
 
-#include <automaton/Automaton.h>
 #include <automaton/FSM/NFA.h>
 #include <automaton/PDA/NPDA.h>
 
@@ -28,15 +24,13 @@ namespace convert {
  * Converts regular grammar to nondeterministic finite automaton.
  * Sources: Melichar 2.98 (RightRG -> NFA) and 2.102 (LeftRG -> NFA).
  */
-class ToAutomaton : public alib::SingleDispatch<ToAutomaton, automaton::Automaton, const grammar::GrammarBase &> {
+class ToAutomaton {
 public:
 	/**
 	 * Performs conversion.
 	 * @param grammar Regular grammar to convert.
 	 * @return FSM equivalent to source grammar.
 	 */
-	static automaton::Automaton convert(const grammar::Grammar& grammar);
-
 	static automaton::NFA < > convert(const grammar::LeftRG < > & grammar);
 	static automaton::NFA < > convert(const grammar::RightRG < > & grammar);
 
diff --git a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp
index 3329e1c26e..5012256a8e 100644
--- a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp
+++ b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp
@@ -11,12 +11,8 @@ namespace grammar {
 
 namespace convert {
 
-automaton::Automaton ToAutomatonBottomUp::convert(const grammar::Grammar& grammar) {
-	 return dispatch(grammar.getData());
-}
-
-auto ToAutomatonBottomUpCFG = registration::OverloadRegister < ToAutomatonBottomUp, automaton::NPDA < >, grammar::CFG < > > ( ToAutomatonBottomUp::convert );
-auto ToAutomatonBottomUpEpsilonFreeCFG = registration::OverloadRegister < ToAutomatonBottomUp, automaton::NPDA < >, grammar::EpsilonFreeCFG < > > ( ToAutomatonBottomUp::convert );
+auto ToAutomatonBottomUpCFG = registration::AbstractRegister < ToAutomatonBottomUp, automaton::NPDA < >, const grammar::CFG < > & > ( ToAutomatonBottomUp::convert );
+auto ToAutomatonBottomUpEpsilonFreeCFG = registration::AbstractRegister < ToAutomatonBottomUp, automaton::NPDA < >, const grammar::EpsilonFreeCFG < > & > ( ToAutomatonBottomUp::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.h b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.h
index 206898013c..03be378593 100644
--- a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.h
+++ b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.h
@@ -8,13 +8,10 @@
 #ifndef _GRAMMAR_TO_AUTOMATON_BOTTOMUP_H_
 #define _GRAMMAR_TO_AUTOMATON_BOTTOMUP_H_
 
-#include <core/multipleDispatch.hpp>
-
 #include <grammar/Grammar.h>
 #include <grammar/ContextFree/CFG.h>
 #include <grammar/ContextFree/EpsilonFreeCFG.h>
 
-#include <automaton/Automaton.h>
 #include <automaton/PDA/NPDA.h>
 
 #include <alphabet/BottomOfTheStackSymbol.h>
@@ -27,13 +24,11 @@ namespace convert {
 
 /**
  */
-class ToAutomatonBottomUp : public alib::SingleDispatch<ToAutomatonBottomUp, automaton::Automaton, const grammar::GrammarBase &> {
+class ToAutomatonBottomUp {
 public:
 	/**
 	 * Performs conversion.
 	 */
-	static automaton::Automaton convert(const grammar::Grammar& grammar);
-
 	template <class T, class SymbolType = typename grammar::SymbolTypeOfGrammar < T >, class EpsilonType = DefaultEpsilonType, class StateType = DefaultStateType >
 	static automaton::NPDA < SymbolType, EpsilonType, SymbolType, StateType > convert(const T& grammar);
 };
diff --git a/alib2algo/src/grammar/convert/ToRegExpAlgebraic.cpp b/alib2algo/src/grammar/convert/ToRegExpAlgebraic.cpp
index bb1c3d3027..1aa50c530d 100644
--- a/alib2algo/src/grammar/convert/ToRegExpAlgebraic.cpp
+++ b/alib2algo/src/grammar/convert/ToRegExpAlgebraic.cpp
@@ -12,12 +12,8 @@ namespace grammar {
 
 namespace convert {
 
-regexp::RegExp ToRegExpAlgebraic::convert(const grammar::Grammar& grammar) {
-	return dispatch(grammar.getData());
-}
-
-auto ToRegExpAlgebraicLeftRG = registration::OverloadRegister < ToRegExpAlgebraic, regexp::UnboundedRegExp < >, grammar::LeftRG < > > ( ToRegExpAlgebraic::convert );
-auto ToRegExpAlgebraicRightRG = registration::OverloadRegister < ToRegExpAlgebraic, regexp::UnboundedRegExp < >, grammar::RightRG < > > ( ToRegExpAlgebraic::convert );
+auto ToRegExpAlgebraicLeftRG = registration::AbstractRegister < ToRegExpAlgebraic, regexp::UnboundedRegExp < >, const grammar::LeftRG < > & > ( ToRegExpAlgebraic::convert );
+auto ToRegExpAlgebraicRightRG = registration::AbstractRegister < ToRegExpAlgebraic, regexp::UnboundedRegExp < >, const grammar::RightRG < > & > ( ToRegExpAlgebraic::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/grammar/convert/ToRegExpAlgebraic.h b/alib2algo/src/grammar/convert/ToRegExpAlgebraic.h
index b8a59b94f3..9865e46bfe 100644
--- a/alib2algo/src/grammar/convert/ToRegExpAlgebraic.h
+++ b/alib2algo/src/grammar/convert/ToRegExpAlgebraic.h
@@ -8,14 +8,9 @@
 #ifndef GRAMMAR_TO_REG_EXP_ALGEBRAIC_H_
 #define GRAMMAR_TO_REG_EXP_ALGEBRAIC_H_
 
-#include <core/multipleDispatch.hpp>
-
-#include <grammar/Grammar.h>
 #include <grammar/Regular/RightRG.h>
 #include <grammar/Regular/LeftRG.h>
 
-#include <regexp/RegExp.h>
-
 #include <equations/LeftRegularEquationSolver.h>
 #include <equations/RightRegularEquationSolver.h>
 
@@ -26,14 +21,12 @@ namespace grammar {
 
 namespace convert {
 
-class ToRegExpAlgebraic : public alib::SingleDispatch<ToRegExpAlgebraic, regexp::RegExp, const grammar::GrammarBase &> {
+class ToRegExpAlgebraic {
 public:
 	/**
 	 * @return regexp equivalent to source right regular grammar.
 	 * @param grammar Grammar to convert
 	 */
-	static regexp::RegExp convert(const grammar::Grammar& grammar);
-
 	template < class SymbolType >
 	static regexp::UnboundedRegExp < SymbolType > convert(const grammar::RightRG < SymbolType > & grammar);
 	template < class SymbolType >
diff --git a/alib2algo/src/regexp/convert/ToAutomatonDerivation.cpp b/alib2algo/src/regexp/convert/ToAutomatonDerivation.cpp
index 71cf366f48..403ba7c433 100644
--- a/alib2algo/src/regexp/convert/ToAutomatonDerivation.cpp
+++ b/alib2algo/src/regexp/convert/ToAutomatonDerivation.cpp
@@ -24,10 +24,6 @@ namespace regexp {
 
 namespace convert {
 
-automaton::DFA<> ToAutomatonDerivation::convert(const regexp::RegExp& regexp) {
-	return dispatch(regexp.getData());
-}
-
 template<class T>
 automaton::DFA<> ToAutomatonDerivation::convert(const T& regexp) {
 	// 1.
@@ -100,8 +96,8 @@ automaton::DFA<> ToAutomatonDerivation::convert(const T& regexp) {
 	return automaton;
 }
 
-auto ToAutomatonDerivationFormalRegExp = registration::OverloadRegister < ToAutomatonDerivation, automaton::DFA < >, regexp::FormalRegExp < > > ( ToAutomatonDerivation::convert );
-auto ToAutomatonDerivationUnboundedRegExp = registration::OverloadRegister < ToAutomatonDerivation, automaton::DFA < >, regexp::UnboundedRegExp < > > ( ToAutomatonDerivation::convert );
+auto ToAutomatonDerivationFormalRegExp = registration::AbstractRegister < ToAutomatonDerivation, automaton::DFA < >, const regexp::FormalRegExp < > & > ( ToAutomatonDerivation::convert );
+auto ToAutomatonDerivationUnboundedRegExp = registration::AbstractRegister < ToAutomatonDerivation, automaton::DFA < >, const regexp::UnboundedRegExp < > & > ( ToAutomatonDerivation::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/regexp/convert/ToAutomatonDerivation.h b/alib2algo/src/regexp/convert/ToAutomatonDerivation.h
index 8e7328a9f8..7c0f253771 100644
--- a/alib2algo/src/regexp/convert/ToAutomatonDerivation.h
+++ b/alib2algo/src/regexp/convert/ToAutomatonDerivation.h
@@ -8,9 +8,6 @@
 #ifndef TO_AUTOMATON_DERIVATION_H_
 #define TO_AUTOMATON_DERIVATION_H_
 
-#include <core/multipleDispatch.hpp>
-
-#include <regexp/RegExp.h>
 #include <regexp/formal/FormalRegExp.h>
 #include <regexp/unbounded/UnboundedRegExp.h>
 
@@ -24,14 +21,12 @@ namespace convert {
  * Converts regular expression to finite automaton using BrzozowskiDerivation algorithm (derivations of regular expressions).
  * Source: Melichar 2.110
  */
-class ToAutomatonDerivation : public alib::SingleDispatch<ToAutomatonDerivation, automaton::DFA<>, const regexp::RegExpBase &> {
+class ToAutomatonDerivation {
 public:
 	/**
 	 * Performs conversion.
 	 * @return FSM equivalent to original regular expression.
 	 */
-	static automaton::DFA<> convert(const regexp::RegExp& regexp);
-
 	template<class T>
 	static automaton::DFA<> convert(const T& regexp);
 };
diff --git a/alib2algo/src/regexp/convert/ToAutomatonGlushkov.cpp b/alib2algo/src/regexp/convert/ToAutomatonGlushkov.cpp
index e4fb3ec6f4..12c7d17468 100644
--- a/alib2algo/src/regexp/convert/ToAutomatonGlushkov.cpp
+++ b/alib2algo/src/regexp/convert/ToAutomatonGlushkov.cpp
@@ -8,7 +8,6 @@
 #include "ToAutomatonGlushkov.h"
 
 #include <common/DefaultStatesPairType.h>
-#include <automaton/Automaton.h>
 
 #include <global/GlobalData.h>
 
@@ -25,10 +24,6 @@ namespace regexp {
 
 namespace convert {
 
-automaton::NFA < > ToAutomatonGlushkov::convert ( const regexp::RegExp & regexp ) {
-	return dispatch ( regexp.getData ( ) );
-}
-
 automaton::NFA < > ToAutomatonGlushkov::convert ( const regexp::UnboundedRegExp < > & regexp ) {
 	DefaultStateType q0 ( DefaultStatesPairType ( ext::make_pair ( DefaultStateType ( 'q' ), DefaultStateType ( 0 ) ) ) );
 	automaton::NFA < > automaton ( q0 );
@@ -82,13 +77,12 @@ automaton::NFA < > ToAutomatonGlushkov::convert ( const regexp::UnboundedRegExp
 	return automaton;
 }
 
-auto ToAutomatonGlushkovUnboundedRegExp = registration::OverloadRegister < ToAutomatonGlushkov, automaton::NFA < >, regexp::UnboundedRegExp < > > ( ToAutomatonGlushkov::convert );
-
 automaton::NFA < > ToAutomatonGlushkov::convert ( const regexp::FormalRegExp < > & /* regexp */ ) {
 	throw exception::CommonException ( "Glushkov: Converting FormalRegExp NYI" ); // TODO
 }
 
-auto ToAutomatonGlushkovFormalRegExp = registration::OverloadRegister < ToAutomatonGlushkov, automaton::NFA < >, regexp::FormalRegExp < > > ( ToAutomatonGlushkov::convert );
+auto ToAutomatonGlushkovUnboundedRegExp = registration::AbstractRegister < ToAutomatonGlushkov, automaton::NFA < >, const regexp::UnboundedRegExp < > & > ( ToAutomatonGlushkov::convert );
+auto ToAutomatonGlushkovFormalRegExp = registration::AbstractRegister < ToAutomatonGlushkov, automaton::NFA < >, const regexp::FormalRegExp < > & > ( ToAutomatonGlushkov::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/regexp/convert/ToAutomatonGlushkov.h b/alib2algo/src/regexp/convert/ToAutomatonGlushkov.h
index bdf3273b95..c1d2797b46 100644
--- a/alib2algo/src/regexp/convert/ToAutomatonGlushkov.h
+++ b/alib2algo/src/regexp/convert/ToAutomatonGlushkov.h
@@ -8,11 +8,9 @@
 #ifndef TO_AUTOMATON_GLUSHKOV_H_
 #define TO_AUTOMATON_GLUSHKOV_H_
 
-#include <core/multipleDispatch.hpp>
 #include <map>
 
 #include <automaton/FSM/NFA.h>
-#include <regexp/RegExp.h>
 #include <regexp/formal/FormalRegExp.h>
 #include <regexp/unbounded/UnboundedRegExp.h>
 
@@ -24,15 +22,13 @@ namespace convert {
  * Converts regular expression to finite automaton using Glushkov's NFA construction algorithm.
  * Source: Melichar 2.107
  */
-class ToAutomatonGlushkov : public alib::SingleDispatch<ToAutomatonGlushkov, automaton::NFA < >, const regexp::RegExpBase & > {
+class ToAutomatonGlushkov {
 public:
 	/**
 	 * Performs conversion.
 	 * @param re Original regular expression.
 	 * @return NFA equivalent to original regular expression.
 	 */
-	static automaton::NFA < > convert(const regexp::RegExp& re);
-
 	static automaton::NFA < > convert(const regexp::UnboundedRegExp < > & re);
 	static automaton::NFA < > convert(const regexp::FormalRegExp < > & re);
 
diff --git a/alib2algo/src/regexp/convert/ToAutomatonThompson.cpp b/alib2algo/src/regexp/convert/ToAutomatonThompson.cpp
index b2aa6ca93c..df206bbe41 100644
--- a/alib2algo/src/regexp/convert/ToAutomatonThompson.cpp
+++ b/alib2algo/src/regexp/convert/ToAutomatonThompson.cpp
@@ -14,10 +14,6 @@ namespace regexp {
 
 namespace convert {
 
-automaton::EpsilonNFA < > ToAutomatonThompson::convert(const regexp::RegExp& regexp) {
-	return dispatch(regexp.getData());
-}
-
 automaton::EpsilonNFA < > ToAutomatonThompson::convert(const regexp::FormalRegExp < > & regexp) {
 	//FIXME use actual algorithms that implement product alternation and iteration of re over automata and remove terrible TERRIBLE hack with dummy initial state
 	int nextState = 1;
@@ -37,8 +33,6 @@ automaton::EpsilonNFA < > ToAutomatonThompson::convert(const regexp::FormalRegEx
 	return automaton;
 }
 
-auto ToAutomatonThompsonFormalRegExp = registration::OverloadRegister < ToAutomatonThompson, automaton::EpsilonNFA < >, regexp::FormalRegExp < > > ( ToAutomatonThompson::convert );
-
 automaton::EpsilonNFA < > ToAutomatonThompson::convert(const regexp::UnboundedRegExp < > & regexp) {
 	//FIXME use actual algorithms that implement product alternation and iteration of re over automata and remove terrible TERRIBLE hack with dummy initial state
 	int nextState = 1;
@@ -58,7 +52,8 @@ automaton::EpsilonNFA < > ToAutomatonThompson::convert(const regexp::UnboundedRe
 	return automaton;
 }
 
-auto ToAutomatonThompsonUnboundedRegExp = registration::OverloadRegister < ToAutomatonThompson, automaton::EpsilonNFA < >, regexp::UnboundedRegExp < > > ( ToAutomatonThompson::convert );
+auto ToAutomatonThompsonFormalRegExp = registration::AbstractRegister < ToAutomatonThompson, automaton::EpsilonNFA < >, const regexp::FormalRegExp < > & > ( ToAutomatonThompson::convert );
+auto ToAutomatonThompsonUnboundedRegExp = registration::AbstractRegister < ToAutomatonThompson, automaton::EpsilonNFA < >, const regexp::UnboundedRegExp < > & > ( ToAutomatonThompson::convert );
 
 // ----------------------------------------------------------------------------
 
diff --git a/alib2algo/src/regexp/convert/ToAutomatonThompson.h b/alib2algo/src/regexp/convert/ToAutomatonThompson.h
index e292982a29..c6973cd0c4 100644
--- a/alib2algo/src/regexp/convert/ToAutomatonThompson.h
+++ b/alib2algo/src/regexp/convert/ToAutomatonThompson.h
@@ -8,9 +8,6 @@
 #ifndef TO_AUTOMATON_THOMPSON_H_
 #define TO_AUTOMATON_THOMPSON_H_
 
-#include <core/multipleDispatch.hpp>
-
-#include <regexp/RegExp.h>
 #include <regexp/formal/FormalRegExp.h>
 #include <regexp/formal/FormalRegExpElement.h>
 #include <regexp/unbounded/UnboundedRegExp.h>
@@ -29,15 +26,13 @@ namespace convert {
  *  http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.21.7450&rep=rep1&type=ps
  *  Melichar 2.112
  */
-class ToAutomatonThompson : public alib::SingleDispatch<ToAutomatonThompson, automaton::EpsilonNFA < >, const regexp::RegExpBase &> {
+class ToAutomatonThompson {
 public:
 	/**
 	 * Performs conversion.
 	 * @param regexp regexp to convert
 	 * @return nondeterministic finite automaton with epsilon transitions accepting language described by the regexp
 	 */
-	static automaton::EpsilonNFA < > convert(const regexp::RegExp& regexp);
-
 	static automaton::EpsilonNFA < > convert(const regexp::FormalRegExp < > & regexp);
 	static automaton::EpsilonNFA < > convert(const regexp::UnboundedRegExp < > & regexp);
 
diff --git a/alib2algo/src/regexp/convert/ToGrammarRightRGDerivation.cpp b/alib2algo/src/regexp/convert/ToGrammarRightRGDerivation.cpp
index dae122fb05..24cd5d0ae6 100644
--- a/alib2algo/src/regexp/convert/ToGrammarRightRGDerivation.cpp
+++ b/alib2algo/src/regexp/convert/ToGrammarRightRGDerivation.cpp
@@ -24,10 +24,6 @@ namespace regexp {
 
 namespace convert {
 
-grammar::RightRG < > ToGrammarRightRGDerivation::convert(const regexp::RegExp& regexp) {
-	return dispatch(regexp.getData());
-}
-
 template<class T>
 grammar::RightRG < > ToGrammarRightRGDerivation::convert(const T& regexp) {
 	// 1.
@@ -102,8 +98,8 @@ grammar::RightRG < > ToGrammarRightRGDerivation::convert(const T& regexp) {
 	return grammar;
 }
 
-auto ToGrammarRightRGDerivationUnboundedRegExp = registration::OverloadRegister < ToGrammarRightRGDerivation, grammar::RightRG < >, regexp::UnboundedRegExp < > > ( ToGrammarRightRGDerivation::convert );
-auto ToGrammarRightRGDerivationFormalRegExp = registration::OverloadRegister < ToGrammarRightRGDerivation, grammar::RightRG < >, regexp::FormalRegExp < > > ( ToGrammarRightRGDerivation::convert );
+auto ToGrammarRightRGDerivationUnboundedRegExp = registration::AbstractRegister < ToGrammarRightRGDerivation, grammar::RightRG < >, const regexp::UnboundedRegExp < > & > ( ToGrammarRightRGDerivation::convert );
+auto ToGrammarRightRGDerivationFormalRegExp = registration::AbstractRegister < ToGrammarRightRGDerivation, grammar::RightRG < >, const regexp::FormalRegExp < > & > ( ToGrammarRightRGDerivation::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/regexp/convert/ToGrammarRightRGDerivation.h b/alib2algo/src/regexp/convert/ToGrammarRightRGDerivation.h
index 1eb3fce712..b708b30217 100644
--- a/alib2algo/src/regexp/convert/ToGrammarRightRGDerivation.h
+++ b/alib2algo/src/regexp/convert/ToGrammarRightRGDerivation.h
@@ -8,10 +8,7 @@
 #ifndef TO_GRAMMAR_RIGHT_RG_DERIVATION_H_
 #define TO_GRAMMAR_RIGHT_RG_DERIVATION_H_
 
-#include <core/multipleDispatch.hpp>
-
 #include <grammar/Regular/RightRG.h>
-#include <regexp/RegExp.h>
 #include <regexp/formal/FormalRegExp.h>
 #include <regexp/unbounded/UnboundedRegExp.h>
 
@@ -23,14 +20,12 @@ namespace convert {
  * Converts reg. expression to right regular grammar using brzozowski derivation algorithm.
  * Source: Melichar 2.137
  */
-class ToGrammarRightRGDerivation : public alib::SingleDispatch<ToGrammarRightRGDerivation, grammar::RightRG < >, const regexp::RegExpBase &> {
+class ToGrammarRightRGDerivation {
 public:
 	/**
 	 * Performs conversion.
 	 * @return right regular grammar equivalent to source regexp.
 	 */
-	static grammar::RightRG < > convert(const regexp::RegExp& regexp);
-
 	template <class T>
 	static grammar::RightRG < > convert(const T& regexp);
 
diff --git a/alib2algo/src/regexp/convert/ToGrammarRightRGGlushkov.cpp b/alib2algo/src/regexp/convert/ToGrammarRightRGGlushkov.cpp
index bc04bb4cc2..ef016493b2 100644
--- a/alib2algo/src/regexp/convert/ToGrammarRightRGGlushkov.cpp
+++ b/alib2algo/src/regexp/convert/ToGrammarRightRGGlushkov.cpp
@@ -24,10 +24,6 @@ namespace regexp {
 
 namespace convert {
 
-grammar::RightRG < > ToGrammarRightRGGlushkov::convert ( const regexp::RegExp & regexp ) {
-	return dispatch ( regexp.getData ( ) );
-}
-
 grammar::RightRG < > ToGrammarRightRGGlushkov::convert ( const regexp::UnboundedRegExp < > & regexp ) {
 	DefaultSymbolType S = alphabet::InitialSymbol::instance < DefaultSymbolType > ( );
 	grammar::RightRG < > grammar ( S );
@@ -84,13 +80,12 @@ grammar::RightRG < > ToGrammarRightRGGlushkov::convert ( const regexp::Unbounded
 	return grammar;
 }
 
-auto ToGrammarRightRGGlushkovUnboundedRegExp = registration::OverloadRegister < ToGrammarRightRGGlushkov, grammar::RightRG < >, regexp::UnboundedRegExp < > > ( ToGrammarRightRGGlushkov::convert );
-
 grammar::RightRG < > ToGrammarRightRGGlushkov::convert ( const regexp::FormalRegExp < > & /* regexp */ ) {
 	throw exception::CommonException ( "Glushkov: Converting FormalRegExp NYI" ); // TODO
 }
 
-auto ToGrammarRightRGGlushkovFormalRegExp = registration::OverloadRegister < ToGrammarRightRGGlushkov, grammar::RightRG < >, regexp::FormalRegExp < > > ( ToGrammarRightRGGlushkov::convert );
+auto ToGrammarRightRGGlushkovUnboundedRegExp = registration::AbstractRegister < ToGrammarRightRGGlushkov, grammar::RightRG < >, const regexp::UnboundedRegExp < > & > ( ToGrammarRightRGGlushkov::convert );
+auto ToGrammarRightRGGlushkovFormalRegExp = registration::AbstractRegister < ToGrammarRightRGGlushkov, grammar::RightRG < >, const regexp::FormalRegExp < > & > ( ToGrammarRightRGGlushkov::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/regexp/convert/ToGrammarRightRGGlushkov.h b/alib2algo/src/regexp/convert/ToGrammarRightRGGlushkov.h
index b9659b7ea8..3fe820d47b 100644
--- a/alib2algo/src/regexp/convert/ToGrammarRightRGGlushkov.h
+++ b/alib2algo/src/regexp/convert/ToGrammarRightRGGlushkov.h
@@ -8,11 +8,7 @@
 #ifndef TO_GRAMMAR_RIGHT_RG_GLUSHKOV_H_
 #define TO_GRAMMAR_RIGHT_RG_GLUSHKOV_H_
 
-#include <core/multipleDispatch.hpp>
-
 #include <grammar/Regular/RightRG.h>
-
-#include <regexp/RegExp.h>
 #include <regexp/formal/FormalRegExp.h>
 #include <regexp/unbounded/UnboundedRegExp.h>
 
@@ -24,15 +20,13 @@ namespace convert {
  * Converts regular expression to right regular grammar using Glushkov algorithm.
  * Source: None yet.
  */
-class ToGrammarRightRGGlushkov : public alib::SingleDispatch<ToGrammarRightRGGlushkov, grammar::RightRG < >, const regexp::RegExpBase &> {
+class ToGrammarRightRGGlushkov {
 public:
 	/**
 	 * Performs conversion.
 	 * @param regexp original regular expression
 	 * @return right regular grammar equivalent to source regexp.
 	 */
-	static grammar::RightRG < > convert(const regexp::RegExp& regexp);
-
 	static grammar::RightRG < > convert(const regexp::FormalRegExp < > & regexp);
 	static grammar::RightRG < > convert(const regexp::UnboundedRegExp < > & regexp);
 };
diff --git a/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkov.cpp b/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkov.cpp
index 8f1c3ea3fc..30d8dc8304 100644
--- a/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkov.cpp
+++ b/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkov.cpp
@@ -7,7 +7,6 @@
 
 #include "ToPostfixPushdownAutomatonGlushkov.h"
 
-#include <automaton/Automaton.h>
 #include <alphabet/BottomOfTheStackSymbol.h>
 #include <alphabet/EndSymbol.h>
 
@@ -23,10 +22,6 @@ namespace rte {
 
 namespace convert {
 
-automaton::Automaton ToPostfixPushdownAutomatonGlushkov::convert ( const rte::RTE & rte ) {
-	return dispatch ( rte.getData ( ) );
-}
-
 template < class SymbolType, class RankType >
 bool ToPostfixPushdownAutomatonGlushkov::isSubstSymbolPresent ( const ext::set < common::ranked_symbol < SymbolType, RankType > > & container, const TAlphabet < SymbolType, RankType > & substAlphabet ) {
 	ext::vector < common::ranked_symbol < > > intersection;
@@ -221,9 +216,9 @@ ToPostfixPushdownAutomatonGlushkov::convert ( const rte::FormalRTE < > & rte ) {
 	return automaton;
 }
 
-auto ToPostfixPushdownAutomatonGlushkovFormalRTE = registration::OverloadRegister < ToPostfixPushdownAutomatonGlushkov,
+auto ToPostfixPushdownAutomatonGlushkovFormalRTE = registration::AbstractRegister < ToPostfixPushdownAutomatonGlushkov,
 			automaton::NPDA < DefaultSymbolType, DefaultEpsilonType, ext::variant < alphabet::BottomOfTheStackSymbol, ext::set < common::ranked_symbol < alib::Object, primitive::Unsigned > > >, DefaultStateType >,
-			rte::FormalRTE < > > ( ToPostfixPushdownAutomatonGlushkov::convert );
+			const rte::FormalRTE < > & > ( ToPostfixPushdownAutomatonGlushkov::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkov.h b/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkov.h
index 86b9bde610..e6c6636258 100644
--- a/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkov.h
+++ b/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkov.h
@@ -8,12 +8,10 @@
 #ifndef TO_POSTFIX_PUSHDOWN_AUTOMATON_GLUSHKOV_H_
 #define TO_POSTFIX_PUSHDOWN_AUTOMATON_GLUSHKOV_H_
 
-#include <core/multipleDispatch.hpp>
 #include <map>
 
 #include <automaton/PDA/NPDA.h>
 
-#include <rte/RTE.h>
 #include <rte/formal/FormalRTE.h>
 
 #include <container/ObjectsVariant.h>
@@ -27,7 +25,7 @@ namespace convert {
  * Converts regular tree expression to real-time height-deterministic pda
  * Source: Master Thesis, Pecka Tomas, CTU FIT, 2016, chapter 4.2
  */
-class ToPostfixPushdownAutomatonGlushkov : public alib::SingleDispatch < ToPostfixPushdownAutomatonGlushkov, automaton::Automaton, const rte::RTEBase & > {
+class ToPostfixPushdownAutomatonGlushkov {
 private:
 	// --------------------------------------------------------------------
 
@@ -45,8 +43,6 @@ public:
 	 * @param re Original regular tree expression.
 	 * @return rhNPDA equivalent to original regular expression.
 	 */
-	static automaton::Automaton convert ( const rte::RTE & rte );
-
 	template < class SymbolType, class RankType >
 	static automaton::NPDA < SymbolType, DefaultEpsilonType, ext::variant < alphabet::BottomOfTheStackSymbol, ext::set < common::ranked_symbol < SymbolType, RankType > > >, DefaultStateType > convert ( const rte::FormalRTE < > & rte );
 };
diff --git a/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkovNaive.cpp b/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkovNaive.cpp
index d8874ac127..b3d467503b 100644
--- a/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkovNaive.cpp
+++ b/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkovNaive.cpp
@@ -10,8 +10,6 @@
 #include <alphabet/BottomOfTheStackSymbol.h>
 #include <alphabet/EndSymbol.h>
 
-#include <automaton/Automaton.h>
-
 #include <global/GlobalData.h>
 
 #include <registration/AlgoRegistration.hpp>
@@ -24,10 +22,6 @@ namespace rte {
 
 namespace convert {
 
-automaton::NPDA < > ToPostfixPushdownAutomatonGlushkovNaive::convert ( const rte::RTE & rte ) {
-	return dispatch ( rte.getData ( ) );
-}
-
 ext::vector < DefaultSymbolType > phi ( const ext::vector < common::ranked_symbol < > > & follow ) {
 	return ext::transform < DefaultSymbolType > ( follow, []( const common::ranked_symbol < > & symbol ) { return DefaultSymbolType ( alphabet::RankedSymbol < > ( symbol ) ); } );
 }
@@ -137,7 +131,7 @@ automaton::NPDA < > ToPostfixPushdownAutomatonGlushkovNaive::convert ( const rte
 	return automaton;
 }
 
-auto ToPostfixPushdownAutomatonGlushkovNaiveFormalRTE = registration::OverloadRegister < ToPostfixPushdownAutomatonGlushkovNaive, automaton::NPDA < >, rte::FormalRTE < > > ( ToPostfixPushdownAutomatonGlushkovNaive::convert );
+auto ToPostfixPushdownAutomatonGlushkovNaiveFormalRTE = registration::AbstractRegister < ToPostfixPushdownAutomatonGlushkovNaive, automaton::NPDA < >, const rte::FormalRTE < > & > ( ToPostfixPushdownAutomatonGlushkovNaive::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkovNaive.h b/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkovNaive.h
index 327ba27f7a..bcbe8736d5 100644
--- a/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkovNaive.h
+++ b/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkovNaive.h
@@ -8,12 +8,9 @@
 #ifndef TO_POSTFIX_PUSHDOWN_AUTOMATON_GLUSHKOV_NAIVE_H_
 #define TO_POSTFIX_PUSHDOWN_AUTOMATON_GLUSHKOV_NAIVE_H_
 
-#include <core/multipleDispatch.hpp>
 #include <map>
 
-#include <automaton/FSM/NFA.h>
 #include <automaton/PDA/NPDA.h>
-#include <rte/RTE.h>
 #include <rte/formal/FormalRTE.h>
 
 // #include <rte/unbounded/UnboundedRegExp.h>
@@ -26,14 +23,13 @@ namespace convert {
  * Converts regular tree expression to real-time height-deterministic pda
  * Source: Master Thesis, Pecka Tomas, CTU FIT, 2016, chapter 4.2
  */
-class ToPostfixPushdownAutomatonGlushkovNaive : public alib::SingleDispatch < ToPostfixPushdownAutomatonGlushkovNaive, automaton::NPDA < >, const rte::RTEBase & > {
+class ToPostfixPushdownAutomatonGlushkovNaive {
 public:
 	/**
 	 * Performs conversion.
 	 * @param re Original regular tree expression.
 	 * @return rhNPDA equivalent to original regular expression.
 	 */
-	static automaton::NPDA < > convert ( const rte::RTE & rte );
 	static automaton::NPDA < > convert ( const rte::FormalRTE < > & rte );
 };
 
diff --git a/alib2algo/test-src/regexp/toAutomaton/re2faTest.cpp b/alib2algo/test-src/regexp/toAutomaton/re2faTest.cpp
index 0a26602fa8..1f38da1ac1 100644
--- a/alib2algo/test-src/regexp/toAutomaton/re2faTest.cpp
+++ b/alib2algo/test-src/regexp/toAutomaton/re2faTest.cpp
@@ -26,11 +26,11 @@ void re2faTest::tearDown() {
 
 void re2faTest::testThompson() {
 	std::string input = "a+a* b*";
-	regexp::RegExp regexp1 = alib::StringDataFactory::fromString (input);
+	regexp::UnboundedRegExp < > regexp1 = alib::StringDataFactory::fromString (input);
 
 	automaton::EpsilonNFA < > enfa1 = regexp::convert::ToAutomatonThompson::convert(regexp1);
 
-	regexp::RegExp regexp2( automaton::convert::ToRegExpAlgebraic::convert( enfa1) );
+	regexp::UnboundedRegExp < > regexp2 ( automaton::convert::ToRegExpAlgebraic::convert( enfa1) );
 
 	automaton::EpsilonNFA < > enfa2 = regexp::convert::ToAutomatonThompson::convert(regexp2);
 
@@ -48,7 +48,7 @@ void re2faTest::testThompson() {
 
 void re2faTest::testGlushkov() {
 	std::string input = "a+a*b*";
-	regexp::RegExp regexp1 = alib::StringDataFactory::fromString ( input );
+	regexp::UnboundedRegExp < > regexp1 = alib::StringDataFactory::fromString ( input );
 
 	automaton::NFA < > nfa1 = regexp::convert::ToAutomatonGlushkov::convert ( regexp1 );
 
@@ -73,11 +73,11 @@ void re2faTest::testGlushkov() {
 
 void re2faTest::testBrzozowski() {
 	std::string input = "a+a* b*";
-	regexp::RegExp regexp1 = alib::StringDataFactory::fromString (input);
+	regexp::UnboundedRegExp < > regexp1 = alib::StringDataFactory::fromString (input);
 
 	automaton::DFA<> dfa1 = regexp::convert::ToAutomatonDerivation::convert(regexp1);
 
-	regexp::RegExp regexp2( automaton::convert::ToRegExpAlgebraic::convert(dfa1));
+	regexp::UnboundedRegExp < > regexp2( automaton::convert::ToRegExpAlgebraic::convert(dfa1));
 
 	automaton::DFA<> dfa2 = regexp::convert::ToAutomatonDerivation::convert(regexp2);
 
-- 
GitLab