From 601612d85895860ad5c09333843bcf95e81392c3 Mon Sep 17 00:00:00 2001
From: Tomas Pecka <peckato1@fit.cvut.cz>
Date: Tue, 27 Sep 2016 17:35:10 +0200
Subject: [PATCH] Rename: two algo files forgotten

---
 alib2algo/src/grammar/simplify/Rename.cpp | 107 ++++++++++++++++++++++
 alib2algo/src/grammar/simplify/Rename.h   |  35 +++++++
 2 files changed, 142 insertions(+)
 create mode 100644 alib2algo/src/grammar/simplify/Rename.cpp
 create mode 100644 alib2algo/src/grammar/simplify/Rename.h

diff --git a/alib2algo/src/grammar/simplify/Rename.cpp b/alib2algo/src/grammar/simplify/Rename.cpp
new file mode 100644
index 0000000000..eb50598a35
--- /dev/null
+++ b/alib2algo/src/grammar/simplify/Rename.cpp
@@ -0,0 +1,107 @@
+/*
+ * Rename.h
+ *
+ *  Created on: Sep 27, 2016
+ *      Author: Tomas Pecka
+ */
+
+#include "Rename.h"
+
+#include <algorithm>
+#include <deque>
+#include <iostream>
+#include <map>
+#include <set>
+#include <sstream>
+#include <vector>
+
+#include "alphabet/Symbol.h"
+#include <hexavigesimal>
+
+namespace grammar {
+
+namespace simplify {
+
+grammar::Grammar Rename::rename ( const grammar::Grammar & grammar ) {
+	return dispatch ( grammar.getData ( ) );
+}
+
+grammar::RightRG < > Rename::rename ( const grammar::RightRG < > & rrg ) {
+	int counter = 0;
+
+	std::map < alphabet::Symbol, alphabet::Symbol > renamingData;
+
+	for ( auto iter = rrg.getNonterminalAlphabet ( ).begin ( ); iter != rrg.getNonterminalAlphabet ( ).end ( ); iter++ )
+		renamingData.insert ( std::make_pair ( * iter, alphabet::symbolFrom ( std::toBase26 ( counter++ ) ) ) );
+
+	grammar::RightRG < > result ( renamingData.find ( rrg.getInitialSymbol ( ) )->second );
+	result.setGeneratesEpsilon ( rrg.getGeneratesEpsilon ( ) );
+	result.setTerminalAlphabet ( rrg.getTerminalAlphabet ( ) );
+
+	for ( auto iter = rrg.getNonterminalAlphabet ( ).begin ( ); iter != rrg.getNonterminalAlphabet ( ).end ( ); iter++ )
+		result.addNonterminalSymbol ( renamingData.find ( * iter )->second );
+
+	const auto raw = rrg.getRawRules ( );
+
+	for ( auto iter = raw.begin ( ); iter != raw.end ( ); iter++ )
+		for ( const std::vector < alphabet::Symbol > & rhs : iter->second ) {
+			if ( rhs.size ( ) == 0 ) continue; // eps rule in raws...
+
+			std::vector < alphabet::Symbol > rewrited;
+
+			for ( const alphabet::Symbol & rhs_symbol : rhs ) {
+				if ( rrg.getNonterminalAlphabet ( ).count ( rhs_symbol ) > 0 )
+					rewrited.push_back ( renamingData.find ( rhs_symbol )->second );
+				else
+					rewrited.push_back ( rhs_symbol );
+			}
+
+			result.addRawRule ( renamingData.find ( iter->first )->second, rewrited );
+		}
+
+	return result;
+}
+
+auto RenameRightRG = Rename::RegistratorWrapper < grammar::RightRG < >, grammar::RightRG < > > ( Rename::rename );
+
+grammar::LeftRG < > Rename::rename ( const grammar::LeftRG < > & rrg ) {
+	int counter = 0;
+
+	std::map < alphabet::Symbol, alphabet::Symbol > renamingData;
+
+	for ( auto iter = rrg.getNonterminalAlphabet ( ).begin ( ); iter != rrg.getNonterminalAlphabet ( ).end ( ); iter++ )
+		renamingData.insert ( std::make_pair ( * iter, alphabet::symbolFrom ( std::toBase26 ( counter++ ) ) ) );
+
+	grammar::LeftRG < > result ( renamingData.find ( rrg.getInitialSymbol ( ) )->second );
+	result.setGeneratesEpsilon ( rrg.getGeneratesEpsilon ( ) );
+	result.setTerminalAlphabet ( rrg.getTerminalAlphabet ( ) );
+
+	for ( auto iter = rrg.getNonterminalAlphabet ( ).begin ( ); iter != rrg.getNonterminalAlphabet ( ).end ( ); iter++ )
+		result.addNonterminalSymbol ( renamingData.find ( * iter )->second );
+
+	const auto raw = rrg.getRawRules ( );
+
+	for ( auto iter = raw.begin ( ); iter != raw.end ( ); iter++ )
+		for ( const std::vector < alphabet::Symbol > & rhs : iter->second ) {
+			if ( rhs.size ( ) == 0 ) continue; // eps rule in raws...
+
+			std::vector < alphabet::Symbol > rewrited;
+
+			for ( const alphabet::Symbol & rhs_symbol : rhs ) {
+				if ( rrg.getNonterminalAlphabet ( ).count ( rhs_symbol ) > 0 )
+					rewrited.push_back ( renamingData.find ( rhs_symbol )->second );
+				else
+					rewrited.push_back ( rhs_symbol );
+			}
+
+			result.addRawRule ( renamingData.find ( iter->first )->second, rewrited );
+		}
+
+	return result;
+}
+
+auto RenameLeftRG = Rename::RegistratorWrapper < grammar::LeftRG < >, grammar::LeftRG < > > ( Rename::rename );
+
+} /* namespace simplify */
+
+} /* namespace grammar */
diff --git a/alib2algo/src/grammar/simplify/Rename.h b/alib2algo/src/grammar/simplify/Rename.h
new file mode 100644
index 0000000000..addf698525
--- /dev/null
+++ b/alib2algo/src/grammar/simplify/Rename.h
@@ -0,0 +1,35 @@
+/*
+ * Rename.h
+ *
+ *  Created on: Sep 27, 2016
+ *      Author: Tomas Pecka
+ */
+
+#ifndef RENAME_GRAMMAR_H_
+#define RENAME_GRAMMAR_H_
+
+#include <core/multipleDispatch.hpp>
+#include <grammar/Grammar.h>
+#include <grammar/Regular/LeftRG.h>
+#include <grammar/Regular/RightRG.h>
+
+namespace grammar {
+
+namespace simplify {
+
+class Rename : public std::SingleDispatch < Rename, grammar::Grammar, const grammar::GrammarBase & > {
+public:
+	/**
+	 * @param grammar grammar to rename
+	 */
+	static grammar::Grammar rename ( const grammar::Grammar & grammar );
+
+	static grammar::RightRG < > rename ( const grammar::RightRG < > & grammar );
+	static grammar::LeftRG < > rename ( const grammar::LeftRG < > & grammar );
+};
+
+} /* namespace simplify */
+
+} /* namespace grammar */
+
+#endif /* RENAME_GRAMMAR_H_ */
-- 
GitLab