From 0e0b2892c692c903d0e8e9283ceb2f4997dc2169 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <peckato1@fit.cvut.cz>
Date: Fri, 19 Sep 2014 20:33:10 +0200
Subject: [PATCH] algo: rg2rg api

---
 aconversions2/src/ConversionHandler.cpp       |  10 +-
 .../rg2rg/LeftToRightRegularGrammar.cpp       | 149 +++++++++++++++++
 .../rg2rg/LeftToRightRegularGrammar.h         |  61 +++++++
 .../rg2rg/RightToLeftRegularGrammar.cpp       | 152 ++++++++++++++++++
 .../rg2rg/RightToLeftRegularGrammar.h         |  62 +++++++
 .../lrg2rrg/LeftToRightRegularGrammar.cpp     |  65 --------
 .../rg2rg/lrg2rrg/LeftToRightRegularGrammar.h |  33 ----
 .../rrg2lrg/RightToLeftRegularGrammar.cpp     |  67 --------
 .../rg2rg/rrg2lrg/RightToLeftRegularGrammar.h |  37 -----
 .../test-src/conversions/rg2rg/rg2rgTest.cpp  |  10 +-
 10 files changed, 432 insertions(+), 214 deletions(-)
 create mode 100644 alib2algo/src/conversions/rg2rg/LeftToRightRegularGrammar.cpp
 create mode 100644 alib2algo/src/conversions/rg2rg/LeftToRightRegularGrammar.h
 create mode 100644 alib2algo/src/conversions/rg2rg/RightToLeftRegularGrammar.cpp
 create mode 100644 alib2algo/src/conversions/rg2rg/RightToLeftRegularGrammar.h
 delete mode 100644 alib2algo/src/conversions/rg2rg/lrg2rrg/LeftToRightRegularGrammar.cpp
 delete mode 100644 alib2algo/src/conversions/rg2rg/lrg2rrg/LeftToRightRegularGrammar.h
 delete mode 100644 alib2algo/src/conversions/rg2rg/rrg2lrg/RightToLeftRegularGrammar.cpp
 delete mode 100644 alib2algo/src/conversions/rg2rg/rrg2lrg/RightToLeftRegularGrammar.h

diff --git a/aconversions2/src/ConversionHandler.cpp b/aconversions2/src/ConversionHandler.cpp
index 6d56b8ed25..dec0494d0b 100644
--- a/aconversions2/src/ConversionHandler.cpp
+++ b/aconversions2/src/ConversionHandler.cpp
@@ -25,8 +25,8 @@
 #include "conversions/re2rg/re2rrg/GlushkovNFA.h"
 #include "conversions/re2rg/re2rrg/BrzozowskiDerivation.h"
 
-#include "conversions/rg2rg/lrg2rrg/LeftToRightRegularGrammar.h"
-#include "conversions/rg2rg/rrg2lrg/RightToLeftRegularGrammar.h"
+#include "conversions/rg2rg/LeftToRightRegularGrammar.h"
+#include "conversions/rg2rg/RightToLeftRegularGrammar.h"
 
 
 using namespace alib;
@@ -288,8 +288,7 @@ void ConversionHandler::convertLRGtoRRG( void )
 	switch( m_algorithm )
 	{
 	default:
-			conversions::rg2rg::LeftToRightRegularGrammar conv;
-			alib::DataFactory::toStdout(conv.convert(lrg));
+		alib::DataFactory::toStdout(conversions::rg2rg::LeftToRightRegularGrammar::convert(lrg));
 		break;
 	}
 }
@@ -301,8 +300,7 @@ void ConversionHandler::convertRRGtoLRG( void )
 	switch( m_algorithm )
 	{
 	default:
-		conversions::rg2rg::RightToLeftRegularGrammar conv;
-		alib::DataFactory::toStdout(conv.convert(rrg));
+		alib::DataFactory::toStdout(conversions::rg2rg::RightToLeftRegularGrammar::convert(rrg));
 		break;
 	}
 }
