diff --git a/alib2algo/src/grammar/generate/RandomizeGrammar.cpp b/alib2algo/src/grammar/generate/RandomizeGrammar.cpp index 4d342a3ae50b481c49cc24ddabe7365f724917d7..993b6476d836a93a854bc01de9b6949199d0c67f 100644 --- a/alib2algo/src/grammar/generate/RandomizeGrammar.cpp +++ b/alib2algo/src/grammar/generate/RandomizeGrammar.cpp @@ -16,6 +16,7 @@ auto RandomizeGrammarLeftRG = RandomizeGrammar::RegistratorWrapper < grammar::Le auto RandomizeGrammarLeftLG = RandomizeGrammar::RegistratorWrapper < grammar::LeftLG < >, grammar::LeftLG < > > ( RandomizeGrammar::randomize ); auto RandomizeGrammarRightRG = RandomizeGrammar::RegistratorWrapper < grammar::RightRG < >, grammar::RightRG < > > ( RandomizeGrammar::randomize ); auto RandomizeGrammarRightLG = RandomizeGrammar::RegistratorWrapper < grammar::RightLG < >, grammar::RightLG < > > ( RandomizeGrammar::randomize ); +auto RandomizeGrammarCFG = RandomizeGrammar::RegistratorWrapper < grammar::CFG < >, grammar::CFG < > > ( RandomizeGrammar::randomize ); grammar::Grammar RandomizeGrammar::randomize ( const grammar::Grammar & grammar ) { return dispatch ( grammar.getData ( ) ); diff --git a/alib2algo/src/grammar/generate/RandomizeGrammar.h b/alib2algo/src/grammar/generate/RandomizeGrammar.h index 4e65db928d15fe4e78f5fed3a5541aadb66a228f..75099f256c778020b25065b04d249a2babb328cf 100644 --- a/alib2algo/src/grammar/generate/RandomizeGrammar.h +++ b/alib2algo/src/grammar/generate/RandomizeGrammar.h @@ -15,6 +15,7 @@ #include <grammar/Regular/LeftRG.h> #include <grammar/Regular/RightLG.h> #include <grammar/Regular/RightRG.h> +#include <grammar/ContextFree/CFG.h> #include <common/Permutation.hpp> @@ -34,6 +35,9 @@ public: static grammar::RightRG < SymbolType > randomize ( const grammar::RightRG < SymbolType > & gram ); template < class SymbolType > static grammar::RightLG < SymbolType > randomize ( const grammar::RightLG < SymbolType > & gram ); + template < class SymbolType > + static grammar::CFG < SymbolType > randomize ( const grammar::CFG < SymbolType > & gram ); + }; template < class SymbolType > @@ -112,6 +116,27 @@ grammar::RightLG < SymbolType > RandomizeGrammar::randomize ( const grammar::Rig return res; } +template < class SymbolType > +grammar::CFG < SymbolType > RandomizeGrammar::randomize ( const grammar::CFG < SymbolType > & gram ) { + std::map < SymbolType, SymbolType > symbolPermutationMap = common::Permutation::permutationMap ( gram.getNonterminalAlphabet ( ) ); + + grammar::CFG < SymbolType > res ( symbolPermutationMap.find ( gram.getInitialSymbol ( ) )->second ); + + res.setNonterminalAlphabet ( gram.getNonterminalAlphabet ( ) ); + res.setTerminalAlphabet ( gram.getTerminalAlphabet ( ) ); + + for ( const std::pair < SymbolType, std::set < std::vector < SymbolType > > > & rule : gram.getRules ( ) ) + for ( const std::vector < SymbolType > & rhs : rule.second ) + res.addRule ( symbolPermutationMap.find ( rule.first )->second, std::transform < SymbolType > ( rhs, [ & ] ( const SymbolType & elem ) { + if ( gram.getNonterminalAlphabet ( ).count ( elem ) ) + return symbolPermutationMap.find ( elem )->second; + else + return elem; + } ) ); + + return res; +} + } /* namespace generate */ } /* namespace grammar */