From a5a148a8ec81307b21404f42b5bd43c7ccd328f6 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Wed, 14 Sep 2016 20:02:43 +0200 Subject: [PATCH] template RightLG grammar --- aaccess2/src/GrammarAccess.cpp | 4 +- aaccess2/src/GrammarAccess.h | 2 +- acompare2/src/GrammarCompare.cpp | 8 +- acompare2/src/GrammarCompare.h | 6 +- alib2algo/src/grammar/parsing/First.cpp | 4 +- alib2algo/src/grammar/parsing/Follow.cpp | 4 +- .../src/grammar/parsing/LL1ParseTable.cpp | 2 +- .../grammar/properties/IsLanguageEmpty.cpp | 2 +- .../IsLanguageGeneratingEpsilon.cpp | 2 +- .../properties/NonterminalUnitRuleCycle.cpp | 2 +- .../properties/NullableNonterminals.cpp | 2 +- .../properties/ProductiveNonterminals.cpp | 2 +- .../properties/RecursiveNonterminal.cpp | 2 +- .../grammar/properties/UnreachableSymbols.cpp | 2 +- .../src/grammar/simplify/EpsilonRemover.cpp | 4 +- .../src/grammar/simplify/EpsilonRemover.h | 2 +- .../grammar/simplify/LeftRecursionRemover.cpp | 8 +- .../grammar/simplify/LeftRecursionRemover.h | 4 +- .../grammar/simplify/SimpleRulesRemover.cpp | 4 +- .../src/grammar/simplify/SimpleRulesRemover.h | 2 +- alib2algo/src/grammar/simplify/ToCNF.cpp | 4 +- alib2algo/src/grammar/simplify/ToCNF.h | 2 +- alib2algo/src/grammar/simplify/ToGNF.cpp | 4 +- alib2algo/src/grammar/simplify/ToGNF.h | 2 +- alib2algo/src/grammar/simplify/Trim.cpp | 2 +- .../simplify/UnproductiveSymbolsRemover.cpp | 2 +- .../simplify/UnreachableSymbolsRemover.cpp | 2 +- alib2data/src/grammar/GrammarFeatures.h | 1 + alib2data/src/grammar/Regular/RightLG.cpp | 198 +---------- alib2data/src/grammar/Regular/RightLG.h | 331 ++++++++++++++---- alib2data/test-src/grammar/GrammarTest.cpp | 4 +- .../src/grammar/GrammarFromStringParser.cpp | 4 +- .../src/grammar/GrammarFromStringParser.h | 2 +- .../src/grammar/GrammarToStringComposer.cpp | 4 +- .../src/grammar/GrammarToStringComposer.h | 2 +- 35 files changed, 325 insertions(+), 307 deletions(-) diff --git a/aaccess2/src/GrammarAccess.cpp b/aaccess2/src/GrammarAccess.cpp index 2591e003cb..921a1f3ef8 100644 --- a/aaccess2/src/GrammarAccess.cpp +++ b/aaccess2/src/GrammarAccess.cpp @@ -43,7 +43,7 @@ void GrammarAccess::access ( grammar::RightRG & grammar, const GrammarSettings:: auto GrammarAccessRightRG = GrammarAccess::RegistratorWrapper < void, grammar::RightRG > ( GrammarAccess::access ); -void GrammarAccess::access ( grammar::RightLG & grammar, const GrammarSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ) { +void GrammarAccess::access ( grammar::RightLG < > & grammar, const GrammarSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ) { if ( settings == GrammarSettings::Settings::NONTERMINALS ) return handleComponent < grammar::NonterminalAlphabet > ( grammar, operation, argument ); @@ -59,4 +59,4 @@ void GrammarAccess::access ( grammar::RightLG & grammar, const GrammarSettings:: throw exception::CommonException ( "Component not available" ); } -auto GrammarAccessRightLG = GrammarAccess::RegistratorWrapper < void, grammar::RightLG > ( GrammarAccess::access ); +auto GrammarAccessRightLG = GrammarAccess::RegistratorWrapper < void, grammar::RightLG < > > ( GrammarAccess::access ); diff --git a/aaccess2/src/GrammarAccess.h b/aaccess2/src/GrammarAccess.h index 0f479a704b..014b6b4c96 100644 --- a/aaccess2/src/GrammarAccess.h +++ b/aaccess2/src/GrammarAccess.h @@ -22,7 +22,7 @@ public: static void access ( grammar::Grammar & grammar, const GrammarSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ); static void access ( grammar::RightRG & grammar, const GrammarSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ); - static void access ( grammar::RightLG & grammar, const GrammarSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ); + static void access ( grammar::RightLG < > & grammar, const GrammarSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ); }; #endif /* GRAMMAR_ACCESS_H_ */ diff --git a/acompare2/src/GrammarCompare.cpp b/acompare2/src/GrammarCompare.cpp index d9189da995..4c08a56d91 100644 --- a/acompare2/src/GrammarCompare.cpp +++ b/acompare2/src/GrammarCompare.cpp @@ -44,7 +44,7 @@ bool GrammarCompare::testCompare(const grammar::LeftRG < > & a, const grammar::L a.getTerminalAlphabet() == b.getTerminalAlphabet() ; } -bool GrammarCompare::testCompare(const grammar::RightLG& a, const grammar::RightLG& b) { +bool GrammarCompare::testCompare(const grammar::RightLG < > & a, const grammar::RightLG < > & b) { return a.getNonterminalAlphabet() == b.getNonterminalAlphabet() && a.getRules() == b.getRules() && a.getInitialSymbol() == b.getInitialSymbol() && @@ -229,7 +229,7 @@ void GrammarCompare::printCompare(const grammar::LeftRG < > & a, const grammar:: } } -void GrammarCompare::printCompare(const grammar::RightLG& a, const grammar::RightLG& b) { +void GrammarCompare::printCompare(const grammar::RightLG < > & a, const grammar::RightLG < > & b) { std::cout << "GrammarCompareer" << std::endl; if(a.getNonterminalAlphabet() != b.getNonterminalAlphabet()) { @@ -581,7 +581,7 @@ int GrammarCompare::compare(const grammar::LeftRG < > & a, const grammar::LeftRG auto GrammarCompareLeftRG = GrammarCompare::RegistratorWrapper<int, grammar::LeftRG < >, grammar::LeftRG < > >(GrammarCompare::compare); -int GrammarCompare::compare(const grammar::RightLG& a, const grammar::RightLG& b) { +int GrammarCompare::compare(const grammar::RightLG < > & a, const grammar::RightLG < > & b) { if(!GrammarCompare::testCompare(a, b)) { GrammarCompare::printCompare(a, b); return 1; @@ -590,7 +590,7 @@ int GrammarCompare::compare(const grammar::RightLG& a, const grammar::RightLG& b } } -auto GrammarCompareRightLG = GrammarCompare::RegistratorWrapper<int, grammar::RightLG, grammar::RightLG>(GrammarCompare::compare); +auto GrammarCompareRightLG = GrammarCompare::RegistratorWrapper<int, grammar::RightLG < >, grammar::RightLG < > >(GrammarCompare::compare); int GrammarCompare::compare(const grammar::RightRG& a, const grammar::RightRG& b) { if(!GrammarCompare::testCompare(a, b)) { diff --git a/acompare2/src/GrammarCompare.h b/acompare2/src/GrammarCompare.h index 17672d4422..23660ba646 100644 --- a/acompare2/src/GrammarCompare.h +++ b/acompare2/src/GrammarCompare.h @@ -26,8 +26,8 @@ private: static bool testCompare(const grammar::LeftRG < > & a, const grammar::LeftRG < > & b); static void printCompare(const grammar::LeftRG < > & a, const grammar::LeftRG < > & b); - static bool testCompare(const grammar::RightLG& a, const grammar::RightLG& b); - static void printCompare(const grammar::RightLG& a, const grammar::RightLG& b); + static bool testCompare(const grammar::RightLG < > & a, const grammar::RightLG < > & b); + static void printCompare(const grammar::RightLG < > & a, const grammar::RightLG < > & b); static bool testCompare(const grammar::RightRG& a, const grammar::RightRG& b); static void printCompare(const grammar::RightRG& a, const grammar::RightRG& b); @@ -65,7 +65,7 @@ private: public: static int compare(const grammar::LeftLG < > & a, const grammar::LeftLG < > & b); static int compare(const grammar::LeftRG < > & a, const grammar::LeftRG < > & b); - static int compare(const grammar::RightLG& a, const grammar::RightLG& b); + static int compare(const grammar::RightLG < > & a, const grammar::RightLG < > & b); static int compare(const grammar::RightRG& a, const grammar::RightRG& b); static int compare(const grammar::LG < > & a, const grammar::LG < > & b); static int compare(const grammar::CFG < > & a, const grammar::CFG < > & b); diff --git a/alib2algo/src/grammar/parsing/First.cpp b/alib2algo/src/grammar/parsing/First.cpp index 913d697942..0b51467237 100644 --- a/alib2algo/src/grammar/parsing/First.cpp +++ b/alib2algo/src/grammar/parsing/First.cpp @@ -111,7 +111,7 @@ auto FirstCNF = FirstBase1::RegistratorWrapper < FirstResult1, grammar::CNF < > auto FirstLG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::LG < > > ( First::first ); auto FirstLeftLG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::LeftLG < > > ( First::first ); auto FirstLeftRG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::LeftRG < > > ( First::first ); -auto FirstRightLG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::RightLG > ( First::first ); +auto FirstRightLG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::RightLG < > > ( First::first ); auto FirstRightRG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::RightRG > ( First::first ); std::map < std::vector < alphabet::Symbol >, std::set < std::variant < alphabet::Symbol, string::Epsilon < > > > > First::first ( const grammar::Grammar & grammar ) { @@ -125,7 +125,7 @@ auto FirstCNF2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::CNF < > auto FirstLG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::LG < > > ( First::first ); auto FirstLeftLG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::LeftLG < > > ( First::first ); auto FirstLeftRG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::LeftRG < > > ( First::first ); -auto FirstRightLG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::RightLG > ( First::first ); +auto FirstRightLG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::RightLG < > > ( First::first ); auto FirstRightRG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::RightRG > ( First::first ); std::set < std::variant < alphabet::Symbol, string::Epsilon < > > > First::first ( const grammar::Grammar & grammar, const std::vector < alphabet::Symbol > & rhs ) { diff --git a/alib2algo/src/grammar/parsing/Follow.cpp b/alib2algo/src/grammar/parsing/Follow.cpp index 22a2726e2d..086daa5678 100644 --- a/alib2algo/src/grammar/parsing/Follow.cpp +++ b/alib2algo/src/grammar/parsing/Follow.cpp @@ -99,7 +99,7 @@ auto FollowCNF = FollowBase1::RegistratorWrapper < FollowResult1, grammar::CNF < auto FollowLG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::LG < > > ( Follow::follow ); auto FollowLeftLG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::LeftLG < > > ( Follow::follow ); auto FollowLeftRG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::LeftRG < > > ( Follow::follow ); -auto FollowRightLG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::RightLG > ( Follow::follow ); +auto FollowRightLG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::RightLG < > > ( Follow::follow ); auto FollowRightRG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::RightRG > ( Follow::follow ); std::map < alphabet::Symbol, std::set < std::variant < alphabet::Symbol, string::Epsilon < > > > > Follow::follow ( const grammar::Grammar & grammar ) { @@ -113,7 +113,7 @@ auto FollowCNF2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::CNF auto FollowLG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::LG < > > ( Follow::follow ); auto FollowLeftLG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::LeftLG < > > ( Follow::follow ); auto FollowLeftRG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::LeftRG < > > ( Follow::follow ); -auto FollowRightLG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::RightLG > ( Follow::follow ); +auto FollowRightLG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::RightLG < > > ( Follow::follow ); auto FollowRightRG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::RightRG > ( Follow::follow ); std::set < std::variant < alphabet::Symbol, string::Epsilon < > > > Follow::follow ( const grammar::Grammar & grammar, const alphabet::Symbol & nt ) { diff --git a/alib2algo/src/grammar/parsing/LL1ParseTable.cpp b/alib2algo/src/grammar/parsing/LL1ParseTable.cpp index 5c922b792e..e0015690d9 100644 --- a/alib2algo/src/grammar/parsing/LL1ParseTable.cpp +++ b/alib2algo/src/grammar/parsing/LL1ParseTable.cpp @@ -57,7 +57,7 @@ auto LL1ParseTableCNF = LL1ParseTable::RegistratorWrapper < std::map < std::pair auto LL1ParseTableLG = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::LG < > > ( LL1ParseTable::parseTable ); auto LL1ParseTableLeftLG = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::LeftLG < > > ( LL1ParseTable::parseTable ); auto LL1ParseTableLeftRG = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::LeftRG < > > ( LL1ParseTable::parseTable ); -auto LL1ParseTableRightLG = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::RightLG > ( LL1ParseTable::parseTable ); +auto LL1ParseTableRightLG = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::RightLG < > > ( LL1ParseTable::parseTable ); auto LL1ParseTableRightRG = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::RightRG > ( LL1ParseTable::parseTable ); std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > > LL1ParseTable::parseTable ( const grammar::Grammar & grammar ) { diff --git a/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp b/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp index f5adeeddee..abe542b37d 100644 --- a/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp +++ b/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp @@ -35,7 +35,7 @@ auto IsLanguageEmptyCNF = IsLanguageEmpty::RegistratorWrapper<bool, grammar::CNF auto IsLanguageEmptyLG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::LG < > >(IsLanguageEmpty::isLanguageEmpty); auto IsLanguageEmptyLeftLG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::LeftLG < > >(IsLanguageEmpty::isLanguageEmpty); auto IsLanguageEmptyLeftRG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::LeftRG < > >(IsLanguageEmpty::isLanguageEmpty); -auto IsLanguageEmptyRightLG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::RightLG>(IsLanguageEmpty::isLanguageEmpty); +auto IsLanguageEmptyRightLG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::RightLG < > >(IsLanguageEmpty::isLanguageEmpty); auto IsLanguageEmptyRightRG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::RightRG>(IsLanguageEmpty::isLanguageEmpty); } /* namespace properties */ diff --git a/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp b/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp index 775361ac1d..55b9e38570 100644 --- a/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp +++ b/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp @@ -35,7 +35,7 @@ auto IsLanguageGeneratingEpsilonCNF = IsLanguageGeneratingEpsilon::RegistratorWr auto IsLanguageGeneratingEpsilonLG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::LG < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon); auto IsLanguageGeneratingEpsilonLeftLG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::LeftLG < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon); auto IsLanguageGeneratingEpsilonLeftRG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::LeftRG < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon); -auto IsLanguageGeneratingEpsilonRightLG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::RightLG>(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon); +auto IsLanguageGeneratingEpsilonRightLG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::RightLG < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon); auto IsLanguageGeneratingEpsilonRightRG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::RightRG>(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon); } /* namespace properties */ diff --git a/alib2algo/src/grammar/properties/NonterminalUnitRuleCycle.cpp b/alib2algo/src/grammar/properties/NonterminalUnitRuleCycle.cpp index b9e299d7a0..ad8266481d 100644 --- a/alib2algo/src/grammar/properties/NonterminalUnitRuleCycle.cpp +++ b/alib2algo/src/grammar/properties/NonterminalUnitRuleCycle.cpp @@ -64,7 +64,7 @@ auto NonterminalUnitRuleCycleCNF = NonterminalUnitRuleCycle::RegistratorWrapper< auto NonterminalUnitRuleCycleLG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LG < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle); auto NonterminalUnitRuleCycleLeftLG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftLG < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle); auto NonterminalUnitRuleCycleLeftRG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftRG < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle); -auto NonterminalUnitRuleCycleRightLG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightLG>(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle); +auto NonterminalUnitRuleCycleRightLG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightLG < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle); auto NonterminalUnitRuleCycleRightRG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightRG>(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle); std::set<alphabet::Symbol> NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle(const grammar::Grammar& grammar, const alphabet::Symbol& nonterminal) { diff --git a/alib2algo/src/grammar/properties/NullableNonterminals.cpp b/alib2algo/src/grammar/properties/NullableNonterminals.cpp index 51a4fe0203..8e0ecd993f 100644 --- a/alib2algo/src/grammar/properties/NullableNonterminals.cpp +++ b/alib2algo/src/grammar/properties/NullableNonterminals.cpp @@ -58,7 +58,7 @@ auto NullableNonterminalsCNF = NullableNonterminals::RegistratorWrapper<std::set auto NullableNonterminalsLG = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LG < > >(NullableNonterminals::getNullableNonterminals); auto NullableNonterminalsLeftLG = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftLG < > >(NullableNonterminals::getNullableNonterminals); auto NullableNonterminalsLeftRG = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftRG < > >(NullableNonterminals::getNullableNonterminals); -auto NullableNonterminalsRightLG = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightLG>(NullableNonterminals::getNullableNonterminals); +auto NullableNonterminalsRightLG = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightLG < > >(NullableNonterminals::getNullableNonterminals); auto NullableNonterminalsRightRG = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightRG>(NullableNonterminals::getNullableNonterminals); } /* namespace properties */ diff --git a/alib2algo/src/grammar/properties/ProductiveNonterminals.cpp b/alib2algo/src/grammar/properties/ProductiveNonterminals.cpp index bbbd8d0eb5..8113a87fd8 100644 --- a/alib2algo/src/grammar/properties/ProductiveNonterminals.cpp +++ b/alib2algo/src/grammar/properties/ProductiveNonterminals.cpp @@ -63,7 +63,7 @@ auto ProductiveNonterminalsCNF = ProductiveNonterminals::RegistratorWrapper<std: auto ProductiveNonterminalsLG = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LG < > >(ProductiveNonterminals::getProductiveNonterminals); auto ProductiveNonterminalsLeftLG = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftLG < > >(ProductiveNonterminals::getProductiveNonterminals); auto ProductiveNonterminalsLeftRG = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftRG < > >(ProductiveNonterminals::getProductiveNonterminals); -auto ProductiveNonterminalsRightLG = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightLG>(ProductiveNonterminals::getProductiveNonterminals); +auto ProductiveNonterminalsRightLG = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightLG < > >(ProductiveNonterminals::getProductiveNonterminals); auto ProductiveNonterminalsRightRG = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightRG>(ProductiveNonterminals::getProductiveNonterminals); } /* namespace properties */ diff --git a/alib2algo/src/grammar/properties/RecursiveNonterminal.cpp b/alib2algo/src/grammar/properties/RecursiveNonterminal.cpp index 7501df004a..af6f4bea67 100644 --- a/alib2algo/src/grammar/properties/RecursiveNonterminal.cpp +++ b/alib2algo/src/grammar/properties/RecursiveNonterminal.cpp @@ -70,7 +70,7 @@ auto RecursiveNonterminalCNF = RecursiveNonterminal::RegistratorWrapper < bool, auto RecursiveNonterminalLG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::LG < > > ( RecursiveNonterminal::isNonterminalRecursive ); auto RecursiveNonterminalLeftLG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::LeftLG < > > ( RecursiveNonterminal::isNonterminalRecursive ); auto RecursiveNonterminalLeftRG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::LeftRG < > > ( RecursiveNonterminal::isNonterminalRecursive ); -auto RecursiveNonterminalRightLG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::RightLG > ( RecursiveNonterminal::isNonterminalRecursive ); +auto RecursiveNonterminalRightLG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::RightLG < > > ( RecursiveNonterminal::isNonterminalRecursive ); auto RecursiveNonterminalRightRG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::RightRG > ( RecursiveNonterminal::isNonterminalRecursive ); bool RecursiveNonterminal::isNonterminalRecursive ( const grammar::Grammar & grammar, const alphabet::Symbol & nonterminal ) { diff --git a/alib2algo/src/grammar/properties/UnreachableSymbols.cpp b/alib2algo/src/grammar/properties/UnreachableSymbols.cpp index 472c937ff4..b69cd2238e 100644 --- a/alib2algo/src/grammar/properties/UnreachableSymbols.cpp +++ b/alib2algo/src/grammar/properties/UnreachableSymbols.cpp @@ -64,7 +64,7 @@ auto UnreachableSymbolsCNF = UnreachableSymbols::RegistratorWrapper<std::set<alp auto UnreachableSymbolsLG = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LG < > >(UnreachableSymbols::getUnreachableSymbols); auto UnreachableSymbolsLeftLG = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftLG < > >(UnreachableSymbols::getUnreachableSymbols); auto UnreachableSymbolsLeftRG = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftRG < > >(UnreachableSymbols::getUnreachableSymbols); -auto UnreachableSymbolsRightLG = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightLG>(UnreachableSymbols::getUnreachableSymbols); +auto UnreachableSymbolsRightLG = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightLG < > >(UnreachableSymbols::getUnreachableSymbols); auto UnreachableSymbolsRightRG = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::RightRG>(UnreachableSymbols::getUnreachableSymbols); } /* namespace properties */ diff --git a/alib2algo/src/grammar/simplify/EpsilonRemover.cpp b/alib2algo/src/grammar/simplify/EpsilonRemover.cpp index 1830f3341e..328eaadb31 100644 --- a/alib2algo/src/grammar/simplify/EpsilonRemover.cpp +++ b/alib2algo/src/grammar/simplify/EpsilonRemover.cpp @@ -94,11 +94,11 @@ grammar::LeftRG < > EpsilonRemover::remove(const grammar::LeftRG < > & origGramm auto EpsilonRemoverLeftRG = EpsilonRemover::RegistratorWrapper<grammar::LeftRG < >, grammar::LeftRG < > >(EpsilonRemover::remove); -grammar::EpsilonFreeCFG < > EpsilonRemover::remove(const grammar::RightLG& origGrammar) { +grammar::EpsilonFreeCFG < > EpsilonRemover::remove(const grammar::RightLG < > & origGrammar) { return removeInternal(origGrammar); } -auto EpsilonRemoverRightLG = EpsilonRemover::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::RightLG>(EpsilonRemover::remove); +auto EpsilonRemoverRightLG = EpsilonRemover::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::RightLG < > >(EpsilonRemover::remove); grammar::RightRG EpsilonRemover::remove(const grammar::RightRG& origGrammar) { return origGrammar; diff --git a/alib2algo/src/grammar/simplify/EpsilonRemover.h b/alib2algo/src/grammar/simplify/EpsilonRemover.h index f0b7240314..268ce46a31 100644 --- a/alib2algo/src/grammar/simplify/EpsilonRemover.h +++ b/alib2algo/src/grammar/simplify/EpsilonRemover.h @@ -39,7 +39,7 @@ public: static grammar::EpsilonFreeCFG < > remove( const grammar::LG < > & grammar ); static grammar::EpsilonFreeCFG < > remove( const grammar::LeftLG < > & grammar ); static grammar::LeftRG < > remove( const grammar::LeftRG < > & grammar ); - static grammar::EpsilonFreeCFG < > remove( const grammar::RightLG & grammar ); + static grammar::EpsilonFreeCFG < > remove( const grammar::RightLG < > & grammar ); static grammar::RightRG remove( const grammar::RightRG & grammar ); }; diff --git a/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp b/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp index 82eb493109..74a9cea8bc 100644 --- a/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp +++ b/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp @@ -160,11 +160,11 @@ grammar::RightRG LeftRecursionRemover::remove(const grammar::RightRG& origGramma auto LeftRecursionRemoverRightRG = LeftRecursionRemover::RegistratorWrapper<grammar::RightRG, grammar::RightRG>(LeftRecursionRemover::remove); -grammar::RightLG LeftRecursionRemover::remove(const grammar::RightLG& origGrammar) { +grammar::RightLG < > LeftRecursionRemover::remove(const grammar::RightLG < > & origGrammar) { return origGrammar; } -auto LeftRecursionRemoverRightLG = LeftRecursionRemover::RegistratorWrapper<grammar::RightLG, grammar::RightLG>(LeftRecursionRemover::remove); +auto LeftRecursionRemoverRightLG = LeftRecursionRemover::RegistratorWrapper<grammar::RightLG < >, grammar::RightLG < > >(LeftRecursionRemover::remove); grammar::RightRG LeftRecursionRemover::remove(const grammar::LeftRG < > & origGrammar) { return convert::ToGrammarRightRG::convert(origGrammar); @@ -172,11 +172,11 @@ grammar::RightRG LeftRecursionRemover::remove(const grammar::LeftRG < > & origGr auto LeftRecursionRemoverLeftRG = LeftRecursionRemover::RegistratorWrapper<grammar::RightRG, grammar::LeftRG < > >(LeftRecursionRemover::remove); -grammar::RightLG LeftRecursionRemover::remove(const grammar::LeftLG < > & /* origGrammar */) { +grammar::RightLG < > LeftRecursionRemover::remove(const grammar::LeftLG < > & /* origGrammar */) { throw exception::CommonException("LeftRecursionRemover: Removing from LeftLG NYI"); // TODO } -auto LeftRecursionRemoverLeftLG = LeftRecursionRemover::RegistratorWrapper<grammar::RightLG, grammar::LeftLG < > >(LeftRecursionRemover::remove); +auto LeftRecursionRemoverLeftLG = LeftRecursionRemover::RegistratorWrapper<grammar::RightLG < >, grammar::LeftLG < > >(LeftRecursionRemover::remove); grammar::Grammar LeftRecursionRemover::remove(const grammar::Grammar& grammar) { return dispatch(grammar.getData()); diff --git a/alib2algo/src/grammar/simplify/LeftRecursionRemover.h b/alib2algo/src/grammar/simplify/LeftRecursionRemover.h index 578910092a..f2e4cb47e9 100644 --- a/alib2algo/src/grammar/simplify/LeftRecursionRemover.h +++ b/alib2algo/src/grammar/simplify/LeftRecursionRemover.h @@ -36,9 +36,9 @@ public: static grammar::EpsilonFreeCFG < > remove( const grammar::CNF < > & grammar ); static grammar::GNF < > remove( const grammar::GNF < > & grammar ); static grammar::RightRG remove( const grammar::RightRG & grammar ); - static grammar::RightLG remove( const grammar::RightLG & grammar ); + static grammar::RightLG < > remove( const grammar::RightLG < > & grammar ); static grammar::RightRG remove( const grammar::LeftRG < > & grammar ); - static grammar::RightLG remove( const grammar::LeftLG < > & grammar ); + static grammar::RightLG < > remove( const grammar::LeftLG < > & grammar ); }; } /* namespace simplify */ diff --git a/alib2algo/src/grammar/simplify/SimpleRulesRemover.cpp b/alib2algo/src/grammar/simplify/SimpleRulesRemover.cpp index 68991a1b54..7b494fbcea 100644 --- a/alib2algo/src/grammar/simplify/SimpleRulesRemover.cpp +++ b/alib2algo/src/grammar/simplify/SimpleRulesRemover.cpp @@ -109,11 +109,11 @@ grammar::LeftRG < > SimpleRulesRemover::remove(const grammar::LeftRG < > & origG auto SimpleRulesRemoverLeftRG = SimpleRulesRemover::RegistratorWrapper<grammar::LeftRG < >, grammar::LeftRG < > >(SimpleRulesRemover::remove); -grammar::RightLG SimpleRulesRemover::remove(const grammar::RightLG& origGrammar) { +grammar::RightLG < > SimpleRulesRemover::remove(const grammar::RightLG < > & origGrammar) { return removeNonEpsilonFree(origGrammar); } -auto SimpleRulesRemoverRightLG = SimpleRulesRemover::RegistratorWrapper<grammar::RightLG, grammar::RightLG>(SimpleRulesRemover::remove); +auto SimpleRulesRemoverRightLG = SimpleRulesRemover::RegistratorWrapper<grammar::RightLG < >, grammar::RightLG < > >(SimpleRulesRemover::remove); grammar::RightRG SimpleRulesRemover::remove(const grammar::RightRG& origGrammar) { return origGrammar; diff --git a/alib2algo/src/grammar/simplify/SimpleRulesRemover.h b/alib2algo/src/grammar/simplify/SimpleRulesRemover.h index afe64e809e..ac4e8f18ee 100644 --- a/alib2algo/src/grammar/simplify/SimpleRulesRemover.h +++ b/alib2algo/src/grammar/simplify/SimpleRulesRemover.h @@ -39,7 +39,7 @@ public: static grammar::LG < > remove( const grammar::LG < > & grammar ); static grammar::LeftLG < > remove( const grammar::LeftLG < > & grammar ); static grammar::LeftRG < > remove( const grammar::LeftRG < > & grammar ); - static grammar::RightLG remove( const grammar::RightLG & grammar ); + static grammar::RightLG < > remove( const grammar::RightLG < > & grammar ); static grammar::RightRG remove( const grammar::RightRG & grammar ); }; diff --git a/alib2algo/src/grammar/simplify/ToCNF.cpp b/alib2algo/src/grammar/simplify/ToCNF.cpp index 0c698bb422..7f30761a04 100644 --- a/alib2algo/src/grammar/simplify/ToCNF.cpp +++ b/alib2algo/src/grammar/simplify/ToCNF.cpp @@ -159,11 +159,11 @@ grammar::CNF < > ToCNF::convert(const grammar::LeftRG < > & origGrammar) { auto ToCNFLeftRG = ToCNF::RegistratorWrapper<grammar::CNF < >, grammar::LeftRG < > >(ToCNF::convert); -grammar::CNF < > ToCNF::convert(const grammar::RightLG& origGrammar) { +grammar::CNF < > ToCNF::convert(const grammar::RightLG < > & origGrammar) { return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar))); } -auto ToCNFRightLG = ToCNF::RegistratorWrapper<grammar::CNF < >, grammar::RightLG>(ToCNF::convert); +auto ToCNFRightLG = ToCNF::RegistratorWrapper<grammar::CNF < >, grammar::RightLG < > >(ToCNF::convert); grammar::CNF < > ToCNF::convert(const grammar::RightRG& origGrammar) { return convertInternal(origGrammar); diff --git a/alib2algo/src/grammar/simplify/ToCNF.h b/alib2algo/src/grammar/simplify/ToCNF.h index fd00e818f4..dc861d9d50 100644 --- a/alib2algo/src/grammar/simplify/ToCNF.h +++ b/alib2algo/src/grammar/simplify/ToCNF.h @@ -39,7 +39,7 @@ public: static grammar::CNF < > convert( const grammar::LG < > & grammar ); static grammar::CNF < > convert( const grammar::LeftLG < > & grammar ); static grammar::CNF < > convert( const grammar::LeftRG < > & grammar ); - static grammar::CNF < > convert( const grammar::RightLG & grammar ); + static grammar::CNF < > convert( const grammar::RightLG < > & grammar ); static grammar::CNF < > convert( const grammar::RightRG & grammar ); }; diff --git a/alib2algo/src/grammar/simplify/ToGNF.cpp b/alib2algo/src/grammar/simplify/ToGNF.cpp index d9fdf93646..89d019f034 100644 --- a/alib2algo/src/grammar/simplify/ToGNF.cpp +++ b/alib2algo/src/grammar/simplify/ToGNF.cpp @@ -129,11 +129,11 @@ grammar::RightRG ToGNF::convert(const grammar::LeftRG < > & origGrammar) { auto ToGNFLeftRG = ToGNF::RegistratorWrapper<grammar::RightRG, grammar::LeftRG < > >(ToGNF::convert); -grammar::GNF < > ToGNF::convert(const grammar::RightLG& origGrammar) { +grammar::GNF < > ToGNF::convert(const grammar::RightLG < > & origGrammar) { return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::LeftRecursionRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar)))); } -auto ToGNFRightLG = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::RightLG>(ToGNF::convert); +auto ToGNFRightLG = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::RightLG < > >(ToGNF::convert); grammar::RightRG ToGNF::convert(const grammar::RightRG& origGrammar) { return origGrammar; diff --git a/alib2algo/src/grammar/simplify/ToGNF.h b/alib2algo/src/grammar/simplify/ToGNF.h index a52794c8a3..2687c48238 100644 --- a/alib2algo/src/grammar/simplify/ToGNF.h +++ b/alib2algo/src/grammar/simplify/ToGNF.h @@ -39,7 +39,7 @@ public: static grammar::GNF < > convert( const grammar::LG < > & grammar ); static grammar::GNF < > convert( const grammar::LeftLG < > & grammar ); static grammar::RightRG convert( const grammar::LeftRG < > & grammar ); - static grammar::GNF < > convert( const grammar::RightLG & grammar ); + static grammar::GNF < > convert( const grammar::RightLG < > & grammar ); static grammar::RightRG convert( const grammar::RightRG & grammar ); }; diff --git a/alib2algo/src/grammar/simplify/Trim.cpp b/alib2algo/src/grammar/simplify/Trim.cpp index 39cd6ef41f..da336fb1ef 100644 --- a/alib2algo/src/grammar/simplify/Trim.cpp +++ b/alib2algo/src/grammar/simplify/Trim.cpp @@ -36,7 +36,7 @@ auto TrimCNF = Trim::RegistratorWrapper<grammar::CNF < >, grammar::CNF < > >(Tri auto TrimLG = Trim::RegistratorWrapper<grammar::LG < >, grammar::LG < > >(Trim::trim); auto TrimLeftLG = Trim::RegistratorWrapper<grammar::LeftLG < >, grammar::LeftLG < > >(Trim::trim); auto TrimLeftRG = Trim::RegistratorWrapper<grammar::LeftRG < >, grammar::LeftRG < > >(Trim::trim); -auto TrimRightLG = Trim::RegistratorWrapper<grammar::RightLG, grammar::RightLG>(Trim::trim); +auto TrimRightLG = Trim::RegistratorWrapper<grammar::RightLG < >, grammar::RightLG < > >(Trim::trim); auto TrimRightRG = Trim::RegistratorWrapper<grammar::RightRG, grammar::RightRG>(Trim::trim); grammar::Grammar Trim::trim(const grammar::Grammar& grammar) { diff --git a/alib2algo/src/grammar/simplify/UnproductiveSymbolsRemover.cpp b/alib2algo/src/grammar/simplify/UnproductiveSymbolsRemover.cpp index 86147f2bff..a1750a7eb6 100644 --- a/alib2algo/src/grammar/simplify/UnproductiveSymbolsRemover.cpp +++ b/alib2algo/src/grammar/simplify/UnproductiveSymbolsRemover.cpp @@ -67,7 +67,7 @@ auto UnproductiveSymbolsRemoverCNF = UnproductiveSymbolsRemover::RegistratorWrap auto UnproductiveSymbolsRemoverLG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::LG < >, grammar::LG < > >(UnproductiveSymbolsRemover::remove); auto UnproductiveSymbolsRemoverLeftLG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::LeftLG < >, grammar::LeftLG < > >(UnproductiveSymbolsRemover::remove); auto UnproductiveSymbolsRemoverLeftRG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::LeftRG < >, grammar::LeftRG < > >(UnproductiveSymbolsRemover::remove); -auto UnproductiveSymbolsRemoverRightLG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::RightLG, grammar::RightLG>(UnproductiveSymbolsRemover::remove); +auto UnproductiveSymbolsRemoverRightLG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::RightLG < >, grammar::RightLG < > >(UnproductiveSymbolsRemover::remove); auto UnproductiveSymbolsRemoverRightRG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::RightRG, grammar::RightRG>(UnproductiveSymbolsRemover::remove); grammar::Grammar UnproductiveSymbolsRemover::remove(const grammar::Grammar& grammar) { diff --git a/alib2algo/src/grammar/simplify/UnreachableSymbolsRemover.cpp b/alib2algo/src/grammar/simplify/UnreachableSymbolsRemover.cpp index 15c8c65dc9..d4d6ab4263 100644 --- a/alib2algo/src/grammar/simplify/UnreachableSymbolsRemover.cpp +++ b/alib2algo/src/grammar/simplify/UnreachableSymbolsRemover.cpp @@ -66,7 +66,7 @@ auto UnreachableSymbolsRemoverCNF = UnreachableSymbolsRemover::RegistratorWrappe auto UnreachableSymbolsRemoverLG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::LG < >, grammar::LG < > >(UnreachableSymbolsRemover::remove); auto UnreachableSymbolsRemoverLeftLG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::LeftLG < >, grammar::LeftLG < > >(UnreachableSymbolsRemover::remove); auto UnreachableSymbolsRemoverLeftRG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::LeftRG < >, grammar::LeftRG < > >(UnreachableSymbolsRemover::remove); -auto UnreachableSymbolsRemoverRightLG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::RightLG, grammar::RightLG>(UnreachableSymbolsRemover::remove); +auto UnreachableSymbolsRemoverRightLG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::RightLG < >, grammar::RightLG < > >(UnreachableSymbolsRemover::remove); auto UnreachableSymbolsRemoverRightRG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::RightRG, grammar::RightRG>(UnreachableSymbolsRemover::remove); grammar::Grammar UnreachableSymbolsRemover::remove(const grammar::Grammar& grammar) { diff --git a/alib2data/src/grammar/GrammarFeatures.h b/alib2data/src/grammar/GrammarFeatures.h index 119db86d6d..f66ce36b6d 100644 --- a/alib2data/src/grammar/GrammarFeatures.h +++ b/alib2data/src/grammar/GrammarFeatures.h @@ -35,6 +35,7 @@ template<class SymbolType = typename alphabet::Symbol > class LeftLG; template<class SymbolType = typename alphabet::Symbol > class LeftRG; +template<class SymbolType = typename alphabet::Symbol > class RightLG; class RightRG; template<class SymbolType = typename alphabet::Symbol > diff --git a/alib2data/src/grammar/Regular/RightLG.cpp b/alib2data/src/grammar/Regular/RightLG.cpp index 8ea8a51146..998787d6da 100644 --- a/alib2data/src/grammar/Regular/RightLG.cpp +++ b/alib2data/src/grammar/Regular/RightLG.cpp @@ -6,207 +6,13 @@ */ #include "RightLG.h" -#include <algorithm> -#include <sstream> - -#include "../../alphabet/Symbol.h" - -#include <sax/FromXMLParserHelper.h> -#include "../common/GrammarFromXMLParser.h" -#include "../common/GrammarToXMLComposer.h" #include "../Grammar.h" #include <object/Object.h> #include <XmlApi.hpp> -namespace grammar { - -RightLG::RightLG ( alphabet::Symbol initialSymbol ) : RightLG ( std::set < alphabet::Symbol > { initialSymbol }, std::set < alphabet::Symbol > ( ), initialSymbol ) { -} - -RightLG::RightLG ( std::set < alphabet::Symbol > nonterminalAlphabet, std::set < alphabet::Symbol > terminalAlphabet, alphabet::Symbol initialSymbol ) : std::Components < RightLG, alphabet::Symbol, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > ( std::make_tuple ( std::move ( terminalAlphabet ), std::move ( nonterminalAlphabet ) ), std::make_tuple ( std::move ( initialSymbol ) ) ) { -} - -GrammarBase * RightLG::clone ( ) const { - return new RightLG ( * this ); -} - -GrammarBase * RightLG::plunder ( ) && { - return new RightLG ( std::move ( * this ) ); -} - -bool RightLG::addRule ( alphabet::Symbol leftHandSide, std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > rightHandSide ) { - if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) ) - throw GrammarException ( "Rule must rewrite nonterminal symbol" ); - - if ( rightHandSide.is < std::vector < alphabet::Symbol > > ( ) ) { - for ( const auto & symbol : rightHandSide.get < std::vector < alphabet::Symbol > > ( ) ) - if ( !getTerminalAlphabet ( ).count ( symbol ) ) - throw GrammarException ( "Symbol " + std::to_string ( symbol ) + " is not a terminal symbol" ); - - return rules[std::move ( leftHandSide )].insert ( std::move ( rightHandSide ) ).second; - } else { - const std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > & rhs = rightHandSide.get < std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > ( ); - - if ( !getNonterminalAlphabet ( ).count ( rhs.second ) ) - throw GrammarException ( "Symbol " + std::to_string ( rhs.second ) + " is not a nonterminal symbol" ); - - for ( const auto & symbol : rhs.first ) - if ( !getTerminalAlphabet ( ).count ( symbol ) ) - throw GrammarException ( "Symbol " + std::to_string ( symbol ) + " is not a terminal symbol" ); - - return rules[std::move ( leftHandSide )].insert ( std::move ( rightHandSide ) ).second; - } -} - -bool RightLG::addRule ( alphabet::Symbol leftHandSide, std::vector < alphabet::Symbol > rightHandSide ) { - std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > rhs ( std::move ( rightHandSide ) ); - - return addRule ( std::move ( leftHandSide ), std::move ( rhs ) ); -} - -bool RightLG::addRule ( alphabet::Symbol leftHandSide, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > rightHandSide ) { - std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > rhs ( std::move ( rightHandSide ) ); - - return addRule ( std::move ( leftHandSide ), std::move ( rhs ) ); -} - -const std::map < alphabet::Symbol, std::set < std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > > > & RightLG::getRules ( ) const { - return rules; -} - -bool RightLG::removeRule ( const alphabet::Symbol & leftHandSide, const std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > & rightHandSide ) { - return rules[leftHandSide].erase ( rightHandSide ); -} - -bool RightLG::removeRule ( const alphabet::Symbol & leftHandSide, const std::vector < alphabet::Symbol > & rightHandSide ) { - std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > rhs ( rightHandSide ); - - return removeRule ( leftHandSide, rhs ); -} - -bool RightLG::removeRule ( const alphabet::Symbol & leftHandSide, const std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > & rightHandSide ) { - std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > rhs ( rightHandSide ); - - return removeRule ( leftHandSide, rhs ); -} - -bool RightLG::addRawRule ( alphabet::Symbol leftHandSide, std::vector < alphabet::Symbol > rightHandSide ) { - if ( rightHandSide.size ( ) == 0 ) - return addRule ( std::move ( leftHandSide ), std::move ( rightHandSide ) ); - else if ( getNonterminalAlphabet ( ).count ( rightHandSide[rightHandSide.size ( ) - 1] ) ) - return addRule ( std::move ( leftHandSide ), std::make_pair ( std::vector < alphabet::Symbol > ( std::make_move_iterator ( rightHandSide.begin ( ) ), std::make_move_iterator ( rightHandSide.end ( ) ) - 1 ), std::move ( rightHandSide[rightHandSide.size ( ) - 1] ) ) ); - else - return addRule ( std::move ( leftHandSide ), std::move ( rightHandSide ) ); -} - -std::map < alphabet::Symbol, std::set < std::vector < alphabet::Symbol > > > RightLG::getRawRules ( ) const { - std::map < alphabet::Symbol, std::set < std::vector < alphabet::Symbol > > > res; - - for ( const auto & rule : getRules ( ) ) - for ( const auto & rhs : rule.second ) { - if ( rhs.is < std::vector < alphabet::Symbol > > ( ) ) { - res[rule.first].insert ( rhs.get < std::vector < alphabet::Symbol > > ( ) ); - } else { - const auto & rhsTuple = rhs.get < std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > ( ); - std::vector < alphabet::Symbol > tmp { rhsTuple.first.begin ( ), rhsTuple.first.end ( ) }; - tmp.push_back ( rhsTuple.second ); - res[rule.first].insert ( std::move ( tmp ) ); - } - } - - return res; -} - -bool RightLG::removeRawRule ( const alphabet::Symbol & leftHandSide, const std::vector < alphabet::Symbol > & rightHandSide ) { - if ( rightHandSide.size ( ) == 0 ) - return removeRule ( leftHandSide, rightHandSide ); - else if ( getNonterminalAlphabet ( ).count ( rightHandSide[rightHandSide.size ( ) - 1] ) ) - return removeRule ( leftHandSide, std::make_pair ( std::vector < alphabet::Symbol > ( rightHandSide.begin ( ), rightHandSide.end ( ) - 1 ), rightHandSide[rightHandSide.size ( ) - 1] ) ); - else - return removeRule ( leftHandSide, rightHandSide ); -} - -int RightLG::compare ( const RightLG & other ) const { - auto first = std::tie ( getTerminalAlphabet ( ), getNonterminalAlphabet ( ), getInitialSymbol ( ), rules ); - auto second = std::tie ( other.getTerminalAlphabet ( ), other.getNonterminalAlphabet ( ), other.getInitialSymbol ( ), other.rules ); - - std::compare < decltype ( first ) > comp; - - return comp ( first, second ); -} - -void RightLG::operator >>( std::ostream & out ) const { - out << "(LeftLG " << "nonterminalAlphabet = " - << getNonterminalAlphabet ( ) << "terminalAlphabet = " - << getTerminalAlphabet ( ) << "initialSymbol = " - << getInitialSymbol ( ) << "rules = " - << rules << ")"; -} - -RightLG::operator std::string ( ) const { - std::stringstream ss; - ss << * this; - return ss.str ( ); -} - -RightLG RightLG::parse ( std::deque < sax::Token >::iterator & input ) { - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, RightLG::getXmlTagName() ); - - std::set < alphabet::Symbol > nonterminalAlphabet = GrammarFromXMLParser::parseNonterminalAlphabet ( input ); - std::set < alphabet::Symbol > terminalAlphabet = GrammarFromXMLParser::parseTerminalAlphabet ( input ); - alphabet::Symbol initialSymbol = GrammarFromXMLParser::parseInitialSymbol ( input ); - - RightLG grammar ( std::move ( initialSymbol ) ); - - grammar.setNonterminalAlphabet ( std::move ( nonterminalAlphabet ) ); - grammar.setTerminalAlphabet ( std::move ( terminalAlphabet ) ); - - GrammarFromXMLParser::parseRules ( input, grammar ); - - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, RightLG::getXmlTagName() ); - return grammar; -} - -void RightLG::parseRule ( std::deque < sax::Token >::iterator & input, RightLG & grammar ) { - alphabet::Symbol lhs = GrammarFromXMLParser::parseRuleSingleSymbolLHS ( input ); - std::vector < alphabet::Symbol > rhs = GrammarFromXMLParser::parseRuleRHS ( input ); - - grammar.addRawRule ( std::move ( lhs ), std::move ( rhs ) ); -} - -void RightLG::compose ( std::deque < sax::Token > & out ) const { - out.emplace_back ( RightLG::getXmlTagName(), sax::Token::TokenType::START_ELEMENT ); - - GrammarToXMLComposer::composeNonterminalAlphabet ( out, this->getNonterminalAlphabet ( ) ); - GrammarToXMLComposer::composeTerminalAlphabet ( out, this->getTerminalAlphabet ( ) ); - GrammarToXMLComposer::composeInitialSymbol ( out, this->getInitialSymbol ( ) ); - composeRules ( out ); - - out.emplace_back ( RightLG::getXmlTagName(), sax::Token::TokenType::END_ELEMENT ); -} - -void RightLG::composeRules ( std::deque < sax::Token > & out ) const { - out.emplace_back ( "rules", sax::Token::TokenType::START_ELEMENT ); - - for ( const auto & rule : this->getRules ( ) ) - - for ( const auto & rhs : rule.second ) { - out.emplace_back ( "rule", sax::Token::TokenType::START_ELEMENT ); - - GrammarToXMLComposer::composeRuleSingleSymbolLHS ( out, rule.first ); - GrammarToXMLComposer::composeRuleRightLGRHS ( out, rhs ); - - out.emplace_back ( "rule", sax::Token::TokenType::END_ELEMENT ); - } - - out.emplace_back ( "rules", sax::Token::TokenType::END_ELEMENT ); -} - -} /* namespace grammar */ - namespace alib { -auto RightLGParserRegister = xmlApi < grammar::Grammar >::ParserRegister < grammar::RightLG > ( ); -auto RightLGParserRegister2 = xmlApi < alib::Object >::ParserRegister < grammar::RightLG > ( ); +auto RightLGParserRegister = xmlApi < grammar::Grammar >::ParserRegister < grammar::RightLG < > > ( ); +auto RightLGParserRegister2 = xmlApi < alib::Object >::ParserRegister < grammar::RightLG < > > ( ); } /* namespace alib */ diff --git a/alib2data/src/grammar/Regular/RightLG.h b/alib2data/src/grammar/Regular/RightLG.h index 34d3881537..ae0f911e31 100644 --- a/alib2data/src/grammar/Regular/RightLG.h +++ b/alib2data/src/grammar/Regular/RightLG.h @@ -8,13 +8,20 @@ #ifndef RIGHT_LG_H_ #define RIGHT_LG_H_ -#include "../GrammarException.h" -#include "../GrammarBase.h" #include <map> #include <vector> #include <variant> +#include <algorithm> +#include <sstream> + #include <core/components.hpp> -#include "../../alphabet/Symbol.h" +#include <sax/FromXMLParserHelper.h> + +#include "../GrammarBase.h" +#include "../GrammarFeatures.h" +#include "../GrammarException.h" +#include "../common/GrammarFromXMLParser.h" +#include "../common/GrammarToXMLComposer.h" namespace grammar { @@ -25,64 +32,65 @@ class TerminalAlphabet; class NonterminalAlphabet; class InitialSymbol; -class RightLG : public GrammarBase, public std::Components < RightLG, alphabet::Symbol, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > { - std::map < alphabet::Symbol, std::set < std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > > > rules; +template < class SymbolType > +class RightLG : public GrammarBase, public std::Components < RightLG < SymbolType >, SymbolType, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > { + std::map < SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > rules; public: - explicit RightLG ( alphabet::Symbol initialSymbol ); + explicit RightLG ( SymbolType initialSymbol ); - explicit RightLG ( std::set < alphabet::Symbol > nonTerminalSymbols, std::set < alphabet::Symbol > terminalSymbols, alphabet::Symbol initialSymbol ); + explicit RightLG ( std::set < SymbolType > nonTerminalSymbols, std::set < SymbolType > terminalSymbols, SymbolType initialSymbol ); virtual GrammarBase * clone ( ) const; virtual GrammarBase * plunder ( ) &&; - bool addRule ( alphabet::Symbol leftHandSide, std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > rightHandSide ); - bool addRule ( alphabet::Symbol leftHandSide, std::vector < alphabet::Symbol > rightHandSide ); - bool addRule ( alphabet::Symbol leftHandSide, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > rightHandSide ); + bool addRule ( SymbolType leftHandSide, std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rightHandSide ); + bool addRule ( SymbolType leftHandSide, std::vector < SymbolType > rightHandSide ); + bool addRule ( SymbolType leftHandSide, std::pair < std::vector < SymbolType >, SymbolType > rightHandSide ); - const std::map < alphabet::Symbol, std::set < std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > > > & getRules ( ) const; + const std::map < SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > & getRules ( ) const; - bool removeRule ( const alphabet::Symbol & leftHandSide, const std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > & rightHandSide ); - bool removeRule ( const alphabet::Symbol & leftHandSide, const std::vector < alphabet::Symbol > & rightHandSide ); - bool removeRule ( const alphabet::Symbol & leftHandSide, const std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > & rightHandSide ); + bool removeRule ( const SymbolType & leftHandSide, const std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > & rightHandSide ); + bool removeRule ( const SymbolType & leftHandSide, const std::vector < SymbolType > & rightHandSide ); + bool removeRule ( const SymbolType & leftHandSide, const std::pair < std::vector < SymbolType >, SymbolType > & rightHandSide ); - bool addRawRule ( alphabet::Symbol leftHandSide, std::vector < alphabet::Symbol > rightHandSide ); + bool addRawRule ( SymbolType leftHandSide, std::vector < SymbolType > rightHandSide ); - std::map < alphabet::Symbol, std::set < std::vector < alphabet::Symbol > > > getRawRules ( ) const; + std::map < SymbolType, std::set < std::vector < SymbolType > > > getRawRules ( ) const; - bool removeRawRule ( const alphabet::Symbol & leftHandSide, const std::vector < alphabet::Symbol > & rightHandSide ); + bool removeRawRule ( const SymbolType & leftHandSide, const std::vector < SymbolType > & rightHandSide ); - const alphabet::Symbol & getInitialSymbol ( ) const { - return accessElement < InitialSymbol > ( ).get ( ); + const SymbolType & getInitialSymbol ( ) const { + return this->template accessElement < InitialSymbol > ( ).get ( ); } - bool setInitialSymbol ( alphabet::Symbol symbol ) { - return accessElement < InitialSymbol > ( ).set ( std::move ( symbol ) ); + bool setInitialSymbol ( SymbolType symbol ) { + return this->template accessElement < InitialSymbol > ( ).set ( std::move ( symbol ) ); } - const std::set < alphabet::Symbol > & getNonterminalAlphabet ( ) const { - return accessComponent < NonterminalAlphabet > ( ).get ( ); + const std::set < SymbolType > & getNonterminalAlphabet ( ) const { + return this->template accessComponent < NonterminalAlphabet > ( ).get ( ); } - bool addNonterminalSymbol ( alphabet::Symbol symbol ) { - return accessComponent < NonterminalAlphabet > ( ).add ( std::move ( symbol ) ); + bool addNonterminalSymbol ( SymbolType symbol ) { + return this->template accessComponent < NonterminalAlphabet > ( ).add ( std::move ( symbol ) ); } - void setNonterminalAlphabet ( std::set < alphabet::Symbol > symbols ) { - accessComponent < NonterminalAlphabet > ( ).set ( std::move ( symbols ) ); + void setNonterminalAlphabet ( std::set < SymbolType > symbols ) { + this->template accessComponent < NonterminalAlphabet > ( ).set ( std::move ( symbols ) ); } - const std::set < alphabet::Symbol > & getTerminalAlphabet ( ) const { - return accessComponent < TerminalAlphabet > ( ).get ( ); + const std::set < SymbolType > & getTerminalAlphabet ( ) const { + return this->template accessComponent < TerminalAlphabet > ( ).get ( ); } - bool addTerminalSymbol ( alphabet::Symbol symbol ) { - return accessComponent < TerminalAlphabet > ( ).add ( std::move ( symbol ) ); + bool addTerminalSymbol ( SymbolType symbol ) { + return this->template accessComponent < TerminalAlphabet > ( ).add ( std::move ( symbol ) ); } - void setTerminalAlphabet ( std::set < alphabet::Symbol > symbols ) { - accessComponent < TerminalAlphabet > ( ).set ( std::move ( symbols ) ); + void setTerminalAlphabet ( std::set < SymbolType > symbols ) { + this->template accessComponent < TerminalAlphabet > ( ).set ( std::move ( symbols ) ); } virtual int compare ( const ObjectBase & other ) const { @@ -110,23 +118,226 @@ public: void composeRules ( std::deque < sax::Token > & out ) const; }; +template < class SymbolType > +RightLG < SymbolType >::RightLG ( SymbolType initialSymbol ) : RightLG ( std::set < SymbolType > { initialSymbol }, std::set < SymbolType > ( ), initialSymbol ) { +} + +template < class SymbolType > +RightLG < SymbolType >::RightLG ( std::set < SymbolType > nonterminalAlphabet, std::set < SymbolType > terminalAlphabet, SymbolType initialSymbol ) : std::Components < RightLG, SymbolType, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > ( std::make_tuple ( std::move ( terminalAlphabet ), std::move ( nonterminalAlphabet ) ), std::make_tuple ( std::move ( initialSymbol ) ) ) { +} + +template < class SymbolType > +GrammarBase * RightLG < SymbolType >::clone ( ) const { + return new RightLG ( * this ); +} + +template < class SymbolType > +GrammarBase * RightLG < SymbolType >::plunder ( ) && { + return new RightLG ( std::move ( * this ) ); +} + +template < class SymbolType > +bool RightLG < SymbolType >::addRule ( SymbolType leftHandSide, std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rightHandSide ) { + if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) ) + throw GrammarException ( "Rule must rewrite nonterminal symbol" ); + + if ( rightHandSide.template is < std::vector < SymbolType > > ( ) ) { + for ( const auto & symbol : rightHandSide.template get < std::vector < SymbolType > > ( ) ) + if ( !getTerminalAlphabet ( ).count ( symbol ) ) + throw GrammarException ( "Symbol " + std::to_string ( symbol ) + " is not a terminal symbol" ); + + return rules[std::move ( leftHandSide )].insert ( std::move ( rightHandSide ) ).second; + } else { + const std::pair < std::vector < SymbolType >, SymbolType > & rhs = rightHandSide.template get < std::pair < std::vector < SymbolType >, SymbolType > > ( ); + + if ( !getNonterminalAlphabet ( ).count ( rhs.second ) ) + throw GrammarException ( "Symbol " + std::to_string ( rhs.second ) + " is not a nonterminal symbol" ); + + for ( const auto & symbol : rhs.first ) + if ( !getTerminalAlphabet ( ).count ( symbol ) ) + throw GrammarException ( "Symbol " + std::to_string ( symbol ) + " is not a terminal symbol" ); + + return rules[std::move ( leftHandSide )].insert ( std::move ( rightHandSide ) ).second; + } +} + +template < class SymbolType > +bool RightLG < SymbolType >::addRule ( SymbolType leftHandSide, std::vector < SymbolType > rightHandSide ) { + std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rhs ( std::move ( rightHandSide ) ); + + return addRule ( std::move ( leftHandSide ), std::move ( rhs ) ); +} + +template < class SymbolType > +bool RightLG < SymbolType >::addRule ( SymbolType leftHandSide, std::pair < std::vector < SymbolType >, SymbolType > rightHandSide ) { + std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rhs ( std::move ( rightHandSide ) ); + + return addRule ( std::move ( leftHandSide ), std::move ( rhs ) ); +} + +template < class SymbolType > +const std::map < SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > & RightLG < SymbolType >::getRules ( ) const { + return rules; +} + +template < class SymbolType > +bool RightLG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > & rightHandSide ) { + return rules[leftHandSide].erase ( rightHandSide ); +} + +template < class SymbolType > +bool RightLG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::vector < SymbolType > & rightHandSide ) { + std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rhs ( rightHandSide ); + + return removeRule ( leftHandSide, rhs ); +} + +template < class SymbolType > +bool RightLG < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::pair < std::vector < SymbolType >, SymbolType > & rightHandSide ) { + std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > rhs ( rightHandSide ); + + return removeRule ( leftHandSide, rhs ); +} + +template < class SymbolType > +bool RightLG < SymbolType >::addRawRule ( SymbolType leftHandSide, std::vector < SymbolType > rightHandSide ) { + if ( rightHandSide.size ( ) == 0 ) + return addRule ( std::move ( leftHandSide ), std::move ( rightHandSide ) ); + else if ( getNonterminalAlphabet ( ).count ( rightHandSide[rightHandSide.size ( ) - 1] ) ) + return addRule ( std::move ( leftHandSide ), std::make_pair ( std::vector < SymbolType > ( std::make_move_iterator ( rightHandSide.begin ( ) ), std::make_move_iterator ( rightHandSide.end ( ) ) - 1 ), std::move ( rightHandSide[rightHandSide.size ( ) - 1] ) ) ); + else + return addRule ( std::move ( leftHandSide ), std::move ( rightHandSide ) ); +} + +template < class SymbolType > +std::map < SymbolType, std::set < std::vector < SymbolType > > > RightLG < SymbolType >::getRawRules ( ) const { + std::map < SymbolType, std::set < std::vector < SymbolType > > > res; + + for ( const auto & rule : getRules ( ) ) + for ( const auto & rhs : rule.second ) { + if ( rhs.template is < std::vector < SymbolType > > ( ) ) { + res[rule.first].insert ( rhs.template get < std::vector < SymbolType > > ( ) ); + } else { + const auto & rhsTuple = rhs.template get < std::pair < std::vector < SymbolType >, SymbolType > > ( ); + std::vector < SymbolType > tmp { rhsTuple.first.begin ( ), rhsTuple.first.end ( ) }; + tmp.push_back ( rhsTuple.second ); + res[rule.first].insert ( std::move ( tmp ) ); + } + } + + return res; +} + +template < class SymbolType > +bool RightLG < SymbolType >::removeRawRule ( const SymbolType & leftHandSide, const std::vector < SymbolType > & rightHandSide ) { + if ( rightHandSide.size ( ) == 0 ) + return removeRule ( leftHandSide, rightHandSide ); + else if ( getNonterminalAlphabet ( ).count ( rightHandSide[rightHandSide.size ( ) - 1] ) ) + return removeRule ( leftHandSide, std::make_pair ( std::vector < SymbolType > ( rightHandSide.begin ( ), rightHandSide.end ( ) - 1 ), rightHandSide[rightHandSide.size ( ) - 1] ) ); + else + return removeRule ( leftHandSide, rightHandSide ); +} + +template < class SymbolType > +int RightLG < SymbolType >::compare ( const RightLG & other ) const { + auto first = std::tie ( getTerminalAlphabet ( ), getNonterminalAlphabet ( ), getInitialSymbol ( ), rules ); + auto second = std::tie ( other.getTerminalAlphabet ( ), other.getNonterminalAlphabet ( ), other.getInitialSymbol ( ), other.rules ); + + std::compare < decltype ( first ) > comp; + + return comp ( first, second ); +} + +template < class SymbolType > +void RightLG < SymbolType >::operator >>( std::ostream & out ) const { + out << "(LeftLG " << "nonterminalAlphabet = " + << getNonterminalAlphabet ( ) << "terminalAlphabet = " + << getTerminalAlphabet ( ) << "initialSymbol = " + << getInitialSymbol ( ) << "rules = " + << rules << ")"; +} + +template < class SymbolType > +RightLG < SymbolType >::operator std::string ( ) const { + std::stringstream ss; + ss << * this; + return ss.str ( ); +} + +template < class SymbolType > +RightLG < SymbolType > RightLG < SymbolType >::parse ( std::deque < sax::Token >::iterator & input ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, RightLG::getXmlTagName() ); + + std::set < SymbolType > nonterminalAlphabet = GrammarFromXMLParser::parseNonterminalAlphabet ( input ); + std::set < SymbolType > terminalAlphabet = GrammarFromXMLParser::parseTerminalAlphabet ( input ); + SymbolType initialSymbol = GrammarFromXMLParser::parseInitialSymbol ( input ); + + RightLG < SymbolType > grammar ( std::move ( initialSymbol ) ); + + grammar.setNonterminalAlphabet ( std::move ( nonterminalAlphabet ) ); + grammar.setTerminalAlphabet ( std::move ( terminalAlphabet ) ); + + GrammarFromXMLParser::parseRules ( input, grammar ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, RightLG::getXmlTagName() ); + return grammar; +} + +template < class SymbolType > +void RightLG < SymbolType >::parseRule ( std::deque < sax::Token >::iterator & input, RightLG & grammar ) { + SymbolType lhs = GrammarFromXMLParser::parseRuleSingleSymbolLHS ( input ); + std::vector < SymbolType > rhs = GrammarFromXMLParser::parseRuleRHS ( input ); + + grammar.addRawRule ( std::move ( lhs ), std::move ( rhs ) ); +} + +template < class SymbolType > +void RightLG < SymbolType >::compose ( std::deque < sax::Token > & out ) const { + out.emplace_back ( RightLG::getXmlTagName(), sax::Token::TokenType::START_ELEMENT ); + + GrammarToXMLComposer::composeNonterminalAlphabet ( out, this->getNonterminalAlphabet ( ) ); + GrammarToXMLComposer::composeTerminalAlphabet ( out, this->getTerminalAlphabet ( ) ); + GrammarToXMLComposer::composeInitialSymbol ( out, this->getInitialSymbol ( ) ); + composeRules ( out ); + + out.emplace_back ( RightLG::getXmlTagName(), sax::Token::TokenType::END_ELEMENT ); +} + +template < class SymbolType > +void RightLG < SymbolType >::composeRules ( std::deque < sax::Token > & out ) const { + out.emplace_back ( "rules", sax::Token::TokenType::START_ELEMENT ); + + for ( const auto & rule : this->getRules ( ) ) + + for ( const auto & rhs : rule.second ) { + out.emplace_back ( "rule", sax::Token::TokenType::START_ELEMENT ); + + GrammarToXMLComposer::composeRuleSingleSymbolLHS ( out, rule.first ); + GrammarToXMLComposer::composeRuleRightLGRHS ( out, rhs ); + + out.emplace_back ( "rule", sax::Token::TokenType::END_ELEMENT ); + } + + out.emplace_back ( "rules", sax::Token::TokenType::END_ELEMENT ); +} + } /* namespace grammar */ namespace std { -template < > -class ComponentConstraint< grammar::RightLG, alphabet::Symbol, grammar::TerminalAlphabet > { +template < class SymbolType > +class ComponentConstraint< grammar::RightLG < SymbolType >, SymbolType, grammar::TerminalAlphabet > { public: - static bool used ( const grammar::RightLG & grammar, const alphabet::Symbol & symbol ) { - for ( const std::pair < const alphabet::Symbol, std::set < std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > > > & rule : grammar.getRules ( ) ) { - for ( const std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > & rhsTmp : rule.second ) - if ( rhsTmp.is < std::vector < alphabet::Symbol > > ( ) ) { - const std::vector < alphabet::Symbol > & rhs = rhsTmp.get < std::vector < alphabet::Symbol > > ( ); + static bool used ( const grammar::RightLG < SymbolType > & grammar, const SymbolType & symbol ) { + for ( const std::pair < const SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > & rule : grammar.getRules ( ) ) { + for ( const std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > & rhsTmp : rule.second ) + if ( rhsTmp.template is < std::vector < SymbolType > > ( ) ) { + const std::vector < SymbolType > & rhs = rhsTmp.template get < std::vector < SymbolType > > ( ); if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.end ( ) ) return true; } else { - const std::vector < alphabet::Symbol > & rhs = rhsTmp.get < std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > ( ).first; + const std::vector < SymbolType > & rhs = rhsTmp.template get < std::pair < std::vector < SymbolType >, SymbolType > > ( ).first; if ( std::find ( rhs.begin ( ), rhs.end ( ), symbol ) != rhs.end ( ) ) return true; @@ -137,27 +348,27 @@ public: return false; } - static bool available ( const grammar::RightLG &, const alphabet::Symbol & ) { + static bool available ( const grammar::RightLG < SymbolType > &, const SymbolType & ) { return true; } - static void valid ( const grammar::RightLG & grammar, const alphabet::Symbol & symbol ) { - if ( grammar.accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ) ) + static void valid ( const grammar::RightLG < SymbolType > & grammar, const SymbolType & symbol ) { + if ( grammar.template accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ) ) throw grammar::GrammarException ( "Symbol " + std::to_string ( symbol ) + "cannot be in terminal alphabet since it is already nonterminal alphabet" ); } }; -template < > -class ComponentConstraint< grammar::RightLG, alphabet::Symbol, grammar::NonterminalAlphabet > { +template < class SymbolType > +class ComponentConstraint< grammar::RightLG < SymbolType >, SymbolType, grammar::NonterminalAlphabet > { public: - static bool used ( const grammar::RightLG & grammar, const alphabet::Symbol & symbol ) { - for ( const std::pair < const alphabet::Symbol, std::set < std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > > > & rule : grammar.getRules ( ) ) { + static bool used ( const grammar::RightLG < SymbolType > & grammar, const SymbolType & symbol ) { + for ( const std::pair < const SymbolType, std::set < std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > > > & rule : grammar.getRules ( ) ) { if ( rule.first == symbol ) return true; - for ( const std::variant < std::vector < alphabet::Symbol >, std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > & rhsTmp : rule.second ) - if ( rhsTmp.is < std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > ( ) ) { - const std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > & rhs = rhsTmp.get < std::pair < std::vector < alphabet::Symbol >, alphabet::Symbol > > ( ); + for ( const std::variant < std::vector < SymbolType >, std::pair < std::vector < SymbolType >, SymbolType > > & rhsTmp : rule.second ) + if ( rhsTmp.template is < std::pair < std::vector < SymbolType >, SymbolType > > ( ) ) { + const std::pair < std::vector < SymbolType >, SymbolType > & rhs = rhsTmp.template get < std::pair < std::vector < SymbolType >, SymbolType > > ( ); if ( rhs.second == symbol ) return true; @@ -165,30 +376,30 @@ public: } - if ( grammar.accessElement < grammar::InitialSymbol > ( ).get ( ) == symbol ) + if ( grammar.template accessElement < grammar::InitialSymbol > ( ).get ( ) == symbol ) return true; return false; } - static bool available ( const grammar::RightLG &, const alphabet::Symbol & ) { + static bool available ( const grammar::RightLG < SymbolType > &, const SymbolType & ) { return true; } - static void valid ( const grammar::RightLG & grammar, const alphabet::Symbol & symbol ) { - if ( grammar.accessComponent < grammar::TerminalAlphabet > ( ).get ( ).count ( symbol ) ) + static void valid ( const grammar::RightLG < SymbolType > & grammar, const SymbolType & symbol ) { + if ( grammar.template accessComponent < grammar::TerminalAlphabet > ( ).get ( ).count ( symbol ) ) throw grammar::GrammarException ( "Symbol " + std::to_string ( symbol ) + "cannot be in nonterminal alphabet since it is already in terminal alphabet" ); } }; -template < > -class ElementConstraint< grammar::RightLG, alphabet::Symbol, grammar::InitialSymbol > { +template < class SymbolType > +class ElementConstraint< grammar::RightLG < SymbolType >, SymbolType, grammar::InitialSymbol > { public: - static bool available ( const grammar::RightLG & grammar, const alphabet::Symbol & symbol ) { - return grammar.accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ); + static bool available ( const grammar::RightLG < SymbolType > & grammar, const SymbolType & symbol ) { + return grammar.template accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ); } - static void valid ( const grammar::RightLG &, const alphabet::Symbol & ) { + static void valid ( const grammar::RightLG < SymbolType > &, const SymbolType & ) { } }; diff --git a/alib2data/test-src/grammar/GrammarTest.cpp b/alib2data/test-src/grammar/GrammarTest.cpp index dc95098a0d..12c285b15c 100644 --- a/alib2data/test-src/grammar/GrammarTest.cpp +++ b/alib2data/test-src/grammar/GrammarTest.cpp @@ -120,7 +120,7 @@ void GrammarTest::testRegularParser() { } { - grammar::RightLG grammar(alphabet::symbolFrom(1)); + grammar::RightLG < > grammar(alphabet::symbolFrom(1)); grammar.addNonterminalSymbol(alphabet::symbolFrom(1)); grammar.addNonterminalSymbol(alphabet::symbolFrom(2)); @@ -143,7 +143,7 @@ void GrammarTest::testRegularParser() { std::deque<sax::Token> tokens2; sax::SaxParseInterface::parseMemory(tmp, tokens2); - grammar::RightLG grammar2 = alib::XmlDataFactory::fromTokens<grammar::RightLG>(std::move(tokens2)); + grammar::RightLG < > grammar2 = alib::XmlDataFactory::fromTokens<grammar::RightLG < > >(std::move(tokens2)); CPPUNIT_ASSERT( grammar == grammar2 ); } diff --git a/alib2str/src/grammar/GrammarFromStringParser.cpp b/alib2str/src/grammar/GrammarFromStringParser.cpp index 77cb64c733..6fb235751b 100644 --- a/alib2str/src/grammar/GrammarFromStringParser.cpp +++ b/alib2str/src/grammar/GrammarFromStringParser.cpp @@ -467,13 +467,13 @@ LeftRG < > GrammarFromStringParser::parseLeftRG(std::istream& input) const { return parseCFLikeGrammar<LeftRG < > >(input); } -RightLG GrammarFromStringParser::parseRightLG(std::istream& input) const { +RightLG < > GrammarFromStringParser::parseRightLG(std::istream& input) const { GrammarFromStringLexer::Token token = m_GrammarLexer.next(input); if(token.type != GrammarFromStringLexer::TokenType::RIGHT_LG) { throw exception::CommonException("Unrecognised RightLG token."); } - return parseCFLikeGrammar<RightLG>(input); + return parseCFLikeGrammar<RightLG < > >(input); } LeftLG < > GrammarFromStringParser::parseLeftLG(std::istream& input) const { diff --git a/alib2str/src/grammar/GrammarFromStringParser.h b/alib2str/src/grammar/GrammarFromStringParser.h index 6538121e5d..082874173d 100644 --- a/alib2str/src/grammar/GrammarFromStringParser.h +++ b/alib2str/src/grammar/GrammarFromStringParser.h @@ -47,7 +47,7 @@ private: RightRG parseRightRG(std::istream& input) const; LeftRG < > parseLeftRG(std::istream& input) const; - RightLG parseRightLG(std::istream& input) const; + RightLG < > parseRightLG(std::istream& input) const; LeftLG < > parseLeftLG(std::istream& input) const; LG < > parseLG(std::istream& input) const; diff --git a/alib2str/src/grammar/GrammarToStringComposer.cpp b/alib2str/src/grammar/GrammarToStringComposer.cpp index c992eebb0e..b9c145f069 100644 --- a/alib2str/src/grammar/GrammarToStringComposer.cpp +++ b/alib2str/src/grammar/GrammarToStringComposer.cpp @@ -198,12 +198,12 @@ void GrammarToStringComposer::compose(std::ostream& output, const LeftRG < > & g GrammarToStringComposer::RegistratorWrapper<void, LeftRG < > > GrammarToStringComposerLeftRG = GrammarToStringComposer::RegistratorWrapper<void, LeftRG < > >(GrammarToStringComposer::compose); -void GrammarToStringComposer::compose(std::ostream& output, const RightLG& grammar) { +void GrammarToStringComposer::compose(std::ostream& output, const RightLG < > & grammar) { output << "RIGHT_LG"; composeCFLikeGrammar(output, grammar); } -GrammarToStringComposer::RegistratorWrapper<void, RightLG> GrammarToStringComposerRightLG = GrammarToStringComposer::RegistratorWrapper<void, RightLG>(GrammarToStringComposer::compose); +GrammarToStringComposer::RegistratorWrapper<void, RightLG < > > GrammarToStringComposerRightLG = GrammarToStringComposer::RegistratorWrapper<void, RightLG < > >(GrammarToStringComposer::compose); void GrammarToStringComposer::compose(std::ostream& output, const RightRG& grammar) { output << "RIGHT_RG"; diff --git a/alib2str/src/grammar/GrammarToStringComposer.h b/alib2str/src/grammar/GrammarToStringComposer.h index d8d54e5c20..cb9887a9f7 100644 --- a/alib2str/src/grammar/GrammarToStringComposer.h +++ b/alib2str/src/grammar/GrammarToStringComposer.h @@ -26,7 +26,7 @@ public: static void compose(std::ostream& output, const LeftLG < > & grammar); static void compose(std::ostream& output, const LeftRG < > & grammar); - static void compose(std::ostream& output, const RightLG& grammar); + static void compose(std::ostream& output, const RightLG < > & grammar); static void compose(std::ostream& output, const RightRG& grammar); static void compose(std::ostream& output, const LG < > & grammar); static void compose(std::ostream& output, const CFG < > & grammar); -- GitLab