diff --git a/alib2algo/src/conversions/rg2rg/LeftToRightRegularGrammar.cpp b/alib2algo/src/conversions/rg2rg/LeftToRightRegularGrammar.cpp
new file mode 100644
index 0000000000..ab6089d162
--- /dev/null
+++ b/alib2algo/src/conversions/rg2rg/LeftToRightRegularGrammar.cpp
@@ -0,0 +1,149 @@
+/*
+ * LeftToRightRegularGrammar.cpp
+ *
+ *  Created on: 8. 3. 2014
+ *      Author: Tomas Pecka
+ */
+
+#include "LeftToRightRegularGrammar.h"
+
+#include <exception/AlibException.h>
+
+namespace conversions {
+
+namespace rg2rg {
+
+grammar::RightRG LeftToRightRegularGrammar::convert(const grammar::Grammar& grammar)
+{
+	grammar::RightRG* out = NULL;
+	grammar.getData().Accept((void*) &out, LeftToRightRegularGrammar::LEFT_TO_RIGHT_REGULAR_GRAMMAR);
+	grammar::RightRG res = std::move(*out);
+	delete out;
+	return res;
+}
+
+grammar::RightRG LeftToRightRegularGrammar::convert(const grammar::LeftRG& grammar)
+{
+	// 1.
+	alphabet::Symbol s = alphabet::createUniqueSymbol( grammar.getInitialSymbol( ), grammar.getNonterminalAlphabet(), grammar.getTerminalAlphabet() );
+
+	grammar::RightRG rrg( s );
+
+	for(const auto & nonterminalSymbol : grammar.getNonterminalAlphabet() ) {
+		rrg.addNonterminalSymbol( nonterminalSymbol );
+	}
+
+	rrg.setTerminalAlphabet( grammar.getTerminalAlphabet( ) );
+	rrg.setGeneratesEpsilon( grammar.getGeneratesEpsilon( ) );
+
+	// 2
+	for( const auto & rule : grammar.getRules( ) ) {
+		const alphabet::Symbol& lhs = rule.first;
+
+		for(const auto & ruleRHS : rule.second ) {
+		        if( ruleRHS.is<std::pair<alphabet::Symbol, alphabet::Symbol>>( ) ) {
+				const std::pair<alphabet::Symbol, alphabet::Symbol>& rhs = ruleRHS.get<std::pair<alphabet::Symbol, alphabet::Symbol>>();
+
+				alphabet::Symbol leftSide = ( rhs.first );
+				std::pair<alphabet::Symbol, alphabet::Symbol> rightSide = std::make_pair( rhs.second, lhs );
+				rrg.addRule( leftSide, rightSide );
+
+				if( lhs == grammar.getInitialSymbol( ) ) {
+					alphabet::Symbol leftSide = rhs.first;
+					alphabet::Symbol rightSide = rhs.second;
+					rrg.addRule( leftSide, rightSide );
+				}
+			} else {
+				const alphabet::Symbol& rhs = ruleRHS.get<alphabet::Symbol>();
+
+				alphabet::Symbol leftSide = rrg.getInitialSymbol( );
+				std::pair<alphabet::Symbol, alphabet::Symbol> rightSide = std::make_pair( rhs, lhs );
+				rrg.addRule( leftSide, rightSide );
+
+				if( lhs == grammar.getInitialSymbol( ) ) {
+					alphabet::Symbol leftSide = rrg.getInitialSymbol( );
+					alphabet::Symbol rightSide = rhs;
+					rrg.addRule( leftSide, rightSide );
+				}
+			}
+		}
+	}
+	return rrg;
+}
+
+void LeftToRightRegularGrammar::Visit(void*, const grammar::UnknownGrammar&) const
+{
+	throw exception::AlibException("Unsupported grammar type UnknownGrammar");
+}
+
+void LeftToRightRegularGrammar::Visit(void*, const grammar::ContextPreservingUnrestrictedGrammar&) const
+{
+	throw exception::AlibException("Unsupported grammar type ContextPreservingUnrestrictedGrammar");
+}
+
+void LeftToRightRegularGrammar::Visit(void*, const grammar::UnrestrictedGrammar&) const
+{
+	throw exception::AlibException("Unsupported grammar type UnrestrictedGrammar");
+}
+
+void LeftToRightRegularGrammar::Visit(void*, const grammar::CSG&) const
+{
+	throw exception::AlibException("Unsupported grammar type CSG");
+}
+
+void LeftToRightRegularGrammar::Visit(void*, const grammar::NonContractingGrammar&) const
+{
+	throw exception::AlibException("Unsupported grammar type NonContractingGrammar");
+}
+
+void LeftToRightRegularGrammar::Visit(void*, const grammar::CNF&) const
+{
+	throw exception::AlibException("Unsupported grammar type CNF");
+}
+
+void LeftToRightRegularGrammar::Visit(void*, const grammar::CFG&) const
+{
+	throw exception::AlibException("Unsupported grammar type CFG");
+}
+
+void LeftToRightRegularGrammar::Visit(void*, const grammar::EpsilonFreeCFG&) const
+{
+	throw exception::AlibException("Unsupported grammar type EpsilonFreeCFG");
+}
+
+void LeftToRightRegularGrammar::Visit(void*, const grammar::GNF&) const
+{
+	throw exception::AlibException("Unsupported grammar type GNF");
+}
+
+void LeftToRightRegularGrammar::Visit(void*, const grammar::LG&) const
+{
+	throw exception::AlibException("Unsupported grammar type LG");
+}
+
+void LeftToRightRegularGrammar::Visit(void*, const grammar::RightRG&) const
+{
+	throw exception::AlibException("Unsupported grammar type RightRG");
+}
+
+void LeftToRightRegularGrammar::Visit(void* userData, const grammar::LeftRG& grammar) const
+{
+	grammar::RightRG* & out = *((grammar::RightRG**) userData);
+	out = new grammar::RightRG(this->convert(grammar));
+}
+
+void LeftToRightRegularGrammar::Visit(void*, const grammar::RightLG&) const
+{
+	throw exception::AlibException("Unsupported grammar type RightLG");
+}
+
+void LeftToRightRegularGrammar::Visit(void*, const grammar::LeftLG&) const
+{
+	throw exception::AlibException("Unsupported grammar type LeftLG");
+}
+
+const LeftToRightRegularGrammar LeftToRightRegularGrammar::LEFT_TO_RIGHT_REGULAR_GRAMMAR;
+
+} /* namespace rg2rg */
+
+} /* namespace conversions */
diff --git a/alib2algo/src/conversions/rg2rg/LeftToRightRegularGrammar.h b/alib2algo/src/conversions/rg2rg/LeftToRightRegularGrammar.h
new file mode 100644
index 0000000000..ab25664de2
--- /dev/null
+++ b/alib2algo/src/conversions/rg2rg/LeftToRightRegularGrammar.h
@@ -0,0 +1,61 @@
+/*
+ * LeftToRightRegularGrammar.h
+ *
+ *  Created on: 8. 3. 2014
+ *      Author: Tomas Pecka
+ */
+
+#ifndef LEFT_TORIGHT_REGULAR_GRAMMAR_H_
+#define LEFT_TORIGHT_REGULAR_GRAMMAR_H_
+
+#include <grammar/Grammar.h>
+#include <grammar/Regular/LeftRG.h>
+#include <grammar/Regular/RightRG.h>
+
+namespace conversions{
+
+namespace rg2rg
+{
+
+/**
+ * Converts left regular grammar to right regular grammar.
+ */
+class LeftToRightRegularGrammar : public grammar::VisitableGrammarBase::const_visitor_type
+{
+public:
+   /**
+     * Performs conversion.
+     * @param grammar Left regular grammar to convert
+     * @return right regular grammar which is equivalent to source left regular grammar.
+     */
+    static grammar::RightRG convert(const grammar::Grammar& grammar);
+    static grammar::RightRG convert(const grammar::LeftRG& grammar);
+
+private:
+    void Visit(void*, const grammar::UnknownGrammar& grammar) const;
+
+    void Visit(void*, const grammar::ContextPreservingUnrestrictedGrammar& grammar) const;
+    void Visit(void*, const grammar::UnrestrictedGrammar& grammar) const;
+
+    void Visit(void*, const grammar::CSG& grammar) const;
+    void Visit(void*, const grammar::NonContractingGrammar& grammar) const;
+
+    void Visit(void*, const grammar::CNF& grammar) const;
+    void Visit(void*, const grammar::CFG& grammar) const;
+    void Visit(void*, const grammar::EpsilonFreeCFG& grammar) const;
+    void Visit(void*, const grammar::GNF& grammar) const;
+    void Visit(void*, const grammar::LG& grammar) const;
+
+    void Visit(void*, const grammar::RightRG& grammar) const;
+    void Visit(void*, const grammar::LeftRG& grammar) const;
+    void Visit(void*, const grammar::RightLG& grammar) const;
+    void Visit(void*, const grammar::LeftLG& grammar) const;
+
+    static const LeftToRightRegularGrammar LEFT_TO_RIGHT_REGULAR_GRAMMAR;
+};
+
+} /* namespace rg2rg */
+
+} /* namespace conversions */
+
+#endif /* LEFT_TO_RIGHT_REGULAR_GRAMMAR_H_ */
diff --git a/alib2algo/src/conversions/rg2rg/RightToLeftRegularGrammar.cpp b/alib2algo/src/conversions/rg2rg/RightToLeftRegularGrammar.cpp
new file mode 100644
index 0000000000..d1da71429b
--- /dev/null
+++ b/alib2algo/src/conversions/rg2rg/RightToLeftRegularGrammar.cpp
@@ -0,0 +1,152 @@
+/*
+ * RightToLeftRegularGrammar.cpp
+ *
+ *  Created on: 8. 3. 2014
+ *      Author: Tomas Pecka
+ */
+
+#include "RightToLeftRegularGrammar.h"
+
+#include <exception/AlibException.h>
+
+namespace conversions
+{
+
+namespace rg2rg
+{
+
+grammar::LeftRG RightToLeftRegularGrammar::convert(const grammar::Grammar& grammar)
+{
+	grammar::LeftRG* out = NULL;
+	grammar.getData().Accept((void*) &out, RightToLeftRegularGrammar::RIGHT_TO_LEFT_REGULAR_GRAMMAR);
+	grammar::LeftRG res = std::move(*out);
+	delete out;
+	return res;
+}
+
+grammar::LeftRG RightToLeftRegularGrammar::convert(const grammar::RightRG& grammar)
+{
+	// 1.
+	alphabet::Symbol s = alphabet::createUniqueSymbol( grammar.getInitialSymbol( ), grammar.getNonterminalAlphabet(), grammar.getTerminalAlphabet() );
+
+	grammar::LeftRG lrg(s);
+
+	for(const auto & nonterminalSymbol : grammar.getNonterminalAlphabet()) {
+		lrg.addNonterminalSymbol( nonterminalSymbol );
+	}
+
+	lrg.setTerminalAlphabet( grammar.getTerminalAlphabet( ) );
+	lrg.setGeneratesEpsilon( grammar.getGeneratesEpsilon( ) );
+
+	// 2.
+	for( const auto & rule : grammar.getRules( ) ) {
+		const alphabet::Symbol& lhs = rule.first;
+
+		for(const auto & ruleRHS : rule.second ) {
+		        if( ruleRHS.is<std::pair<alphabet::Symbol, alphabet::Symbol>>( ) ) {
+				const std::pair<alphabet::Symbol, alphabet::Symbol>& rhs = ruleRHS.get<std::pair<alphabet::Symbol, alphabet::Symbol>>();
+
+				alphabet::Symbol leftSide = rhs.second;
+				std::pair<alphabet::Symbol, alphabet::Symbol> rightSide = std::make_pair( lhs, rhs.first );
+				lrg.addRule( leftSide, rightSide );
+
+				if( lhs == grammar.getInitialSymbol( ) ) {
+					alphabet::Symbol leftSide = rhs.second;
+					alphabet::Symbol rightSide = rhs.first;
+					lrg.addRule( leftSide, rightSide );
+				}
+			} else {
+				const alphabet::Symbol& rhs = ruleRHS.get<alphabet::Symbol>();
+
+				alphabet::Symbol leftSide = lrg.getInitialSymbol( );
+				std::pair<alphabet::Symbol, alphabet::Symbol> rightSide = std::make_pair ( lhs, rhs );
+				lrg.addRule( leftSide, rightSide );
+
+				if( lhs == grammar.getInitialSymbol( ) ) {
+					alphabet::Symbol leftSide = lrg.getInitialSymbol( );
+					alphabet::Symbol rightSide = rhs;
+					lrg.addRule( leftSide, rightSide );
+				}
+			}
+		}
+	}
+	return lrg;
+}
+
+void RightToLeftRegularGrammar::Visit(void*, const grammar::UnknownGrammar&) const
+{
+	throw exception::AlibException("Unsupported grammar type UnknownGrammar");
+}
+
+void RightToLeftRegularGrammar::Visit(void*, const grammar::ContextPreservingUnrestrictedGrammar&) const
+{
+	throw exception::AlibException("Unsupported grammar type ContextPreservingUnrestrictedGrammar");
+}
+
+void RightToLeftRegularGrammar::Visit(void*, const grammar::UnrestrictedGrammar&) const
+{
+	throw exception::AlibException("Unsupported grammar type UnrestrictedGrammar");
+}
+
+void RightToLeftRegularGrammar::Visit(void*, const grammar::CSG&) const
+{
+	throw exception::AlibException("Unsupported grammar type CSG");
+}
+
+void RightToLeftRegularGrammar::Visit(void*, const grammar::NonContractingGrammar&) const
+{
+	throw exception::AlibException("Unsupported grammar type NonContractingGrammar");
+}
+
+void RightToLeftRegularGrammar::Visit(void*, const grammar::CNF&) const
+{
+	throw exception::AlibException("Unsupported grammar type CNF");
+}
+
+void RightToLeftRegularGrammar::Visit(void*, const grammar::CFG&) const
+{
+	throw exception::AlibException("Unsupported grammar type CFG");
+}
+
+void RightToLeftRegularGrammar::Visit(void*, const grammar::EpsilonFreeCFG&) const
+{
+	throw exception::AlibException("Unsupported grammar type EpsilonFreeCFG");
+}
+
+void RightToLeftRegularGrammar::Visit(void*, const grammar::GNF&) const
+{
+	throw exception::AlibException("Unsupported grammar type GNF");
+}
+
+void RightToLeftRegularGrammar::Visit(void*, const grammar::LG&) const
+{
+	throw exception::AlibException("Unsupported grammar type LG");
+}
+
+void RightToLeftRegularGrammar::Visit(void* userData, const grammar::RightRG& grammar) const
+{
+	grammar::LeftRG* & out = *((grammar::LeftRG**) userData);
+	out = new grammar::LeftRG(this->convert(grammar));
+}
+
+void RightToLeftRegularGrammar::Visit(void*, const grammar::LeftRG&) const
+{
+	throw exception::AlibException("Unsupported grammar type RightRG");
+}
+
+void RightToLeftRegularGrammar::Visit(void*, const grammar::RightLG&) const
+{
+	throw exception::AlibException("Unsupported grammar type RightLG");
+}
+
+void RightToLeftRegularGrammar::Visit(void*, const grammar::LeftLG&) const
+{
+	throw exception::AlibException("Unsupported grammar type LeftLG");
+}
+
+const RightToLeftRegularGrammar RightToLeftRegularGrammar::RIGHT_TO_LEFT_REGULAR_GRAMMAR;
+
+
+} /* namespace rg2rg */
+
+} /* namespace conversions */
diff --git a/alib2algo/src/conversions/rg2rg/RightToLeftRegularGrammar.h b/alib2algo/src/conversions/rg2rg/RightToLeftRegularGrammar.h
new file mode 100644
index 0000000000..bccd75f130
--- /dev/null
+++ b/alib2algo/src/conversions/rg2rg/RightToLeftRegularGrammar.h
@@ -0,0 +1,62 @@
+/*
+ * RightToLeftRegularGrammar.h
+ *
+ *  Created on: 8. 3. 2014
+ *      Author: Tomas Pecka
+ */
+
+#ifndef RIGHT_TO_LEFT_REGULAR_GRAMMAR_H_
+#define RIGHT_TO_LEFT_REGULAR_GRAMMAR_H_
+
+#include <grammar/Grammar.h>
+#include <grammar/Regular/LeftRG.h>
+#include <grammar/Regular/RightRG.h>
+
+namespace conversions
+{
+
+namespace rg2rg
+{
+
+/**
+ * Converts right regular grammar to left regular grammar.
+ */
+class RightToLeftRegularGrammar : public grammar::VisitableGrammarBase::const_visitor_type
+{
+public:
+    /**
+     * Performs conversion.
+     * @param grammar Right regular grammar to convert
+     * @return left regular grammar which is equivalent to source right regular grammar.
+     */
+    static grammar::LeftRG convert(const grammar::Grammar& grammar);
+    static grammar::LeftRG convert(const grammar::RightRG& grammar);
+
+private:
+    void Visit(void*, const grammar::UnknownGrammar& grammar) const;
+
+    void Visit(void*, const grammar::ContextPreservingUnrestrictedGrammar& grammar) const;
+    void Visit(void*, const grammar::UnrestrictedGrammar& grammar) const;
+
+    void Visit(void*, const grammar::CSG& grammar) const;
+    void Visit(void*, const grammar::NonContractingGrammar& grammar) const;
+
+    void Visit(void*, const grammar::CNF& grammar) const;
+    void Visit(void*, const grammar::CFG& grammar) const;
+    void Visit(void*, const grammar::EpsilonFreeCFG& grammar) const;
+    void Visit(void*, const grammar::GNF& grammar) const;
+    void Visit(void*, const grammar::LG& grammar) const;
+
+    void Visit(void*, const grammar::RightRG& grammar) const;
+    void Visit(void*, const grammar::LeftRG& grammar) const;
+    void Visit(void*, const grammar::RightLG& grammar) const;
+    void Visit(void*, const grammar::LeftLG& grammar) const;
+
+    static const RightToLeftRegularGrammar RIGHT_TO_LEFT_REGULAR_GRAMMAR;
+};
+
+} /* namespace rg2rg */
+
+} /* namespace conversions */
+
+#endif /* RIGHT_TO_LEFT_REGULAR_GRAMMAR_H_ */
diff --git a/alib2algo/src/conversions/rg2rg/lrg2rrg/LeftToRightRegularGrammar.cpp b/alib2algo/src/conversions/rg2rg/lrg2rrg/LeftToRightRegularGrammar.cpp
deleted file mode 100644
index 0a1cca7dba..0000000000
--- a/alib2algo/src/conversions/rg2rg/lrg2rrg/LeftToRightRegularGrammar.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * LeftToRightRegularGrammar.cpp
- *
- *  Created on: 8. 3. 2014
- *      Author: Tomas Pecka
- */
-
-#include "LeftToRightRegularGrammar.h"
-
-namespace conversions {
-
-namespace rg2rg {
-
-grammar::RightRG LeftToRightRegularGrammar::convert(const grammar::LeftRG& lrg)
-{
-	// 1.
-	alphabet::Symbol s = alphabet::createUniqueSymbol( lrg.getInitialSymbol( ), lrg.getNonterminalAlphabet(), lrg.getTerminalAlphabet() );
-
-	grammar::RightRG rrg( s );
-
-	for(const auto & nonterminalSymbol : lrg.getNonterminalAlphabet() ) {
-		rrg.addNonterminalSymbol( nonterminalSymbol );
-	}
-
-	rrg.setTerminalAlphabet( lrg.getTerminalAlphabet( ) );
-	rrg.setGeneratesEpsilon( lrg.getGeneratesEpsilon( ) );
-
-	// 2
-	for( const auto & rule : lrg.getRules( ) ) {
-		const alphabet::Symbol& lhs = rule.first;
-
-		for(const auto & ruleRHS : rule.second ) {
-		        if( ruleRHS.is<std::pair<alphabet::Symbol, alphabet::Symbol>>( ) ) {
-				const std::pair<alphabet::Symbol, alphabet::Symbol>& rhs = ruleRHS.get<std::pair<alphabet::Symbol, alphabet::Symbol>>();
-
-				alphabet::Symbol leftSide = ( rhs.first );
-				std::pair<alphabet::Symbol, alphabet::Symbol> rightSide = std::make_pair( rhs.second, lhs );
-				rrg.addRule( leftSide, rightSide );
-
-				if( lhs == lrg.getInitialSymbol( ) ) {
-					alphabet::Symbol leftSide = rhs.first;
-					alphabet::Symbol rightSide = rhs.second;
-					rrg.addRule( leftSide, rightSide );
-				}
-			} else {
-				const alphabet::Symbol& rhs = ruleRHS.get<alphabet::Symbol>();
-
-				alphabet::Symbol leftSide = rrg.getInitialSymbol( );
-				std::pair<alphabet::Symbol, alphabet::Symbol> rightSide = std::make_pair( rhs, lhs );
-				rrg.addRule( leftSide, rightSide );
-
-				if( lhs == lrg.getInitialSymbol( ) ) {
-					alphabet::Symbol leftSide = rrg.getInitialSymbol( );
-					alphabet::Symbol rightSide = rhs;
-					rrg.addRule( leftSide, rightSide );
-				}
-			}
-		}
-	}
-	return rrg;
-}
-
-} /* namespace rg2rg */
-
-} /* namespace conversions */
diff --git a/alib2algo/src/conversions/rg2rg/lrg2rrg/LeftToRightRegularGrammar.h b/alib2algo/src/conversions/rg2rg/lrg2rrg/LeftToRightRegularGrammar.h
deleted file mode 100644
index b217f73568..0000000000
--- a/alib2algo/src/conversions/rg2rg/lrg2rrg/LeftToRightRegularGrammar.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * LeftToRightRegularGrammar.h
- *
- *  Created on: 8. 3. 2014
- *      Author: Tomas Pecka
- */
-
-#ifndef LEFT_TORIGHT_REGULAR_GRAMMAR_H_
-#define LEFT_TORIGHT_REGULAR_GRAMMAR_H_
-
-#include <grammar/Regular/LeftRG.h>
-#include <grammar/Regular/RightRG.h>
-
-namespace conversions{
-
-namespace rg2rg
-{
-
-class LeftToRightRegularGrammar
-{
-public:
-   /**
-     * Performs conversion.
-     * @return right regular grammar which is equivalent to source left regular grammar.
-     */
-    grammar::RightRG convert(const grammar::LeftRG& lrg);
-};
-
-} /* namespace rg2rg */
-
-} /* namespace conversions */
-
-#endif /* LEFT_TO_RIGHT_REGULAR_GRAMMAR_H_ */
diff --git a/alib2algo/src/conversions/rg2rg/rrg2lrg/RightToLeftRegularGrammar.cpp b/alib2algo/src/conversions/rg2rg/rrg2lrg/RightToLeftRegularGrammar.cpp
deleted file mode 100644
index a43a808f34..0000000000
--- a/alib2algo/src/conversions/rg2rg/rrg2lrg/RightToLeftRegularGrammar.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * RightToLeftRegularGrammar.cpp
- *
- *  Created on: 8. 3. 2014
- *      Author: Tomas Pecka
- */
-
-#include "RightToLeftRegularGrammar.h"
-
-namespace conversions
-{
-
-namespace rg2rg
-{
-
-grammar::LeftRG RightToLeftRegularGrammar::convert(const grammar::RightRG& rrg)
-{
-	// 1.
-	alphabet::Symbol s = alphabet::createUniqueSymbol( rrg.getInitialSymbol( ), rrg.getNonterminalAlphabet(), rrg.getTerminalAlphabet() );
-
-	grammar::LeftRG lrg(s);
-
-	for(const auto & nonterminalSymbol : rrg.getNonterminalAlphabet()) {
-		lrg.addNonterminalSymbol( nonterminalSymbol );
-	}
-
-	lrg.setTerminalAlphabet( rrg.getTerminalAlphabet( ) );
-	lrg.setGeneratesEpsilon( rrg.getGeneratesEpsilon( ) );
-
-	// 2.
-	for( const auto & rule : rrg.getRules( ) ) {
-		const alphabet::Symbol& lhs = rule.first;
-
-		for(const auto & ruleRHS : rule.second ) {
-		        if( ruleRHS.is<std::pair<alphabet::Symbol, alphabet::Symbol>>( ) ) {
-				const std::pair<alphabet::Symbol, alphabet::Symbol>& rhs = ruleRHS.get<std::pair<alphabet::Symbol, alphabet::Symbol>>();
-
-				alphabet::Symbol leftSide = rhs.second;
-				std::pair<alphabet::Symbol, alphabet::Symbol> rightSide = std::make_pair( lhs, rhs.first );
-				lrg.addRule( leftSide, rightSide );
-
-				if( lhs == rrg.getInitialSymbol( ) ) {
-					alphabet::Symbol leftSide = rhs.second;
-					alphabet::Symbol rightSide = rhs.first;
-					lrg.addRule( leftSide, rightSide );
-				}
-			} else {
-				const alphabet::Symbol& rhs = ruleRHS.get<alphabet::Symbol>();
-
-				alphabet::Symbol leftSide = lrg.getInitialSymbol( );
-				std::pair<alphabet::Symbol, alphabet::Symbol> rightSide = std::make_pair ( lhs, rhs );
-				lrg.addRule( leftSide, rightSide );
-
-				if( lhs == rrg.getInitialSymbol( ) ) {
-					alphabet::Symbol leftSide = lrg.getInitialSymbol( );
-					alphabet::Symbol rightSide = rhs;
-					lrg.addRule( leftSide, rightSide );
-				}
-			}
-		}
-	}
-	return lrg;
-}
-
-} /* namespace rg2rg */
-
-} /* namespace conversions */
diff --git a/alib2algo/src/conversions/rg2rg/rrg2lrg/RightToLeftRegularGrammar.h b/alib2algo/src/conversions/rg2rg/rrg2lrg/RightToLeftRegularGrammar.h
deleted file mode 100644
index 7cecd00f27..0000000000
--- a/alib2algo/src/conversions/rg2rg/rrg2lrg/RightToLeftRegularGrammar.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * RightToLeftRegularGrammar.h
- *
- *  Created on: 8. 3. 2014
- *      Author: Tomas Pecka
- */
-
-#ifndef RIGHT_TO_LEFT_REGULAR_GRAMMAR_H_
-#define RIGHT_TO_LEFT_REGULAR_GRAMMAR_H_
-
-#include <grammar/Regular/LeftRG.h>
-#include <grammar/Regular/RightRG.h>
-
-namespace conversions
-{
-
-namespace rg2rg
-{
-
-/**
- * Converts right regular grammar to left regular grammar.
- */
-class RightToLeftRegularGrammar
-{
-public:
-    /**
-     * Performs conversion.
-     * @return left regular grammar which is equivalent to source right regular grammar.
-     */
-    grammar::LeftRG convert(const grammar::RightRG& rrg);
-};
-
-} /* namespace rg2rg */
-
-} /* namespace conversions */
-
-#endif /* RIGHT_TO_LEFT_REGULAR_GRAMMAR_H_ */
diff --git a/alib2algo/test-src/conversions/rg2rg/rg2rgTest.cpp b/alib2algo/test-src/conversions/rg2rg/rg2rgTest.cpp
index c8952a6718..8f1862e70d 100644
--- a/alib2algo/test-src/conversions/rg2rg/rg2rgTest.cpp
+++ b/alib2algo/test-src/conversions/rg2rg/rg2rgTest.cpp
@@ -6,8 +6,8 @@
 #include "label/Label.h"
 #include "alphabet/LabeledSymbol.h"
 
