Skip to content
Snippets Groups Projects
Commit 601612d8 authored by Tomáš Pecka's avatar Tomáš Pecka
Browse files

Rename: two algo files forgotten

parent 71f55c5b
No related branches found
No related tags found
No related merge requests found
/*
* 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 */
/*
* 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_ */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment