From 7389cc919692bea1fcbc1e37eebffcf14d06815a Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Mon, 17 Sep 2018 16:30:20 +0200 Subject: [PATCH] template some more grammar related algos --- .../src/grammar/convert/ToGrammarRightRG.h | 4 +-- alib2algo/src/grammar/convert/ToRegExp.h | 16 +++++++---- .../src/grammar/convert/ToRegExpAlgebraic.h | 28 +++++++++++-------- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/alib2algo/src/grammar/convert/ToGrammarRightRG.h b/alib2algo/src/grammar/convert/ToGrammarRightRG.h index 7d559d1ce5..b22ba5bece 100644 --- a/alib2algo/src/grammar/convert/ToGrammarRightRG.h +++ b/alib2algo/src/grammar/convert/ToGrammarRightRG.h @@ -33,7 +33,7 @@ public: * \return right regular grammar which is equivalent to source left regular grammar. */ template < class TerminalSymbolType, class NonterminalSymbolType > - static grammar::RightRG < TerminalSymbolType > convert(const grammar::LeftRG < TerminalSymbolType, NonterminalSymbolType > & grammar); + static grammar::RightRG < TerminalSymbolType, NonterminalSymbolType > convert(const grammar::LeftRG < TerminalSymbolType, NonterminalSymbolType > & grammar); }; template < class TerminalSymbolType, class NonterminalSymbolType > @@ -76,7 +76,7 @@ grammar::RightRG < TerminalSymbolType, NonterminalSymbolType > ToGrammarRightRG: if( lhs == grammar.getInitialSymbol( ) ) { leftSide = rrg.getInitialSymbol( ); - terminalSymbolType rightSide2 = rhs; + TerminalSymbolType rightSide2 = rhs; rrg.addRule( leftSide, rightSide2 ); } } diff --git a/alib2algo/src/grammar/convert/ToRegExp.h b/alib2algo/src/grammar/convert/ToRegExp.h index 88a8ed8aa3..c3069c533e 100644 --- a/alib2algo/src/grammar/convert/ToRegExp.h +++ b/alib2algo/src/grammar/convert/ToRegExp.h @@ -20,13 +20,17 @@ namespace convert { class ToRegExp { public: /** - * @return regexp equivalent to source right regular grammar. - * @param grammar Grammar to convert + * \param grammar Grammar to convert + * \return regexp equivalent to source right regular grammar. */ template < class TerminalSymbolType, class NonterminalSymbolType > static regexp::UnboundedRegExp < TerminalSymbolType > convert ( const grammar::RightRG < TerminalSymbolType, NonterminalSymbolType > & grammar ); - template < class SymbolType > - static regexp::UnboundedRegExp < > convert ( const grammar::LeftRG < SymbolType > & grammar ); + + /** + * \override + */ + template < class TerminalSymbolType, class NonterminalSymbolType > + static regexp::UnboundedRegExp < TerminalSymbolType > convert ( const grammar::LeftRG < TerminalSymbolType, NonterminalSymbolType > & grammar ); }; template < class TerminalSymbolType, class NonterminalSymbolType > @@ -34,8 +38,8 @@ regexp::UnboundedRegExp < TerminalSymbolType > ToRegExp::convert ( const grammar return ToRegExpAlgebraic::convert ( grammar ); } -template < class SymbolType > -regexp::UnboundedRegExp < > ToRegExp::convert ( const grammar::LeftRG < SymbolType > & grammar ) { +template < class TerminalSymbolType, class NonterminalSymbolType > +regexp::UnboundedRegExp < TerminalSymbolType > ToRegExp::convert ( const grammar::LeftRG < TerminalSymbolType, NonterminalSymbolType > & grammar ) { return ToRegExpAlgebraic::convert ( grammar ); } diff --git a/alib2algo/src/grammar/convert/ToRegExpAlgebraic.h b/alib2algo/src/grammar/convert/ToRegExpAlgebraic.h index 9235859813..6bfdf0943c 100644 --- a/alib2algo/src/grammar/convert/ToRegExpAlgebraic.h +++ b/alib2algo/src/grammar/convert/ToRegExpAlgebraic.h @@ -29,31 +29,35 @@ public: */ template < class TerminalSymbolType, class NonterminalSymbolType > static regexp::UnboundedRegExp < TerminalSymbolType > convert ( const grammar::RightRG < TerminalSymbolType, NonterminalSymbolType > & grammar); - template < class SymbolType > - static regexp::UnboundedRegExp < SymbolType > convert(const grammar::LeftRG < SymbolType > & grammar); + + /** + * \override + */ + template < class TerminalSymbolType, class NonterminalSymbolType > + static regexp::UnboundedRegExp < TerminalSymbolType > convert(const grammar::LeftRG < TerminalSymbolType, NonterminalSymbolType > & grammar); }; -template < class SymbolType > -regexp::UnboundedRegExp < SymbolType > ToRegExpAlgebraic::convert(const grammar::LeftRG < SymbolType > & grammar) { - equations::LeftRegularEquationSolver < SymbolType, SymbolType > solver; +template < class TerminalSymbolType, class NonterminalSymbolType > +regexp::UnboundedRegExp < TerminalSymbolType > ToRegExpAlgebraic::convert(const grammar::LeftRG < TerminalSymbolType, NonterminalSymbolType > & grammar) { + equations::LeftRegularEquationSolver < TerminalSymbolType, NonterminalSymbolType > solver; solver.setVariableSymbols(grammar.getNonterminalAlphabet()); for(const auto & rule : grammar.getRules()) { - const SymbolType& lhs = rule.first; + const NonterminalSymbolType& lhs = rule.first; for(const auto& ruleRHS : rule.second) { - if(ruleRHS.template is<SymbolType>()) { - const SymbolType& rhs = ruleRHS.template get<SymbolType>(); - solver.addEquation(lhs, regexp::UnboundedRegExpSymbol < SymbolType > (rhs)); + if(ruleRHS.template is<TerminalSymbolType>()) { + const TerminalSymbolType& rhs = ruleRHS.template get<TerminalSymbolType>(); + solver.addEquation(lhs, regexp::UnboundedRegExpSymbol < TerminalSymbolType > (rhs)); } else { - const ext::pair<SymbolType, SymbolType>& rhs = ruleRHS.template get<ext::pair<SymbolType, SymbolType>>(); - solver.addEquation(lhs, rhs.first, regexp::UnboundedRegExpSymbol < SymbolType > (rhs.second)); + const ext::pair<NonterminalSymbolType, TerminalSymbolType>& rhs = ruleRHS.template get<ext::pair<NonterminalSymbolType, TerminalSymbolType>>(); + solver.addEquation(lhs, rhs.first, regexp::UnboundedRegExpSymbol < TerminalSymbolType > (rhs.second)); } } } if(grammar.getGeneratesEpsilon()) - solver.addEquation(grammar.getInitialSymbol(), regexp::UnboundedRegExpEpsilon < SymbolType > ()); + solver.addEquation(grammar.getInitialSymbol(), regexp::UnboundedRegExpEpsilon < TerminalSymbolType > ()); return solver.solve(grammar.getInitialSymbol()); } -- GitLab