diff --git a/acompare2/src/GrammarCompare.cpp b/acompare2/src/GrammarCompare.cpp index a11b92167fec966d288213880ab6db7cb3c2ace2..59d88097c555a9b16098d0bd37693567f29cb667 100644 --- a/acompare2/src/GrammarCompare.cpp +++ b/acompare2/src/GrammarCompare.cpp @@ -86,7 +86,7 @@ bool GrammarCompare::testCompare(const grammar::CNF < > & a, const grammar::CNF a.getTerminalAlphabet() == b.getTerminalAlphabet() ; } -bool GrammarCompare::testCompare(const grammar::GNF& a, const grammar::GNF& b) { +bool GrammarCompare::testCompare(const grammar::GNF < > & a, const grammar::GNF < > & b) { return a.getNonterminalAlphabet() == b.getNonterminalAlphabet() && a.getRules() == b.getRules() && a.getInitialSymbol() == b.getInitialSymbol() && @@ -409,7 +409,7 @@ void GrammarCompare::printCompare(const grammar::CNF < > & a, const grammar::CNF } } -void GrammarCompare::printCompare(const grammar::GNF& a, const grammar::GNF& b) { +void GrammarCompare::printCompare(const grammar::GNF < > & a, const grammar::GNF < > & b) { std::cout << "GrammarCompareer" << std::endl; if(a.getNonterminalAlphabet() != b.getNonterminalAlphabet()) { @@ -647,7 +647,7 @@ int GrammarCompare::compare(const grammar::CNF < > & a, const grammar::CNF < > & auto GrammarCompareCNF = GrammarCompare::RegistratorWrapper<int, grammar::CNF < >, grammar::CNF < > >(GrammarCompare::compare); -int GrammarCompare::compare(const grammar::GNF& a, const grammar::GNF& b) { +int GrammarCompare::compare(const grammar::GNF < > & a, const grammar::GNF < > & b) { if(!GrammarCompare::testCompare(a, b)) { GrammarCompare::printCompare(a, b); return 1; @@ -656,7 +656,7 @@ int GrammarCompare::compare(const grammar::GNF& a, const grammar::GNF& b) { } } -auto GrammarCompareGNF = GrammarCompare::RegistratorWrapper<int, grammar::GNF, grammar::GNF>(GrammarCompare::compare); +auto GrammarCompareGNF = GrammarCompare::RegistratorWrapper<int, grammar::GNF < >, grammar::GNF < > >(GrammarCompare::compare); int GrammarCompare::compare(const grammar::CSG& a, const grammar::CSG& b) { if(!GrammarCompare::testCompare(a, b)) { diff --git a/acompare2/src/GrammarCompare.h b/acompare2/src/GrammarCompare.h index 2d77583672b063266c824ea36d44c89c57609d78..c261c76b603459b56b4bfe349d289cd6a187f9e4 100644 --- a/acompare2/src/GrammarCompare.h +++ b/acompare2/src/GrammarCompare.h @@ -44,8 +44,8 @@ private: static bool testCompare(const grammar::CNF < > & a, const grammar::CNF < > & b); static void printCompare(const grammar::CNF < > & a, const grammar::CNF < > & b); - static bool testCompare(const grammar::GNF& a, const grammar::GNF& b); - static void printCompare(const grammar::GNF& a, const grammar::GNF& b); + static bool testCompare(const grammar::GNF < > & a, const grammar::GNF < > & b); + static void printCompare(const grammar::GNF < > & a, const grammar::GNF < > & b); static bool testCompare(const grammar::CSG& a, const grammar::CSG& b); static void printCompare(const grammar::CSG& a, const grammar::CSG& b); @@ -71,7 +71,7 @@ public: static int compare(const grammar::CFG < > & a, const grammar::CFG < > & b); static int compare(const grammar::EpsilonFreeCFG < > & a, const grammar::EpsilonFreeCFG < > & b); static int compare(const grammar::CNF < > & a, const grammar::CNF < > & b); - static int compare(const grammar::GNF& a, const grammar::GNF& b); + static int compare(const grammar::GNF < > & a, const grammar::GNF < > & b); static int compare(const grammar::CSG& a, const grammar::CSG& b); static int compare(const grammar::NonContractingGrammar& a, const grammar::NonContractingGrammar& b); static int compare(const grammar::ContextPreservingUnrestrictedGrammar& a, const grammar::ContextPreservingUnrestrictedGrammar& b); diff --git a/alib2algo/src/grammar/generate/GenerateUpToLength.cpp b/alib2algo/src/grammar/generate/GenerateUpToLength.cpp index 4220054ae1d91acb23e710add22c7f5a09994f55..3f6ca4fa6ab9a299e7037892a3d6e6e1b2fac786 100644 --- a/alib2algo/src/grammar/generate/GenerateUpToLength.cpp +++ b/alib2algo/src/grammar/generate/GenerateUpToLength.cpp @@ -62,7 +62,7 @@ std::set<string::LinearString < >> GenerateUpToLength::generate( const T & gramm } auto GenerateUpToLengthEpsilonFreeCFG = GenerateUpToLength::RegistratorWrapper<std::set<string::LinearString < >>, grammar::EpsilonFreeCFG < > >(GenerateUpToLength::generate); -auto GenerateUpToLengthGNF = GenerateUpToLength::RegistratorWrapper<std::set<string::LinearString < >>, grammar::GNF>(GenerateUpToLength::generate); +auto GenerateUpToLengthGNF = GenerateUpToLength::RegistratorWrapper<std::set<string::LinearString < >>, grammar::GNF < > >(GenerateUpToLength::generate); auto GenerateUpToLengthCNF = GenerateUpToLength::RegistratorWrapper<std::set<string::LinearString < >>, grammar::CNF < > >(GenerateUpToLength::generate); auto GenerateUpToLengthLeftRG = GenerateUpToLength::RegistratorWrapper<std::set<string::LinearString < >>, grammar::LeftRG>(GenerateUpToLength::generate); auto GenerateUpToLengthRightRG = GenerateUpToLength::RegistratorWrapper<std::set<string::LinearString < >>, grammar::RightRG>(GenerateUpToLength::generate); diff --git a/alib2algo/src/grammar/parsing/First.cpp b/alib2algo/src/grammar/parsing/First.cpp index 85bf976a710f509d1bab4c86ff229b88a64fc3ba..ac0af059dd171d76864047be03a61e95fa9eba43 100644 --- a/alib2algo/src/grammar/parsing/First.cpp +++ b/alib2algo/src/grammar/parsing/First.cpp @@ -106,11 +106,11 @@ std::set < std::variant < alphabet::Symbol, string::Epsilon < > > > First::first auto FirstCFG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::CFG < > > ( First::first ); auto FirstEpsilonFreeCFG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::EpsilonFreeCFG < > > ( First::first ); -auto FirstGNF = FirstBase1::RegistratorWrapper < FirstResult1, grammar::GNF > ( First::first ); +auto FirstGNF = FirstBase1::RegistratorWrapper < FirstResult1, grammar::GNF < > > ( First::first ); auto FirstCNF = FirstBase1::RegistratorWrapper < FirstResult1, grammar::CNF < > > ( First::first ); -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 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 FirstRightRG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::RightRG > ( First::first ); @@ -120,11 +120,11 @@ std::map < std::vector < alphabet::Symbol >, std::set < std::variant < alphabet: auto FirstCFG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::CFG < > > ( First::first ); auto FirstEpsilonFreeCFG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::EpsilonFreeCFG < > > ( First::first ); -auto FirstGNF2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::GNF > ( First::first ); +auto FirstGNF2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::GNF < > > ( First::first ); auto FirstCNF2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::CNF < > > ( First::first ); -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 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 FirstRightRG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::RightRG > ( First::first ); diff --git a/alib2algo/src/grammar/parsing/Follow.cpp b/alib2algo/src/grammar/parsing/Follow.cpp index 6b1cde9505c2f39010fd07ee2331f414fd6ed227..a457091414184f5b2a840900fd063217700caf2a 100644 --- a/alib2algo/src/grammar/parsing/Follow.cpp +++ b/alib2algo/src/grammar/parsing/Follow.cpp @@ -94,11 +94,11 @@ std::set < std::variant < alphabet::Symbol, string::Epsilon < > > > Follow::foll auto FollowCFG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::CFG < > > ( Follow::follow ); auto FollowEpsilonFreeCFG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::EpsilonFreeCFG < > > ( Follow::follow ); -auto FollowGNF = FollowBase1::RegistratorWrapper < FollowResult1, grammar::GNF > ( Follow::follow ); +auto FollowGNF = FollowBase1::RegistratorWrapper < FollowResult1, grammar::GNF < > > ( Follow::follow ); auto FollowCNF = FollowBase1::RegistratorWrapper < FollowResult1, grammar::CNF < > > ( Follow::follow ); -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 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 FollowRightRG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::RightRG > ( Follow::follow ); @@ -108,11 +108,11 @@ std::map < alphabet::Symbol, std::set < std::variant < alphabet::Symbol, string: auto FollowCFG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::CFG < > > ( Follow::follow ); auto FollowEpsilonFreeCFG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::EpsilonFreeCFG < > > ( Follow::follow ); -auto FollowGNF2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::GNF > ( Follow::follow ); +auto FollowGNF2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::GNF < > > ( Follow::follow ); auto FollowCNF2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::CNF < > > ( Follow::follow ); -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 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 FollowRightRG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::RightRG > ( Follow::follow ); diff --git a/alib2algo/src/grammar/parsing/LL1ParseTable.cpp b/alib2algo/src/grammar/parsing/LL1ParseTable.cpp index 8f8e6934a114ea7d9f0d5d3cf8dd035146a45d17..0da6a227ef3f94888b7e48b862abbc14c918aa5a 100644 --- a/alib2algo/src/grammar/parsing/LL1ParseTable.cpp +++ b/alib2algo/src/grammar/parsing/LL1ParseTable.cpp @@ -52,7 +52,7 @@ std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, a auto LL1ParseTableCFG = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::CFG < > > ( LL1ParseTable::parseTable ); auto LL1ParseTableEpsilonFreeCFG = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::EpsilonFreeCFG < > > ( LL1ParseTable::parseTable ); -auto LL1ParseTableGNF = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::GNF > ( LL1ParseTable::parseTable ); +auto LL1ParseTableGNF = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::GNF < > > ( LL1ParseTable::parseTable ); auto LL1ParseTableCNF = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < alphabet::Symbol, string::Epsilon < > >, alphabet::Symbol >, std::set < std::vector < alphabet::Symbol > > >, grammar::CNF < > > ( LL1ParseTable::parseTable ); 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 ); diff --git a/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp b/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp index ce3c2c41f3df987e82f34e26d6a3feeba1b0c6aa..2c6440b9c4e16911f3aeb55f1f2e459cb18e9194 100644 --- a/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp +++ b/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp @@ -30,7 +30,7 @@ bool IsLanguageEmpty::isLanguageEmpty( const T & grammar ) { auto IsLanguageEmptyCFG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::CFG < > >(IsLanguageEmpty::isLanguageEmpty); auto IsLanguageEmptyEpsilonFreeCFG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::EpsilonFreeCFG < > >(IsLanguageEmpty::isLanguageEmpty); -auto IsLanguageEmptyGNF = IsLanguageEmpty::RegistratorWrapper<bool, grammar::GNF>(IsLanguageEmpty::isLanguageEmpty); +auto IsLanguageEmptyGNF = IsLanguageEmpty::RegistratorWrapper<bool, grammar::GNF < > >(IsLanguageEmpty::isLanguageEmpty); auto IsLanguageEmptyCNF = IsLanguageEmpty::RegistratorWrapper<bool, grammar::CNF < > >(IsLanguageEmpty::isLanguageEmpty); auto IsLanguageEmptyLG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::LG>(IsLanguageEmpty::isLanguageEmpty); auto IsLanguageEmptyLeftLG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::LeftLG>(IsLanguageEmpty::isLanguageEmpty); diff --git a/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp b/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp index dc8feab5bed90acb8bf0f560df61f39e0ecb2f3e..192998c3b8fa07fbbadde932472af9b88fe49b61 100644 --- a/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp +++ b/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp @@ -30,7 +30,7 @@ bool IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon( const T & grammar auto IsLanguageGeneratingEpsilonCFG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::CFG < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon); auto IsLanguageGeneratingEpsilonEpsilonFreeCFG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::EpsilonFreeCFG < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon); -auto IsLanguageGeneratingEpsilonGNF = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::GNF>(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon); +auto IsLanguageGeneratingEpsilonGNF = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::GNF < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon); auto IsLanguageGeneratingEpsilonCNF = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::CNF < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon); auto IsLanguageGeneratingEpsilonLG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::LG>(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon); auto IsLanguageGeneratingEpsilonLeftLG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::LeftLG>(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon); diff --git a/alib2algo/src/grammar/properties/NonterminalUnitRuleCycle.cpp b/alib2algo/src/grammar/properties/NonterminalUnitRuleCycle.cpp index 9aba9aed95196d6faa06aa6032fa73e69908b816..459642d63d0fca4891b7c2855194e4251845e3b4 100644 --- a/alib2algo/src/grammar/properties/NonterminalUnitRuleCycle.cpp +++ b/alib2algo/src/grammar/properties/NonterminalUnitRuleCycle.cpp @@ -59,7 +59,7 @@ std::set<alphabet::Symbol> NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle auto NonterminalUnitRuleCycleCFG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::CFG < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle); auto NonterminalUnitRuleCycleEpsilonFreeCFG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::EpsilonFreeCFG < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle); -auto NonterminalUnitRuleCycleGNF = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::GNF>(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle); +auto NonterminalUnitRuleCycleGNF = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::GNF < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle); auto NonterminalUnitRuleCycleCNF = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::CNF < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle); auto NonterminalUnitRuleCycleLG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LG>(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle); auto NonterminalUnitRuleCycleLeftLG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftLG>(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle); diff --git a/alib2algo/src/grammar/properties/NullableNonterminals.cpp b/alib2algo/src/grammar/properties/NullableNonterminals.cpp index c9e5e6c281f99ad8ce12a9a5a3b078d781c74cc3..c64dae41e71461f7e73e67d01ea4fe46f1f401c4 100644 --- a/alib2algo/src/grammar/properties/NullableNonterminals.cpp +++ b/alib2algo/src/grammar/properties/NullableNonterminals.cpp @@ -53,7 +53,7 @@ std::set<alphabet::Symbol> NullableNonterminals::getNullableNonterminals(const T auto NullableNonterminalsCFG = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::CFG < > >(NullableNonterminals::getNullableNonterminals); auto NullableNonterminalsEpsilonFreeCFG = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::EpsilonFreeCFG < > >(NullableNonterminals::getNullableNonterminals); -auto NullableNonterminalsGNF = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::GNF>(NullableNonterminals::getNullableNonterminals); +auto NullableNonterminalsGNF = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::GNF < > >(NullableNonterminals::getNullableNonterminals); auto NullableNonterminalsCNF = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::CNF < > >(NullableNonterminals::getNullableNonterminals); auto NullableNonterminalsLG = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LG>(NullableNonterminals::getNullableNonterminals); auto NullableNonterminalsLeftLG = NullableNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftLG>(NullableNonterminals::getNullableNonterminals); diff --git a/alib2algo/src/grammar/properties/ProductiveNonterminals.cpp b/alib2algo/src/grammar/properties/ProductiveNonterminals.cpp index 4714eb206aab6760294a8b3e2466ca013f906cbd..1ff0035172e8aee40f79d6d5b230c385d93c3be3 100644 --- a/alib2algo/src/grammar/properties/ProductiveNonterminals.cpp +++ b/alib2algo/src/grammar/properties/ProductiveNonterminals.cpp @@ -58,7 +58,7 @@ std::set<alphabet::Symbol> ProductiveNonterminals::getProductiveNonterminals( co auto ProductiveNonterminalsCFG = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::CFG < > >(ProductiveNonterminals::getProductiveNonterminals); auto ProductiveNonterminalsEpsilonFreeCFG = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::EpsilonFreeCFG < > >(ProductiveNonterminals::getProductiveNonterminals); -auto ProductiveNonterminalsGNF = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::GNF>(ProductiveNonterminals::getProductiveNonterminals); +auto ProductiveNonterminalsGNF = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::GNF < > >(ProductiveNonterminals::getProductiveNonterminals); auto ProductiveNonterminalsCNF = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::CNF < > >(ProductiveNonterminals::getProductiveNonterminals); auto ProductiveNonterminalsLG = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LG>(ProductiveNonterminals::getProductiveNonterminals); auto ProductiveNonterminalsLeftLG = ProductiveNonterminals::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftLG>(ProductiveNonterminals::getProductiveNonterminals); diff --git a/alib2algo/src/grammar/properties/RecursiveNonterminal.cpp b/alib2algo/src/grammar/properties/RecursiveNonterminal.cpp index 1273afd732bb527c2b59f8130d1f8241d956d1bd..9883def5b92e3f5ab14348f26ba6f088d7237e32 100644 --- a/alib2algo/src/grammar/properties/RecursiveNonterminal.cpp +++ b/alib2algo/src/grammar/properties/RecursiveNonterminal.cpp @@ -65,7 +65,7 @@ bool RecursiveNonterminal::isNonterminalRecursive ( const T & grammar, const alp auto RecursiveNonterminalCFG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::CFG < > > ( RecursiveNonterminal::isNonterminalRecursive ); auto RecursiveNonterminalEpsilonFreeCFG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::EpsilonFreeCFG < > > ( RecursiveNonterminal::isNonterminalRecursive ); -auto RecursiveNonterminalGNF = RecursiveNonterminal::RegistratorWrapper < bool, grammar::GNF > ( RecursiveNonterminal::isNonterminalRecursive ); +auto RecursiveNonterminalGNF = RecursiveNonterminal::RegistratorWrapper < bool, grammar::GNF < > > ( RecursiveNonterminal::isNonterminalRecursive ); auto RecursiveNonterminalCNF = RecursiveNonterminal::RegistratorWrapper < bool, grammar::CNF < > > ( RecursiveNonterminal::isNonterminalRecursive ); auto RecursiveNonterminalLG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::LG > ( RecursiveNonterminal::isNonterminalRecursive ); auto RecursiveNonterminalLeftLG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::LeftLG > ( RecursiveNonterminal::isNonterminalRecursive ); diff --git a/alib2algo/src/grammar/properties/UnreachableSymbols.cpp b/alib2algo/src/grammar/properties/UnreachableSymbols.cpp index e2ee315a80ae991c7a3abd2b3b65275e7e7d812c..d3c0c6917bb83e5deba60bd105bdb4b0a4faccc6 100644 --- a/alib2algo/src/grammar/properties/UnreachableSymbols.cpp +++ b/alib2algo/src/grammar/properties/UnreachableSymbols.cpp @@ -59,7 +59,7 @@ std::set<alphabet::Symbol> UnreachableSymbols::getUnreachableSymbols( const T & auto UnreachableSymbolsCFG = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::CFG < > >(UnreachableSymbols::getUnreachableSymbols); auto UnreachableSymbolsEpsilonFreeCFG = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::EpsilonFreeCFG < > >(UnreachableSymbols::getUnreachableSymbols); -auto UnreachableSymbolsGNF = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::GNF>(UnreachableSymbols::getUnreachableSymbols); +auto UnreachableSymbolsGNF = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::GNF < > >(UnreachableSymbols::getUnreachableSymbols); auto UnreachableSymbolsCNF = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::CNF < > >(UnreachableSymbols::getUnreachableSymbols); auto UnreachableSymbolsLG = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LG>(UnreachableSymbols::getUnreachableSymbols); auto UnreachableSymbolsLeftLG = UnreachableSymbols::RegistratorWrapper<std::set<alphabet::Symbol>, grammar::LeftLG>(UnreachableSymbols::getUnreachableSymbols); diff --git a/alib2algo/src/grammar/simplify/EpsilonRemover.cpp b/alib2algo/src/grammar/simplify/EpsilonRemover.cpp index 4f1b57041461e77b53189527adcc44fad07f510a..cf4ba01055708b75cb24aa1b24009e393b147736 100644 --- a/alib2algo/src/grammar/simplify/EpsilonRemover.cpp +++ b/alib2algo/src/grammar/simplify/EpsilonRemover.cpp @@ -70,11 +70,11 @@ grammar::CNF < > EpsilonRemover::remove(const grammar::CNF < > & origGrammar) { auto EpsilonRemoverCNF = EpsilonRemover::RegistratorWrapper<grammar::CNF < >, grammar::CNF < > >(EpsilonRemover::remove); -grammar::GNF EpsilonRemover::remove(const grammar::GNF& origGrammar) { +grammar::GNF < > EpsilonRemover::remove(const grammar::GNF < > & origGrammar) { return origGrammar; } -auto EpsilonRemoverGNF = EpsilonRemover::RegistratorWrapper<grammar::GNF, grammar::GNF>(EpsilonRemover::remove); +auto EpsilonRemoverGNF = EpsilonRemover::RegistratorWrapper<grammar::GNF < >, grammar::GNF < > >(EpsilonRemover::remove); grammar::EpsilonFreeCFG < > EpsilonRemover::remove(const grammar::LG& origGrammar) { return removeInternal(origGrammar); diff --git a/alib2algo/src/grammar/simplify/EpsilonRemover.h b/alib2algo/src/grammar/simplify/EpsilonRemover.h index c750fb2dc104ca0eb3471947720349cdc162b290..3b9cf5d06a1f30a211648e494fd95ba7ddcee5c8 100644 --- a/alib2algo/src/grammar/simplify/EpsilonRemover.h +++ b/alib2algo/src/grammar/simplify/EpsilonRemover.h @@ -34,7 +34,7 @@ public: static grammar::EpsilonFreeCFG < > remove( const grammar::CFG < > & grammar ); static grammar::EpsilonFreeCFG < > remove( const grammar::EpsilonFreeCFG < > & grammar ); - static grammar::GNF remove( const grammar::GNF & grammar ); + static grammar::GNF < > remove( const grammar::GNF < > & grammar ); static grammar::CNF < > remove( const grammar::CNF < > & grammar ); static grammar::EpsilonFreeCFG < > remove( const grammar::LG & grammar ); static grammar::EpsilonFreeCFG < > remove( const grammar::LeftLG & grammar ); diff --git a/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp b/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp index 93998afb698fd0fb333e9dfb4ce932b76c99441f..9e46c2a44bb326f5cbf99d17457c1abd2e40e0b4 100644 --- a/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp +++ b/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp @@ -148,11 +148,11 @@ grammar::EpsilonFreeCFG < > LeftRecursionRemover::remove(const grammar::CNF < > auto LeftRecursionRemoverCNF = LeftRecursionRemover::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::CNF < > >(LeftRecursionRemover::remove); -grammar::GNF LeftRecursionRemover::remove(const grammar::GNF& origGrammar) { +grammar::GNF < > LeftRecursionRemover::remove(const grammar::GNF < > & origGrammar) { return origGrammar; } -auto LeftRecursionRemoverGNF = LeftRecursionRemover::RegistratorWrapper<grammar::GNF, grammar::GNF>(LeftRecursionRemover::remove); +auto LeftRecursionRemoverGNF = LeftRecursionRemover::RegistratorWrapper<grammar::GNF < >, grammar::GNF < > >(LeftRecursionRemover::remove); grammar::RightRG LeftRecursionRemover::remove(const grammar::RightRG& origGrammar) { return origGrammar; diff --git a/alib2algo/src/grammar/simplify/LeftRecursionRemover.h b/alib2algo/src/grammar/simplify/LeftRecursionRemover.h index 085891a4cc9d368a6224572c0818f18000518e29..43513684e3a5dcd14033abb9bf2573b4a1adbe99 100644 --- a/alib2algo/src/grammar/simplify/LeftRecursionRemover.h +++ b/alib2algo/src/grammar/simplify/LeftRecursionRemover.h @@ -34,7 +34,7 @@ public: static grammar::EpsilonFreeCFG < > remove( const grammar::EpsilonFreeCFG < > & grammar ); static grammar::EpsilonFreeCFG < > remove( const grammar::CNF < > & grammar ); - static grammar::GNF remove( const grammar::GNF & 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::RightRG remove( const grammar::LeftRG & grammar ); diff --git a/alib2algo/src/grammar/simplify/SimpleRulesRemover.cpp b/alib2algo/src/grammar/simplify/SimpleRulesRemover.cpp index 69b5de52d98685af10822e01c117fcd73852d11d..16b9aa51e4d4c94fca71f8222464014953f182dc 100644 --- a/alib2algo/src/grammar/simplify/SimpleRulesRemover.cpp +++ b/alib2algo/src/grammar/simplify/SimpleRulesRemover.cpp @@ -85,11 +85,11 @@ grammar::CNF < > SimpleRulesRemover::remove(const grammar::CNF < > & origGrammar auto SimpleRulesRemoverCNF = SimpleRulesRemover::RegistratorWrapper<grammar::CNF < >, grammar::CNF < > >(SimpleRulesRemover::remove); -grammar::GNF SimpleRulesRemover::remove(const grammar::GNF& origGrammar) { +grammar::GNF < > SimpleRulesRemover::remove(const grammar::GNF < > & origGrammar) { return origGrammar; } -auto SimpleRulesRemoverGNF = SimpleRulesRemover::RegistratorWrapper<grammar::GNF, grammar::GNF>(SimpleRulesRemover::remove); +auto SimpleRulesRemoverGNF = SimpleRulesRemover::RegistratorWrapper<grammar::GNF < >, grammar::GNF < > >(SimpleRulesRemover::remove); grammar::LG SimpleRulesRemover::remove(const grammar::LG& origGrammar) { return removeNonEpsilonFree(origGrammar); diff --git a/alib2algo/src/grammar/simplify/SimpleRulesRemover.h b/alib2algo/src/grammar/simplify/SimpleRulesRemover.h index ef1d51fdf8636d296868ad8e047d2d90fd456ae6..3b81011a10f421f5f91b9ddef977fc4a0f380846 100644 --- a/alib2algo/src/grammar/simplify/SimpleRulesRemover.h +++ b/alib2algo/src/grammar/simplify/SimpleRulesRemover.h @@ -34,7 +34,7 @@ public: static grammar::CFG < > remove( const grammar::CFG < > & grammar ); static grammar::EpsilonFreeCFG < > remove( const grammar::EpsilonFreeCFG < > & grammar ); - static grammar::GNF remove( const grammar::GNF & grammar ); + static grammar::GNF < > remove( const grammar::GNF < > & grammar ); static grammar::CNF < > remove( const grammar::CNF < > & grammar ); static grammar::LG remove( const grammar::LG & grammar ); static grammar::LeftLG remove( const grammar::LeftLG & grammar ); diff --git a/alib2algo/src/grammar/simplify/ToCNF.cpp b/alib2algo/src/grammar/simplify/ToCNF.cpp index bbdd2d2e612baf746823e3c4c8f0c5a9812dca48..f49c05ae388dab1bb9ae4934bfd323ae34391ba8 100644 --- a/alib2algo/src/grammar/simplify/ToCNF.cpp +++ b/alib2algo/src/grammar/simplify/ToCNF.cpp @@ -135,11 +135,11 @@ grammar::CNF < > ToCNF::convert(const grammar::CNF < > & origGrammar) { auto ToCNFCNF = ToCNF::RegistratorWrapper<grammar::CNF < >, grammar::CNF < > >(ToCNF::convert); -grammar::CNF < > ToCNF::convert(const grammar::GNF& origGrammar) { +grammar::CNF < > ToCNF::convert(const grammar::GNF < > & origGrammar) { return convertInternal(origGrammar); } -auto ToCNFGNF = ToCNF::RegistratorWrapper<grammar::CNF < >, grammar::GNF>(ToCNF::convert); +auto ToCNFGNF = ToCNF::RegistratorWrapper<grammar::CNF < >, grammar::GNF < > >(ToCNF::convert); grammar::CNF < > ToCNF::convert(const grammar::LG& origGrammar) { return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar))); diff --git a/alib2algo/src/grammar/simplify/ToCNF.h b/alib2algo/src/grammar/simplify/ToCNF.h index 0c1d79965be745d610c81257bff860b25d20647d..a933ce220344b2ad0fa5b1cf23fa574f37da7303 100644 --- a/alib2algo/src/grammar/simplify/ToCNF.h +++ b/alib2algo/src/grammar/simplify/ToCNF.h @@ -34,7 +34,7 @@ public: static grammar::CNF < > convert( const grammar::CFG < > & grammar ); static grammar::CNF < > convert( const grammar::EpsilonFreeCFG < > & grammar ); - static grammar::CNF < > convert( const grammar::GNF & grammar ); + static grammar::CNF < > convert( const grammar::GNF < > & grammar ); static grammar::CNF < > convert( const grammar::CNF < > & grammar ); static grammar::CNF < > convert( const grammar::LG & grammar ); static grammar::CNF < > convert( const grammar::LeftLG & grammar ); diff --git a/alib2algo/src/grammar/simplify/ToGNF.cpp b/alib2algo/src/grammar/simplify/ToGNF.cpp index e6fac9c785e509a66ca44326320f30c565f60914..9d0138067c3f323ccc6fbf2ac553303b72a71092 100644 --- a/alib2algo/src/grammar/simplify/ToGNF.cpp +++ b/alib2algo/src/grammar/simplify/ToGNF.cpp @@ -46,7 +46,7 @@ grammar::EpsilonFreeCFG < > assignNonterminals(const grammar::EpsilonFreeCFG < > return res; } -grammar::GNF convertInternal( const grammar::EpsilonFreeCFG < > & origGrammar ) { +grammar::GNF < > convertInternal( const grammar::EpsilonFreeCFG < > & origGrammar ) { grammar::EpsilonFreeCFG < > step(origGrammar); while(true) { grammar::EpsilonFreeCFG < > nextStep = assignNonterminals(step); @@ -55,7 +55,7 @@ grammar::GNF convertInternal( const grammar::EpsilonFreeCFG < > & origGrammar ) step = std::move(nextStep); } - grammar::GNF res(step.getInitialSymbol()); + grammar::GNF < > res(step.getInitialSymbol()); res.setTerminalAlphabet(step.getTerminalAlphabet()); res.setNonterminalAlphabet(step.getNonterminalAlphabet()); res.setGeneratesEpsilon(step.getGeneratesEpsilon()); @@ -87,41 +87,41 @@ grammar::GNF convertInternal( const grammar::EpsilonFreeCFG < > & origGrammar ) return res; } -grammar::GNF ToGNF::convert(const grammar::CFG < > & origGrammar) { +grammar::GNF < > ToGNF::convert(const grammar::CFG < > & origGrammar) { return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::LeftRecursionRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar)))); } -auto ToGNFCFG = ToGNF::RegistratorWrapper<grammar::GNF, grammar::CFG < > >(ToGNF::convert); +auto ToGNFCFG = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::CFG < > >(ToGNF::convert); -grammar::GNF ToGNF::convert(const grammar::EpsilonFreeCFG < > & origGrammar) { +grammar::GNF < > ToGNF::convert(const grammar::EpsilonFreeCFG < > & origGrammar) { return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::LeftRecursionRemover::remove(origGrammar))); } -auto ToGNFEpsilonFreeCFG = ToGNF::RegistratorWrapper<grammar::GNF, grammar::EpsilonFreeCFG < > >(ToGNF::convert); +auto ToGNFEpsilonFreeCFG = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::EpsilonFreeCFG < > >(ToGNF::convert); -grammar::GNF ToGNF::convert(const grammar::CNF < > & origGrammar) { +grammar::GNF < > ToGNF::convert(const grammar::CNF < > & origGrammar) { return convertInternal(grammar::simplify::LeftRecursionRemover::remove(origGrammar)); } -auto ToGNFCNF = ToGNF::RegistratorWrapper<grammar::GNF, grammar::CNF < > >(ToGNF::convert); +auto ToGNFCNF = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::CNF < > >(ToGNF::convert); -grammar::GNF ToGNF::convert(const grammar::GNF& origGrammar) { +grammar::GNF < > ToGNF::convert(const grammar::GNF < > & origGrammar) { return origGrammar; } -auto ToGNFGNF = ToGNF::RegistratorWrapper<grammar::GNF, grammar::GNF>(ToGNF::convert); +auto ToGNFGNF = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::GNF < > >(ToGNF::convert); -grammar::GNF ToGNF::convert(const grammar::LG& origGrammar) { +grammar::GNF < > ToGNF::convert(const grammar::LG& origGrammar) { return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::LeftRecursionRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar)))); } -auto ToGNFLG = ToGNF::RegistratorWrapper<grammar::GNF, grammar::LG>(ToGNF::convert); +auto ToGNFLG = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::LG>(ToGNF::convert); -grammar::GNF ToGNF::convert(const grammar::LeftLG& origGrammar) { +grammar::GNF < > ToGNF::convert(const grammar::LeftLG& origGrammar) { return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::LeftRecursionRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar)))); } -auto ToGNFLeftLG = ToGNF::RegistratorWrapper<grammar::GNF, grammar::LeftLG>(ToGNF::convert); +auto ToGNFLeftLG = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::LeftLG>(ToGNF::convert); grammar::RightRG ToGNF::convert(const grammar::LeftRG& origGrammar) { return convert::ToGrammarRightRG::convert(origGrammar); @@ -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 022ed759e6fff62129323c5aaed13fa1c3f3391d..42ad2e2bb343be3d0e5686d8b09b1f3a30f74f87 100644 --- a/alib2algo/src/grammar/simplify/ToGNF.h +++ b/alib2algo/src/grammar/simplify/ToGNF.h @@ -32,14 +32,14 @@ class ToGNF : public std::SingleDispatch<ToGNF, grammar::Grammar, const grammar: public: static grammar::Grammar convert( const grammar::Grammar & grammar ); - static grammar::GNF convert( const grammar::CFG < > & grammar ); - static grammar::GNF convert( const grammar::EpsilonFreeCFG < > & grammar ); - static grammar::GNF convert( const grammar::CNF < > & grammar ); - static grammar::GNF convert( const grammar::GNF & grammar ); - static grammar::GNF convert( const grammar::LG & grammar ); - static grammar::GNF convert( const grammar::LeftLG & grammar ); + static grammar::GNF < > convert( const grammar::CFG < > & grammar ); + static grammar::GNF < > convert( const grammar::EpsilonFreeCFG < > & grammar ); + static grammar::GNF < > convert( const grammar::CNF < > & grammar ); + static grammar::GNF < > convert( const grammar::GNF < > & grammar ); + 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 2285218ef7930fbc1a0acdfff1c0527ec59cd008..a1cf13b050fa8f079bcfbf033ae4800cafb5f9e2 100644 --- a/alib2algo/src/grammar/simplify/Trim.cpp +++ b/alib2algo/src/grammar/simplify/Trim.cpp @@ -31,7 +31,7 @@ T Trim::trim( const T & grammar ) { auto TrimCFG = Trim::RegistratorWrapper<grammar::CFG < >, grammar::CFG < > >(Trim::trim); auto TrimEpsilonFreeCFG = Trim::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::EpsilonFreeCFG < > >(Trim::trim); -auto TrimGNF = Trim::RegistratorWrapper<grammar::GNF, grammar::GNF>(Trim::trim); +auto TrimGNF = Trim::RegistratorWrapper<grammar::GNF < >, grammar::GNF < > >(Trim::trim); auto TrimCNF = Trim::RegistratorWrapper<grammar::CNF < >, grammar::CNF < > >(Trim::trim); auto TrimLG = Trim::RegistratorWrapper<grammar::LG, grammar::LG>(Trim::trim); auto TrimLeftLG = Trim::RegistratorWrapper<grammar::LeftLG, grammar::LeftLG>(Trim::trim); diff --git a/alib2algo/src/grammar/simplify/UnproductiveSymbolsRemover.cpp b/alib2algo/src/grammar/simplify/UnproductiveSymbolsRemover.cpp index a4b996120d46f06363beabd47bc37026d818c223..3aa2efdaca9d59d48bbd59722638b11e74fe75d2 100644 --- a/alib2algo/src/grammar/simplify/UnproductiveSymbolsRemover.cpp +++ b/alib2algo/src/grammar/simplify/UnproductiveSymbolsRemover.cpp @@ -62,7 +62,7 @@ T UnproductiveSymbolsRemover::remove( const T & grammar ) { auto UnproductiveSymbolsRemoverCFG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::CFG < >, grammar::CFG < > >(UnproductiveSymbolsRemover::remove); auto UnproductiveSymbolsRemoverEpsilonFreeCFG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::EpsilonFreeCFG < > >(UnproductiveSymbolsRemover::remove); -auto UnproductiveSymbolsRemoverGNF = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::GNF, grammar::GNF>(UnproductiveSymbolsRemover::remove); +auto UnproductiveSymbolsRemoverGNF = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::GNF < >, grammar::GNF < > >(UnproductiveSymbolsRemover::remove); auto UnproductiveSymbolsRemoverCNF = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::CNF < >, grammar::CNF < > >(UnproductiveSymbolsRemover::remove); auto UnproductiveSymbolsRemoverLG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::LG, grammar::LG>(UnproductiveSymbolsRemover::remove); auto UnproductiveSymbolsRemoverLeftLG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::LeftLG, grammar::LeftLG>(UnproductiveSymbolsRemover::remove); diff --git a/alib2algo/src/grammar/simplify/UnreachableSymbolsRemover.cpp b/alib2algo/src/grammar/simplify/UnreachableSymbolsRemover.cpp index 2ee301db4935144b479055ae53dd25f76d9effc7..d9492f74b071932ad234f5f708f5b84a14a0e7a6 100644 --- a/alib2algo/src/grammar/simplify/UnreachableSymbolsRemover.cpp +++ b/alib2algo/src/grammar/simplify/UnreachableSymbolsRemover.cpp @@ -61,7 +61,7 @@ T UnreachableSymbolsRemover::remove( const T & grammar) { auto UnreachableSymbolsRemoverCFG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::CFG < >, grammar::CFG < > >(UnreachableSymbolsRemover::remove); auto UnreachableSymbolsRemoverEpsilonFreeCFG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::EpsilonFreeCFG < > >(UnreachableSymbolsRemover::remove); -auto UnreachableSymbolsRemoverGNF = UnreachableSymbolsRemover::RegistratorWrapper<grammar::GNF, grammar::GNF>(UnreachableSymbolsRemover::remove); +auto UnreachableSymbolsRemoverGNF = UnreachableSymbolsRemover::RegistratorWrapper<grammar::GNF < >, grammar::GNF < > >(UnreachableSymbolsRemover::remove); auto UnreachableSymbolsRemoverCNF = UnreachableSymbolsRemover::RegistratorWrapper<grammar::CNF < >, grammar::CNF < > >(UnreachableSymbolsRemover::remove); auto UnreachableSymbolsRemoverLG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::LG, grammar::LG>(UnreachableSymbolsRemover::remove); auto UnreachableSymbolsRemoverLeftLG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::LeftLG, grammar::LeftLG>(UnreachableSymbolsRemover::remove); diff --git a/alib2algo/test-src/grammar/simplify/GrammarToGNFTest.cpp b/alib2algo/test-src/grammar/simplify/GrammarToGNFTest.cpp index 83c59ee9cef83011cc6b6b32983ca2a3bf6fa73b..50ef9c98ba105a436783d536947677f9f6076099 100644 --- a/alib2algo/test-src/grammar/simplify/GrammarToGNFTest.cpp +++ b/alib2algo/test-src/grammar/simplify/GrammarToGNFTest.cpp @@ -36,9 +36,9 @@ void GrammarToGNFTest::testRemoveToGNFRules1() { alphabet::Symbol aprimed = createUniqueSymbol(a, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet()); alphabet::Symbol bprimed = createUniqueSymbol(b, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet()); - grammar::GNF grammar2 = grammar::simplify::ToGNF::convert(grammar1); + grammar::GNF < > grammar2 = grammar::simplify::ToGNF::convert(grammar1); - grammar::GNF grammar3(S); + grammar::GNF < > grammar3(S); grammar3.setNonterminalAlphabet({S, A, B, C, D, aprimed, bprimed}); grammar3.setTerminalAlphabet({a, b}); grammar3.addRule(aprimed, std::make_pair(a, std::vector<alphabet::Symbol>{})); @@ -76,9 +76,9 @@ void GrammarToGNFTest::testRemoveToGNFRules2() { std::cout << alib::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar1)) << std::endl; - grammar::GNF grammar2 = grammar::simplify::ToGNF::convert(grammar1); + grammar::GNF < > grammar2 = grammar::simplify::ToGNF::convert(grammar1); - grammar::GNF grammar3(S); + grammar::GNF < > grammar3(S); grammar3.setNonterminalAlphabet({S, A, Aprimed, B, C, D, aprimed, bprimed, cprimed}); grammar3.setTerminalAlphabet({a, b, c}); grammar3.addRule(S, std::make_pair(c, std::vector<alphabet::Symbol>{Aprimed})); @@ -124,9 +124,9 @@ void GrammarToGNFTest::testRemoveToGNFRules3() { std::cout << alib::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar1)) << std::endl; - grammar::GNF grammar2 = grammar::simplify::ToGNF::convert(grammar1); + grammar::GNF < > grammar2 = grammar::simplify::ToGNF::convert(grammar1); - grammar::GNF grammar3(S); + grammar::GNF < > grammar3(S); grammar3.setNonterminalAlphabet({S, A, B, Bprimed, C, aprimed, bprimed, cprimed}); grammar3.setTerminalAlphabet({a, b, c}); grammar3.addRule(S, std::make_pair(c, std::vector<alphabet::Symbol>{})); @@ -168,7 +168,7 @@ void GrammarToGNFTest::testRemoveToGNFRules4() { grammar1.addRule(C, {C, C}); grammar1.addRule(C, {a}); - grammar::GNF grammar2 = grammar::simplify::ToGNF::convert(grammar1); + grammar::GNF < > grammar2 = grammar::simplify::ToGNF::convert(grammar1); CPPUNIT_ASSERT(grammar::generate::GenerateUpToLength::generate(grammar1, 7) == grammar::generate::GenerateUpToLength::generate(grammar2, 7)); } diff --git a/alib2data/src/grammar/ContextFree/GNF.cpp b/alib2data/src/grammar/ContextFree/GNF.cpp index eb57ebe390e61073f6992c0892220706e117bcc5..c4ce05df60bdc199e4d41fc80fb36fe48275cd3b 100644 --- a/alib2data/src/grammar/ContextFree/GNF.cpp +++ b/alib2data/src/grammar/ContextFree/GNF.cpp @@ -6,193 +6,13 @@ */ #include "GNF.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 { - -GNF::GNF ( alphabet::Symbol initialSymbol ) : GNF ( std::set < alphabet::Symbol > { initialSymbol }, std::set < alphabet::Symbol > ( ), initialSymbol ) { -} - -GNF::GNF ( std::set < alphabet::Symbol > nonterminalAlphabet, std::set < alphabet::Symbol > terminalAlphabet, alphabet::Symbol initialSymbol ) : std::Components < GNF, alphabet::Symbol, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > ( std::make_tuple ( std::move ( terminalAlphabet ), std::move ( nonterminalAlphabet ) ), std::make_tuple ( std::move ( initialSymbol ) ) ), generatesEpsilon ( false ) { -} - -GrammarBase * GNF::clone ( ) const { - return new GNF ( * this ); -} - -GrammarBase * GNF::plunder ( ) && { - return new GNF ( std::move ( * this ) ); -} - -bool GNF::addRule ( alphabet::Symbol leftHandSide, std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > rightHandSide ) { - if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) ) - throw GrammarException ( "Rule must rewrite nonterminal symbol" ); - - if ( !getTerminalAlphabet ( ).count ( rightHandSide.first ) ) - throw GrammarException ( "Rule must rewrite to terminal symbol" ); - - for ( const alphabet::Symbol & rhsNTs : rightHandSide.second ) - if ( !getNonterminalAlphabet ( ).count ( rhsNTs ) ) - throw GrammarException ( "Symbol \"" + std::to_string ( rhsNTs ) + "\" is not a nonterminal symbol" ); - - return rules[std::move ( leftHandSide )].insert ( std::move ( rightHandSide ) ).second; -} - -const std::map < alphabet::Symbol, std::set < std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > > > & GNF::getRules ( ) const { - return rules; -} - -bool GNF::removeRule ( const alphabet::Symbol & leftHandSide, const std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > & rightHandSide ) { - return rules[leftHandSide].erase ( rightHandSide ); -} - -bool GNF::addRawRule ( alphabet::Symbol leftHandSide, std::vector < alphabet::Symbol > rightHandSide ) { - if ( rightHandSide.size ( ) == 0 ) { - if ( leftHandSide != getInitialSymbol ( ) ) throw GrammarException ( "Illegal left hand side of epsilon rule" ); - - bool res = getGeneratesEpsilon ( ); - setGeneratesEpsilon ( true ); - return !res; - } else { - alphabet::Symbol first = std::move ( rightHandSide[0] ); - std::vector < alphabet::Symbol > rest ( std::make_move_iterator ( rightHandSide.begin ( ) ) + 1, std::make_move_iterator ( rightHandSide.end ( ) ) ); - return addRule ( std::move ( leftHandSide ), std::make_pair ( std::move ( first ), std::move ( rest ) ) ); - } -} - -std::map < alphabet::Symbol, std::set < std::vector < alphabet::Symbol > > > GNF::getRawRules ( ) const { - std::map < alphabet::Symbol, std::set < std::vector < alphabet::Symbol > > > res; - - for ( const auto & rule : getRules ( ) ) - for ( const auto & rhs : rule.second ) { - std::vector < alphabet::Symbol > tmp { rhs.first }; - tmp.insert ( tmp.end ( ), rhs.second.begin ( ), rhs.second.end ( ) ); - res[rule.first].insert ( std::move ( tmp ) ); - } - - if ( getGeneratesEpsilon ( ) ) - res[getInitialSymbol ( )].insert ( std::vector < alphabet::Symbol > { } ); - - return res; -} - -bool GNF::removeRawRule ( const alphabet::Symbol & leftHandSide, const std::vector < alphabet::Symbol > & rightHandSide ) { - if ( rightHandSide.size ( ) == 0 ) { - if ( leftHandSide != getInitialSymbol ( ) ) throw GrammarException ( "Illegal left hand side of epsilon rule" ); - - bool res = getGeneratesEpsilon ( ); - setGeneratesEpsilon ( false ); - return res; - } else { - alphabet::Symbol first = rightHandSide[0]; - std::vector < alphabet::Symbol > rest ( rightHandSide.begin ( ) + 1, rightHandSide.end ( ) ); - return removeRule ( leftHandSide, std::make_pair ( first, rest ) ); - } -} - -void GNF::setGeneratesEpsilon ( bool genEps ) { - generatesEpsilon = genEps; -} - -bool GNF::getGeneratesEpsilon ( ) const { - return generatesEpsilon; -} - -int GNF::compare ( const GNF & 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 GNF::operator >>( std::ostream & out ) const { - out << "(GNF " - << "nonterminalAlphabet = " << getNonterminalAlphabet ( ) - << "terminalAlphabet = " << getTerminalAlphabet ( ) - << "initialSymbol = " << getInitialSymbol ( ) - << "rules = " << rules << ")"; -} - -GNF::operator std::string ( ) const { - std::stringstream ss; - ss << * this; - return ss.str ( ); -} - -GNF GNF::parse ( std::deque < sax::Token >::iterator & input ) { - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, GNF::getXmlTagName() ); - - std::set < alphabet::Symbol > nonterminalAlphabet = GrammarFromXMLParser::parseNonterminalAlphabet ( input ); - std::set < alphabet::Symbol > terminalAlphabet = GrammarFromXMLParser::parseTerminalAlphabet ( input ); - alphabet::Symbol initialSymbol = GrammarFromXMLParser::parseInitialSymbol ( input ); - - GNF grammar ( std::move ( initialSymbol ) ); - - grammar.setNonterminalAlphabet ( std::move ( nonterminalAlphabet ) ); - grammar.setTerminalAlphabet ( std::move ( terminalAlphabet ) ); - - GrammarFromXMLParser::parseRules ( input, grammar ); - - bool generatesEpsilon = GrammarFromXMLParser::parseGeneratesEpsilon ( input ); - grammar.setGeneratesEpsilon ( generatesEpsilon ); - - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, GNF::getXmlTagName() ); - return grammar; -} - -void GNF::parseRule ( std::deque < sax::Token >::iterator & input, GNF & grammar ) { - alphabet::Symbol lhs = GrammarFromXMLParser::parseRuleSingleSymbolLHS ( input ); - std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > rhs = GrammarFromXMLParser::parseRuleGNFRHS ( input ); - - grammar.addRule ( std::move ( lhs ), std::move ( rhs ) ); -} - -void GNF::compose ( std::deque < sax::Token > & out ) const { - out.emplace_back ( GNF::getXmlTagName(), sax::Token::TokenType::START_ELEMENT ); - - GrammarToXMLComposer::composeNonterminalAlphabet ( out, this->getNonterminalAlphabet ( ) ); - GrammarToXMLComposer::composeTerminalAlphabet ( out, this->getTerminalAlphabet ( ) ); - GrammarToXMLComposer::composeInitialSymbol ( out, this->getInitialSymbol ( ) ); - composeRules ( out ); - GrammarToXMLComposer::composeGeneratesEpsilon ( out, this->getGeneratesEpsilon ( ) ); - - out.emplace_back ( GNF::getXmlTagName(), sax::Token::TokenType::END_ELEMENT ); -} - -void GNF::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::composeRuleGNFRHS ( 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 GNFParserRegister = xmlApi < grammar::Grammar >::ParserRegister < grammar::GNF > ( ); -auto GNFParserRegister2 = xmlApi < alib::Object >::ParserRegister < grammar::GNF > ( ); +auto GNFParserRegister = xmlApi < grammar::Grammar >::ParserRegister < grammar::GNF < > > ( ); +auto GNFParserRegister2 = xmlApi < alib::Object >::ParserRegister < grammar::GNF < > > ( ); } /* namespace alib */ diff --git a/alib2data/src/grammar/ContextFree/GNF.h b/alib2data/src/grammar/ContextFree/GNF.h index 9b93b2f3453268026660c9d0c5f11859d4777f1a..11f3ef8905d24b76b0bc7ef18913f8744c4171ca 100644 --- a/alib2data/src/grammar/ContextFree/GNF.h +++ b/alib2data/src/grammar/ContextFree/GNF.h @@ -8,12 +8,19 @@ #ifndef GNF_H_ #define GNF_H_ -#include "../GrammarException.h" -#include "../GrammarBase.h" #include <map> #include <vector> +#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 { @@ -24,61 +31,62 @@ class TerminalAlphabet; class NonterminalAlphabet; class InitialSymbol; -class GNF : public GrammarBase, public std::Components < GNF, alphabet::Symbol, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > { - std::map < alphabet::Symbol, std::set < std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > > > rules; +template < class SymbolType > +class GNF : public GrammarBase, public std::Components < GNF < SymbolType >, SymbolType, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > { + std::map < SymbolType, std::set < std::pair < SymbolType, std::vector < SymbolType > > > > rules; bool generatesEpsilon; public: - explicit GNF ( alphabet::Symbol initialSymbol ); + explicit GNF ( SymbolType initialSymbol ); - explicit GNF ( std::set < alphabet::Symbol > nonTerminalSymbols, std::set < alphabet::Symbol > terminalSymbols, alphabet::Symbol initialSymbol ); + explicit GNF ( std::set < SymbolType > nonTerminalSymbols, std::set < SymbolType > terminalSymbols, SymbolType initialSymbol ); virtual GrammarBase * clone ( ) const; virtual GrammarBase * plunder ( ) &&; - bool addRule ( alphabet::Symbol leftHandSide, std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > rightHandSide ); + bool addRule ( SymbolType leftHandSide, std::pair < SymbolType, std::vector < SymbolType > > rightHandSide ); - const std::map < alphabet::Symbol, std::set < std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > > > & getRules ( ) const; + const std::map < SymbolType, std::set < std::pair < SymbolType, std::vector < SymbolType > > > > & getRules ( ) const; - bool removeRule ( const alphabet::Symbol & leftHandSide, const std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > & rightHandSide ); + bool removeRule ( const SymbolType & leftHandSide, const std::pair < SymbolType, std::vector < 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 ) ); } void setGeneratesEpsilon ( bool genEps ); @@ -110,69 +118,256 @@ public: void composeRules ( std::deque < sax::Token > & out ) const; }; +template < class SymbolType > +GNF < SymbolType >::GNF ( SymbolType initialSymbol ) : GNF ( std::set < SymbolType > { initialSymbol }, std::set < SymbolType > ( ), initialSymbol ) { +} + +template < class SymbolType > +GNF < SymbolType >::GNF ( std::set < SymbolType > nonterminalAlphabet, std::set < SymbolType > terminalAlphabet, SymbolType initialSymbol ) : std::Components < GNF, SymbolType, std::tuple < TerminalAlphabet, NonterminalAlphabet >, std::tuple < InitialSymbol > > ( std::make_tuple ( std::move ( terminalAlphabet ), std::move ( nonterminalAlphabet ) ), std::make_tuple ( std::move ( initialSymbol ) ) ), generatesEpsilon ( false ) { +} + +template < class SymbolType > +GrammarBase * GNF < SymbolType >::clone ( ) const { + return new GNF ( * this ); +} + +template < class SymbolType > +GrammarBase * GNF < SymbolType >::plunder ( ) && { + return new GNF ( std::move ( * this ) ); +} + +template < class SymbolType > +bool GNF < SymbolType >::addRule ( SymbolType leftHandSide, std::pair < SymbolType, std::vector < SymbolType > > rightHandSide ) { + if ( !getNonterminalAlphabet ( ).count ( leftHandSide ) ) + throw GrammarException ( "Rule must rewrite nonterminal symbol" ); + + if ( !getTerminalAlphabet ( ).count ( rightHandSide.first ) ) + throw GrammarException ( "Rule must rewrite to terminal symbol" ); + + for ( const SymbolType & rhsNTs : rightHandSide.second ) + if ( !getNonterminalAlphabet ( ).count ( rhsNTs ) ) + throw GrammarException ( "Symbol \"" + std::to_string ( rhsNTs ) + "\" is not a nonterminal symbol" ); + + return rules[std::move ( leftHandSide )].insert ( std::move ( rightHandSide ) ).second; +} + +template < class SymbolType > +const std::map < SymbolType, std::set < std::pair < SymbolType, std::vector < SymbolType > > > > & GNF < SymbolType >::getRules ( ) const { + return rules; +} + +template < class SymbolType > +bool GNF < SymbolType >::removeRule ( const SymbolType & leftHandSide, const std::pair < SymbolType, std::vector < SymbolType > > & rightHandSide ) { + return rules[leftHandSide].erase ( rightHandSide ); +} + +template < class SymbolType > +bool GNF < SymbolType >::addRawRule ( SymbolType leftHandSide, std::vector < SymbolType > rightHandSide ) { + if ( rightHandSide.size ( ) == 0 ) { + if ( leftHandSide != getInitialSymbol ( ) ) throw GrammarException ( "Illegal left hand side of epsilon rule" ); + + bool res = getGeneratesEpsilon ( ); + setGeneratesEpsilon ( true ); + return !res; + } else { + SymbolType first = std::move ( rightHandSide[0] ); + std::vector < SymbolType > rest ( std::make_move_iterator ( rightHandSide.begin ( ) ) + 1, std::make_move_iterator ( rightHandSide.end ( ) ) ); + return addRule ( std::move ( leftHandSide ), std::make_pair ( std::move ( first ), std::move ( rest ) ) ); + } +} + +template < class SymbolType > +std::map < SymbolType, std::set < std::vector < SymbolType > > > GNF < SymbolType >::getRawRules ( ) const { + std::map < SymbolType, std::set < std::vector < SymbolType > > > res; + + for ( const auto & rule : getRules ( ) ) + for ( const auto & rhs : rule.second ) { + std::vector < SymbolType > tmp { rhs.first }; + tmp.insert ( tmp.end ( ), rhs.second.begin ( ), rhs.second.end ( ) ); + res[rule.first].insert ( std::move ( tmp ) ); + } + + if ( getGeneratesEpsilon ( ) ) + res[getInitialSymbol ( )].insert ( std::vector < SymbolType > { } ); + + return res; +} + +template < class SymbolType > +bool GNF < SymbolType >::removeRawRule ( const SymbolType & leftHandSide, const std::vector < SymbolType > & rightHandSide ) { + if ( rightHandSide.size ( ) == 0 ) { + if ( leftHandSide != getInitialSymbol ( ) ) throw GrammarException ( "Illegal left hand side of epsilon rule" ); + + bool res = getGeneratesEpsilon ( ); + setGeneratesEpsilon ( false ); + return res; + } else { + SymbolType first = rightHandSide[0]; + std::vector < SymbolType > rest ( rightHandSide.begin ( ) + 1, rightHandSide.end ( ) ); + return removeRule ( leftHandSide, std::make_pair ( first, rest ) ); + } +} + +template < class SymbolType > +void GNF < SymbolType >::setGeneratesEpsilon ( bool genEps ) { + generatesEpsilon = genEps; +} + +template < class SymbolType > +bool GNF < SymbolType >::getGeneratesEpsilon ( ) const { + return generatesEpsilon; +} + +template < class SymbolType > +int GNF < SymbolType >::compare ( const GNF & 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 GNF < SymbolType >::operator >>( std::ostream & out ) const { + out << "(GNF " + << "nonterminalAlphabet = " << getNonterminalAlphabet ( ) + << "terminalAlphabet = " << getTerminalAlphabet ( ) + << "initialSymbol = " << getInitialSymbol ( ) + << "rules = " << rules << ")"; +} + +template < class SymbolType > +GNF < SymbolType >::operator std::string ( ) const { + std::stringstream ss; + ss << * this; + return ss.str ( ); +} + +template < class SymbolType > +GNF < SymbolType > GNF < SymbolType >::parse ( std::deque < sax::Token >::iterator & input ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, GNF::getXmlTagName() ); + + std::set < SymbolType > nonterminalAlphabet = GrammarFromXMLParser::parseNonterminalAlphabet ( input ); + std::set < SymbolType > terminalAlphabet = GrammarFromXMLParser::parseTerminalAlphabet ( input ); + SymbolType initialSymbol = GrammarFromXMLParser::parseInitialSymbol ( input ); + + GNF < SymbolType > grammar ( std::move ( initialSymbol ) ); + + grammar.setNonterminalAlphabet ( std::move ( nonterminalAlphabet ) ); + grammar.setTerminalAlphabet ( std::move ( terminalAlphabet ) ); + + GrammarFromXMLParser::parseRules ( input, grammar ); + + bool generatesEpsilon = GrammarFromXMLParser::parseGeneratesEpsilon ( input ); + grammar.setGeneratesEpsilon ( generatesEpsilon ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, GNF::getXmlTagName() ); + return grammar; +} + +template < class SymbolType > +void GNF < SymbolType >::parseRule ( std::deque < sax::Token >::iterator & input, GNF & grammar ) { + SymbolType lhs = GrammarFromXMLParser::parseRuleSingleSymbolLHS ( input ); + std::pair < SymbolType, std::vector < SymbolType > > rhs = GrammarFromXMLParser::parseRuleGNFRHS ( input ); + + grammar.addRule ( std::move ( lhs ), std::move ( rhs ) ); +} + +template < class SymbolType > +void GNF < SymbolType >::compose ( std::deque < sax::Token > & out ) const { + out.emplace_back ( GNF::getXmlTagName(), sax::Token::TokenType::START_ELEMENT ); + + GrammarToXMLComposer::composeNonterminalAlphabet ( out, this->getNonterminalAlphabet ( ) ); + GrammarToXMLComposer::composeTerminalAlphabet ( out, this->getTerminalAlphabet ( ) ); + GrammarToXMLComposer::composeInitialSymbol ( out, this->getInitialSymbol ( ) ); + composeRules ( out ); + GrammarToXMLComposer::composeGeneratesEpsilon ( out, this->getGeneratesEpsilon ( ) ); + + out.emplace_back ( GNF::getXmlTagName(), sax::Token::TokenType::END_ELEMENT ); +} + +template < class SymbolType > +void GNF < 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::composeRuleGNFRHS ( 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::GNF, alphabet::Symbol, grammar::TerminalAlphabet > { +template < class SymbolType > +class ComponentConstraint< grammar::GNF < SymbolType >, SymbolType, grammar::TerminalAlphabet > { public: - static bool used ( const grammar::GNF & grammar, const alphabet::Symbol & symbol ) { - for ( const std::pair < const alphabet::Symbol, std::set < std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > > > & rule : grammar.getRules ( ) ) - for ( const std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > & rhs : rule.second ) + static bool used ( const grammar::GNF < SymbolType > & grammar, const SymbolType & symbol ) { + for ( const std::pair < const SymbolType, std::set < std::pair < SymbolType, std::vector < SymbolType > > > > & rule : grammar.getRules ( ) ) + for ( const std::pair < SymbolType, std::vector < SymbolType > > & rhs : rule.second ) if ( rhs.first == symbol ) return true; return false; } - static bool available ( const grammar::GNF &, const alphabet::Symbol & ) { + static bool available ( const grammar::GNF < SymbolType > &, const SymbolType & ) { return true; } - static void valid ( const grammar::GNF & grammar, const alphabet::Symbol & symbol ) { - if ( grammar.accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ) ) + static void valid ( const grammar::GNF < 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::GNF, alphabet::Symbol, grammar::NonterminalAlphabet > { +template < class SymbolType > +class ComponentConstraint< grammar::GNF < SymbolType >, SymbolType, grammar::NonterminalAlphabet > { public: - static bool used ( const grammar::GNF & grammar, const alphabet::Symbol & symbol ) { - for ( const std::pair < const alphabet::Symbol, std::set < std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > > > & rule : grammar.getRules ( ) ) { + static bool used ( const grammar::GNF < SymbolType > & grammar, const SymbolType & symbol ) { + for ( const std::pair < const SymbolType, std::set < std::pair < SymbolType, std::vector < SymbolType > > > > & rule : grammar.getRules ( ) ) { if ( rule.first == symbol ) return true; - for ( const std::pair < alphabet::Symbol, std::vector < alphabet::Symbol > > & rhs : rule.second ) + for ( const std::pair < SymbolType, std::vector < SymbolType > > & rhs : rule.second ) if ( std::find ( rhs.second.begin ( ), rhs.second.end ( ), symbol ) != rhs.second.end ( ) ) return true; } - if ( grammar.accessElement < grammar::InitialSymbol > ( ).get ( ) == symbol ) + if ( grammar.template accessElement < grammar::InitialSymbol > ( ).get ( ) == symbol ) return true; return false; } - static bool available ( const grammar::GNF &, const alphabet::Symbol & ) { + static bool available ( const grammar::GNF < SymbolType > &, const SymbolType & ) { return true; } - static void valid ( const grammar::GNF & grammar, const alphabet::Symbol & symbol ) { - if ( grammar.accessComponent < grammar::TerminalAlphabet > ( ).get ( ).count ( symbol ) ) + static void valid ( const grammar::GNF < 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::GNF, alphabet::Symbol, grammar::InitialSymbol > { +template < class SymbolType > +class ElementConstraint< grammar::GNF < SymbolType >, SymbolType, grammar::InitialSymbol > { public: - static bool available ( const grammar::GNF & grammar, const alphabet::Symbol & symbol ) { - return grammar.accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ); + static bool available ( const grammar::GNF < SymbolType > & grammar, const SymbolType & symbol ) { + return grammar.template accessComponent < grammar::NonterminalAlphabet > ( ).get ( ).count ( symbol ); } - static void valid ( const grammar::GNF &, const alphabet::Symbol & ) { + static void valid ( const grammar::GNF < SymbolType > &, const SymbolType & ) { } }; diff --git a/alib2data/src/grammar/GrammarFeatures.h b/alib2data/src/grammar/GrammarFeatures.h index 74736f17ab40be53929abb6e2a46a65e01b44555..2a248b92911c4177d0f96d755667da2798355c9b 100644 --- a/alib2data/src/grammar/GrammarFeatures.h +++ b/alib2data/src/grammar/GrammarFeatures.h @@ -42,6 +42,7 @@ template<class SymbolType = typename alphabet::Symbol > class EpsilonFreeCFG; template<class SymbolType = typename alphabet::Symbol > class CNF; +template<class SymbolType = typename alphabet::Symbol > class GNF; class CSG; class NonContractingGrammar; diff --git a/alib2data/test-src/grammar/GrammarTest.cpp b/alib2data/test-src/grammar/GrammarTest.cpp index 26123aa32fa92691beeaf3c26f16c8d4195f55ce..1be85f15ff61a2141d93da42eab43fe5bb588271 100644 --- a/alib2data/test-src/grammar/GrammarTest.cpp +++ b/alib2data/test-src/grammar/GrammarTest.cpp @@ -263,7 +263,7 @@ void GrammarTest::testContextFreeParser() { } } { - grammar::GNF grammar(alphabet::symbolFrom(1)); + grammar::GNF < > grammar(alphabet::symbolFrom(1)); grammar.addNonterminalSymbol(alphabet::symbolFrom(1)); grammar.addNonterminalSymbol(alphabet::symbolFrom(2)); @@ -285,7 +285,7 @@ void GrammarTest::testContextFreeParser() { std::deque<sax::Token> tokens2; sax::SaxParseInterface::parseMemory(tmp, tokens2); - grammar::GNF grammar2 = alib::XmlDataFactory::fromTokens<grammar::GNF>(std::move(tokens2)); + grammar::GNF < > grammar2 = alib::XmlDataFactory::fromTokens<grammar::GNF < > >(std::move(tokens2)); CPPUNIT_ASSERT( grammar == grammar2 ); } diff --git a/alib2str/src/grammar/GrammarFromStringParser.cpp b/alib2str/src/grammar/GrammarFromStringParser.cpp index 8046cf1a632b0b1c683f7308f0cd0149f76660d2..5943290aad7bc76525ae65f77deebe2939b3b503 100644 --- a/alib2str/src/grammar/GrammarFromStringParser.cpp +++ b/alib2str/src/grammar/GrammarFromStringParser.cpp @@ -512,13 +512,13 @@ EpsilonFreeCFG < > GrammarFromStringParser::parseEpsilonFreeCFG(std::istream& in return parseCFLikeGrammar<EpsilonFreeCFG < > >(input); } -GNF GrammarFromStringParser::parseGNF(std::istream& input) const { +GNF < > GrammarFromStringParser::parseGNF(std::istream& input) const { GrammarFromStringLexer::Token token = m_GrammarLexer.next(input); if(token.type != GrammarFromStringLexer::TokenType::GNF) { throw exception::CommonException("Unrecognised GNF token."); } - return parseCFLikeGrammar<GNF>(input); + return parseCFLikeGrammar<GNF < > >(input); } CNF < > GrammarFromStringParser::parseCNF(std::istream& input) const { diff --git a/alib2str/src/grammar/GrammarFromStringParser.h b/alib2str/src/grammar/GrammarFromStringParser.h index ea6c2fcdc1a5a8bfdffedcf9c5d8cd503799654a..6c825dbf7050559fd0a8c5930264648793ecf220 100644 --- a/alib2str/src/grammar/GrammarFromStringParser.h +++ b/alib2str/src/grammar/GrammarFromStringParser.h @@ -53,7 +53,7 @@ private: LG parseLG(std::istream& input) const; CFG < > parseCFG(std::istream& input) const; EpsilonFreeCFG < > parseEpsilonFreeCFG(std::istream& input) const; - GNF parseGNF(std::istream& input) const; + GNF < > parseGNF(std::istream& input) const; CNF < > parseCNF(std::istream& input) const; NonContractingGrammar parseNonContractingGrammar(std::istream& input) const; diff --git a/alib2str/src/grammar/GrammarToStringComposer.cpp b/alib2str/src/grammar/GrammarToStringComposer.cpp index 6ecc53abf2847fe0935ec6040db95395e8a082c4..9b3ef3cf5c1f8d5c16c5c3150554fe922e15ad13 100644 --- a/alib2str/src/grammar/GrammarToStringComposer.cpp +++ b/alib2str/src/grammar/GrammarToStringComposer.cpp @@ -240,12 +240,12 @@ void GrammarToStringComposer::compose(std::ostream& output, const CNF < > & gram GrammarToStringComposer::RegistratorWrapper<void, CNF < > > GrammarToStringComposerCNF = GrammarToStringComposer::RegistratorWrapper<void, CNF < > >(GrammarToStringComposer::compose); -void GrammarToStringComposer::compose(std::ostream& output, const GNF& grammar) { +void GrammarToStringComposer::compose(std::ostream& output, const GNF < > & grammar) { output << "GNF"; composeCFLikeGrammar(output, grammar); } -GrammarToStringComposer::RegistratorWrapper<void, GNF> GrammarToStringComposerGNF = GrammarToStringComposer::RegistratorWrapper<void, GNF>(GrammarToStringComposer::compose); +GrammarToStringComposer::RegistratorWrapper<void, GNF < > > GrammarToStringComposerGNF = GrammarToStringComposer::RegistratorWrapper<void, GNF < > >(GrammarToStringComposer::compose); void GrammarToStringComposer::compose(std::ostream& output, const CSG& grammar) { output << "CSG"; diff --git a/alib2str/src/grammar/GrammarToStringComposer.h b/alib2str/src/grammar/GrammarToStringComposer.h index 0b8ce7eec4448b0f3436f82ea65791239a292f6f..b79246b0978b154adf5dc5b8558988f9924a4157 100644 --- a/alib2str/src/grammar/GrammarToStringComposer.h +++ b/alib2str/src/grammar/GrammarToStringComposer.h @@ -32,7 +32,7 @@ public: static void compose(std::ostream& output, const CFG < > & grammar); static void compose(std::ostream& output, const EpsilonFreeCFG < > & grammar); static void compose(std::ostream& output, const CNF < > & grammar); - static void compose(std::ostream& output, const GNF& grammar); + static void compose(std::ostream& output, const GNF < > & grammar); static void compose(std::ostream& output, const CSG& grammar); static void compose(std::ostream& output, const NonContractingGrammar& grammar); static void compose(std::ostream& output, const ContextPreservingUnrestrictedGrammar& grammar);