-#include "conversions/rg2rg/rrg2lrg/RightToLeftRegularGrammar.h"
-#include "conversions/rg2rg/lrg2rrg/LeftToRightRegularGrammar.h"
+#include "conversions/rg2rg/RightToLeftRegularGrammar.h"
+#include "conversions/rg2rg/LeftToRightRegularGrammar.h"
 
 #define CPPUNIT_IMPLY(x, y) CPPUNIT_ASSERT(!(x) || (y))
 
@@ -32,8 +32,7 @@ void rg2rgTest::testConversion() {
   rrGrammar.addRule(alphabet::symbolFrom(2), std::make_pair(alphabet::symbolFrom("b"), alphabet::symbolFrom(3)));
   rrGrammar.addRule(alphabet::symbolFrom(3), alphabet::symbolFrom("a"));
 
-  conversions::rg2rg::RightToLeftRegularGrammar convertor;;
-  grammar::LeftRG lrGrammar = convertor.convert(rrGrammar);
+  grammar::LeftRG lrGrammar = conversions::rg2rg::RightToLeftRegularGrammar::convert(rrGrammar);
 
   grammar::LeftRG lrGrammarRef(alphabet::symbolFrom(4));
 
@@ -64,8 +63,7 @@ void rg2rgTest::testConversion2() {
   lrGrammar.addRule(alphabet::symbolFrom(3), std::make_pair(alphabet::symbolFrom(2), alphabet::symbolFrom("b")));
   lrGrammar.addRule(alphabet::symbolFrom(4), std::make_pair(alphabet::symbolFrom(3), alphabet::symbolFrom("a")));
 
-  conversions::rg2rg::LeftToRightRegularGrammar convertor;
-  grammar::RightRG rrGrammar = convertor.convert(lrGrammar);
+  grammar::RightRG rrGrammar = conversions::rg2rg::LeftToRightRegularGrammar::convert(lrGrammar);
 
   grammar::RightRG rrGrammarRef(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(5)))));
 
-- 
GitLab