From 272458e9cd82dff65d168d4e6c2925c954f78ede Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Sat, 8 Sep 2018 21:29:29 +0200 Subject: [PATCH] concrete implementation of SipleRulesRemover for EpsilonFreeCFG --- .../src/grammar/simplify/SimpleRulesRemover.h | 38 +++++++------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/alib2algo/src/grammar/simplify/SimpleRulesRemover.h b/alib2algo/src/grammar/simplify/SimpleRulesRemover.h index 8bc155b0a0..7904e04aef 100644 --- a/alib2algo/src/grammar/simplify/SimpleRulesRemover.h +++ b/alib2algo/src/grammar/simplify/SimpleRulesRemover.h @@ -29,9 +29,6 @@ namespace grammar { namespace simplify { class SimpleRulesRemover { - template<class T, class SymbolType = typename grammar::SymbolTypeOfGrammar < T > > - static T removeEpsilonFree( const T & origGrammar ); - template<class T, class SymbolType = typename grammar::SymbolTypeOfGrammar < T > > static T removeNonEpsilonFree( const T & origGrammar ); @@ -57,7 +54,7 @@ public: }; template < class T, class SymbolType > -T SimpleRulesRemover::removeEpsilonFree( const T & origGrammar ) { +T SimpleRulesRemover::removeNonEpsilonFree( const T & origGrammar ) { T grammar(origGrammar.getInitialSymbol()); for( const auto & symbol : origGrammar.getNonterminalAlphabet() ) @@ -79,14 +76,17 @@ T SimpleRulesRemover::removeEpsilonFree( const T & origGrammar ) { } } - grammar.setGeneratesEpsilon(origGrammar.getGeneratesEpsilon()); - return grammar; } -template < class T, class SymbolType > -T SimpleRulesRemover::removeNonEpsilonFree( const T & origGrammar ) { - T grammar(origGrammar.getInitialSymbol()); +template < class SymbolType > +grammar::CFG < SymbolType > SimpleRulesRemover::remove(const grammar::CFG < SymbolType > & origGrammar) { + return removeNonEpsilonFree(origGrammar); +} + +template < class SymbolType > +grammar::EpsilonFreeCFG < SymbolType > SimpleRulesRemover::remove(const grammar::EpsilonFreeCFG < SymbolType > & origGrammar) { + grammar::EpsilonFreeCFG < SymbolType > grammar(origGrammar.getInitialSymbol()); for( const auto & symbol : origGrammar.getNonterminalAlphabet() ) grammar.addNonterminalSymbol( symbol ); @@ -94,30 +94,20 @@ T SimpleRulesRemover::removeNonEpsilonFree( const T & origGrammar ) { for( const auto & symbol : origGrammar.getTerminalAlphabet() ) grammar.addTerminalSymbol( symbol ); - auto origRules = origGrammar.getRawRules(); - for( const auto & symbol : origGrammar.getNonterminalAlphabet() ) { ext::set<SymbolType> simpleRulesClosure = grammar::properties::NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle(origGrammar, symbol); for( const auto & closureSymbol : simpleRulesClosure ) { - auto rules = origRules.find(closureSymbol); - if(rules != origRules.end()) for( const auto& rawRule : rules->second ) { + auto rules = origGrammar.getRules().find(closureSymbol); + if(rules != origGrammar.getRules().end()) for( const auto& rawRule : rules->second ) { if(rawRule.size() == 0 || (rawRule.size() == 1 && !origGrammar.getNonterminalAlphabet().count(rawRule[0])) || rawRule.size() >= 2) - grammar.addRawRule(symbol, rawRule); + grammar.addRule(symbol, rawRule); } } } - return grammar; -} - -template < class SymbolType > -grammar::CFG < SymbolType > SimpleRulesRemover::remove(const grammar::CFG < SymbolType > & origGrammar) { - return removeNonEpsilonFree(origGrammar); -} + grammar.setGeneratesEpsilon(origGrammar.getGeneratesEpsilon()); -template < class SymbolType > -grammar::EpsilonFreeCFG < SymbolType > SimpleRulesRemover::remove(const grammar::EpsilonFreeCFG < SymbolType > & origGrammar) { - return removeEpsilonFree(origGrammar); + return grammar; } template < class SymbolType > -- GitLab