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