diff --git a/alib2data/src/tree/TreeFromXMLParser.cpp b/alib2data/src/tree/TreeFromXMLParser.cpp index 620c218400bacd799302ba2dfe86e2f420994bbc..2681c537ff93f36800eb44cde081e8802131ddda 100644 --- a/alib2data/src/tree/TreeFromXMLParser.cpp +++ b/alib2data/src/tree/TreeFromXMLParser.cpp @@ -40,7 +40,7 @@ Tree TreeFromXMLParser::parseTree(std::deque<sax::Token>& input, const std::set< RankedPattern TreeFromXMLParser::parseRankedPattern(std::deque<sax::Token>& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::TREE_RANKED_PATTERN); - alphabet::RankedSymbol subtreeWildcard = parseSubtreeVariable<alphabet::RankedSymbol>(input); + alphabet::RankedSymbol subtreeWildcard = parseSubtreeWildcard<alphabet::RankedSymbol>(input); std::set<alphabet::RankedSymbol> rankedAlphabet = parseRankedAlphabet(input); RankedNode * root = parseRankedNode(input); RankedPattern tree(subtreeWildcard, std::move(rankedAlphabet), std::move(*root)); @@ -74,7 +74,7 @@ PrefixRankedNotation TreeFromXMLParser::parsePrefixRankedNotation(std::deque<sax UnrankedPattern TreeFromXMLParser::parseUnrankedPattern(std::deque<sax::Token>& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::TREE_UNRANKED_PATTERN); - alphabet::Symbol subtreeWildcard = parseSubtreeVariable<alphabet::Symbol>(input); + alphabet::Symbol subtreeWildcard = parseSubtreeWildcard<alphabet::Symbol>(input); std::set<alphabet::Symbol> alphabet = parseAlphabet(input); UnrankedNode * root = parseUnrankedNode(input); UnrankedPattern tree(subtreeWildcard, std::move(alphabet), std::move(*root)); @@ -95,7 +95,7 @@ UnrankedTree TreeFromXMLParser::parseUnrankedTree(std::deque<sax::Token>& input) } template<class T> -T TreeFromXMLParser::parseSubtreeVariable(std::deque<sax::Token>& input) const { +T TreeFromXMLParser::parseSubtreeWildcard(std::deque<sax::Token>& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, "subtreeWildcard"); T subtreeWildcard(alib::xmlApi<T>::parse(input)); popToken(input, sax::Token::TokenType::END_ELEMENT, "subtreeWildcard"); diff --git a/alib2data/src/tree/TreeFromXMLParser.h b/alib2data/src/tree/TreeFromXMLParser.h index c354e3362683ead4d4ed3ccbaebb2e170700e179..20bd15ef3d3e438433833b0286edc4b39c1c6240 100644 --- a/alib2data/src/tree/TreeFromXMLParser.h +++ b/alib2data/src/tree/TreeFromXMLParser.h @@ -43,7 +43,7 @@ private: std::set<alphabet::Symbol> parseAlphabet(std::deque<sax::Token> &input) const; template<class T> - T parseSubtreeVariable(std::deque<sax::Token> &input) const; + T parseSubtreeWildcard(std::deque<sax::Token> &input) const; Tree parseTree(std::deque<sax::Token>& input) const; Tree parseTree(std::deque<sax::Token>& input, const std::set<FEATURES>& features) const; diff --git a/alib2data/src/tree/TreeToXMLComposer.cpp b/alib2data/src/tree/TreeToXMLComposer.cpp index 9aa599b44d0d1271cc99191f484bf51ac3cc367e..4a7c7fd9124f1492661d5ad73416953a20f238a4 100644 --- a/alib2data/src/tree/TreeToXMLComposer.cpp +++ b/alib2data/src/tree/TreeToXMLComposer.cpp @@ -12,7 +12,7 @@ namespace tree { template<class T> -void TreeToXMLComposer::composeSubtreeWildCard(std::deque<sax::Token>& out, const T& symbol) const { +void TreeToXMLComposer::composeSubtreeWildcard(std::deque<sax::Token>& out, const T& symbol) const { out.emplace_back(sax::Token("subtreeWildcard", sax::Token::TokenType::START_ELEMENT)); alib::xmlApi<T>::compose(out, symbol); out.emplace_back(sax::Token("subtreeWildcard", sax::Token::TokenType::END_ELEMENT)); @@ -54,7 +54,7 @@ void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const RankedTree& t void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const RankedPattern& tree) const { out.emplace_back(sax::Token(alib::Names::TREE_RANKED_PATTERN, sax::Token::TokenType::START_ELEMENT)); - composeSubtreeWildCard(out, tree.getSubtreeWildCard()); + composeSubtreeWildcard(out, tree.getSubtreeWildcard()); composeAlphabet(out, tree.getAlphabet()); composeNode(out, tree.getRoot()); @@ -86,7 +86,7 @@ void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const UnrankedTree& void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const UnrankedPattern& tree) const { out.emplace_back(sax::Token(alib::Names::TREE_UNRANKED_PATTERN, sax::Token::TokenType::START_ELEMENT)); - composeSubtreeWildCard(out, tree.getSubtreeWildCard()); + composeSubtreeWildcard(out, tree.getSubtreeWildcard()); composeAlphabet(out, tree.getAlphabet()); composeNode(out, tree.getRoot()); diff --git a/alib2data/src/tree/TreeToXMLComposer.h b/alib2data/src/tree/TreeToXMLComposer.h index deeed832b01f14139ea97f4e2ea3870d4ab079ad..0fda3ae38ba09fa35b660aebd8296fc07047b9b9 100644 --- a/alib2data/src/tree/TreeToXMLComposer.h +++ b/alib2data/src/tree/TreeToXMLComposer.h @@ -38,7 +38,7 @@ private: void composeAlphabet(std::deque<sax::Token>& out, const std::set<alphabet::RankedSymbol>& symbols) const; void composeAlphabet(std::deque<sax::Token>& out, const std::set<alphabet::Symbol>& symbols) const; template<class T> - void composeSubtreeWildCard(std::deque<sax::Token>& out, const T& symbol) const; + void composeSubtreeWildcard(std::deque<sax::Token>& out, const T& symbol) const; /** * Prints XML representation of Tree to the output stream. diff --git a/alib2data/src/tree/common/RankedPatternAlphabet.cpp b/alib2data/src/tree/common/RankedPatternAlphabet.cpp index 30720fb67ffdbb1bbbeb19f634013c9573cd6098..eb567a40a7631f385edfb6ec4b644543a09a661d 100644 --- a/alib2data/src/tree/common/RankedPatternAlphabet.cpp +++ b/alib2data/src/tree/common/RankedPatternAlphabet.cpp @@ -13,18 +13,23 @@ namespace tree { RankedPatternAlphabet::RankedPatternAlphabet(alphabet::RankedSymbol subtreeWildcard) : subtreeWildcard(subtreeWildcard) { + if(subtreeWildcard.getRank().getData() != 0) + throw TreeException("Subtree wildcard symbol " + (std::string) subtreeWildcard + " has nonzero rank"); alphabet.insert(std::move(subtreeWildcard)); } -void RankedPatternAlphabet::setSubtreeWildCard(alphabet::RankedSymbol symbol) { +void RankedPatternAlphabet::setSubtreeWildcard(alphabet::RankedSymbol symbol) { if (!alphabet.count(symbol)) throw TreeException("Subtree wildcard symbol \"" + (std::string) symbol + "\" is not in the alphabet."); + if(subtreeWildcard.getRank().getData() != 0) + throw TreeException("Subtree wildcard symbol " + (std::string) symbol + " has nonzero rank"); + subtreeWildcard = std::move(symbol); } -const alphabet::RankedSymbol& RankedPatternAlphabet::getSubtreeWildCard() const { +const alphabet::RankedSymbol& RankedPatternAlphabet::getSubtreeWildcard() const { return subtreeWildcard; } diff --git a/alib2data/src/tree/common/RankedPatternAlphabet.h b/alib2data/src/tree/common/RankedPatternAlphabet.h index c174b33674a4f210723f48d5e18a8a97af890996..7be04046027a380e35ca74b4db449a6afe2d76d5 100644 --- a/alib2data/src/tree/common/RankedPatternAlphabet.h +++ b/alib2data/src/tree/common/RankedPatternAlphabet.h @@ -26,12 +26,12 @@ public: * Sets the subtree variable = symbol representing subtree substitution place in the pattern * @param symbol Symbol to set */ - void setSubtreeWildCard(alphabet::RankedSymbol symbol); + void setSubtreeWildcard(alphabet::RankedSymbol symbol); /** * @return symbol representing subtree variable */ - const alphabet::RankedSymbol& getSubtreeWildCard() const; + const alphabet::RankedSymbol& getSubtreeWildcard() const; }; diff --git a/alib2data/src/tree/common/UnrankedPatternAlphabet.cpp b/alib2data/src/tree/common/UnrankedPatternAlphabet.cpp index 31bd6c3fdcb42fb7dd9bd2fccd290729e74b21d4..1dcf1978651df9ca1fc6ef5147f29eb17cbc3e74 100644 --- a/alib2data/src/tree/common/UnrankedPatternAlphabet.cpp +++ b/alib2data/src/tree/common/UnrankedPatternAlphabet.cpp @@ -16,7 +16,7 @@ UnrankedPatternAlphabet::UnrankedPatternAlphabet(alphabet::Symbol subtreeWildcar alphabet.insert(std::move(subtreeWildcard)); } -void UnrankedPatternAlphabet::setSubtreeWildCard(alphabet::Symbol symbol) { +void UnrankedPatternAlphabet::setSubtreeWildcard(alphabet::Symbol symbol) { if (!alphabet.count(symbol)) throw TreeException("Subtree wildcard symbol \"" + (std::string) symbol + "\" is not in the alphabet."); @@ -24,7 +24,7 @@ void UnrankedPatternAlphabet::setSubtreeWildCard(alphabet::Symbol symbol) { } -const alphabet::Symbol& UnrankedPatternAlphabet::getSubtreeWildCard() const { +const alphabet::Symbol& UnrankedPatternAlphabet::getSubtreeWildcard() const { return subtreeWildcard; } diff --git a/alib2data/src/tree/common/UnrankedPatternAlphabet.h b/alib2data/src/tree/common/UnrankedPatternAlphabet.h index 68438522647b53f1a2203f854b1ed4709881787f..22f41db833711f76fed4a106c0b8f17c9bdf149f 100644 --- a/alib2data/src/tree/common/UnrankedPatternAlphabet.h +++ b/alib2data/src/tree/common/UnrankedPatternAlphabet.h @@ -26,12 +26,12 @@ public: * Sets the subtree variable = symbol representing subtree substitution place in the pattern * @param symbol Symbol to set */ - void setSubtreeWildCard(alphabet::Symbol symbol); + void setSubtreeWildcard(alphabet::Symbol symbol); /** * @return symbol representing subtree variable */ - const alphabet::Symbol& getSubtreeWildCard() const; + const alphabet::Symbol& getSubtreeWildcard() const; }; diff --git a/alib2data/src/tree/ranked/RankedNode.cpp b/alib2data/src/tree/ranked/RankedNode.cpp index 514da467ba4ba74d080100a56ce1fa04d599fdf5..c97145e1cb0486f82b5ea45ef5e2a9aeb0085797 100644 --- a/alib2data/src/tree/ranked/RankedNode.cpp +++ b/alib2data/src/tree/ranked/RankedNode.cpp @@ -165,6 +165,8 @@ bool RankedNode::attachTree(const RankedAlphabet * tree ) { void RankedNode::computeMinimalAlphabet( std::set<alphabet::RankedSymbol>& alphabet ) const { alphabet.insert(this->symbol); + for(const auto& child : this->children) + child->computeMinimalAlphabet(alphabet); } const alphabet::RankedSymbol& RankedNode::getSymbol() const { diff --git a/alib2data/src/tree/ranked/RankedNode.h b/alib2data/src/tree/ranked/RankedNode.h index 36f8e1620255d737401781f9d0df10e12af4119e..826cf941fc286e2ea259ed6a83533976bc747c66 100644 --- a/alib2data/src/tree/ranked/RankedNode.h +++ b/alib2data/src/tree/ranked/RankedNode.h @@ -109,6 +109,7 @@ public: void nicePrint(std::ostream &, const std::string & = "", const bool = true) const; friend class UnrankedTree; + friend class UnrankedPattern; friend class RankedTree; friend class RankedPattern; }; diff --git a/alib2data/src/tree/ranked/RankedPattern.cpp b/alib2data/src/tree/ranked/RankedPattern.cpp index 9e46a137556b58f874b4c0efc8e15a001c4a4538..7bf22b03d00122d124db26d97f6292f0d163f639 100644 --- a/alib2data/src/tree/ranked/RankedPattern.cpp +++ b/alib2data/src/tree/ranked/RankedPattern.cpp @@ -12,17 +12,17 @@ #include <algorithm> #include <sstream> -//#include "../unranked/UnrankedPattern.h" +#include "../unranked/UnrankedPattern.h" namespace tree { -/*RankedPattern::RankedPattern(const UnrankedPattern& other) { +RankedPattern::RankedPattern(const UnrankedPattern& other) : RankedPatternAlphabet(alphabet::RankedSymbol(other.getSubtreeWildcard(), 0)) { this->pattern = NULL; RankedNode* element = other.getRoot().cloneAsRanked(); element->computeMinimalAlphabet(alphabet); setTree(std::move(*element)); delete element; -}*/ +} RankedPattern::RankedPattern(alphabet::RankedSymbol subtreeWildcard, std::set<alphabet::RankedSymbol> alphabet, RankedNode pattern) : RankedPatternAlphabet(std::move(subtreeWildcard)) { setAlphabet(std::move(alphabet)); diff --git a/alib2data/src/tree/ranked/RankedPattern.h b/alib2data/src/tree/ranked/RankedPattern.h index d807b8e4b066c86c9593b13b3df3ba926c48b32d..6e87eeea4d4f0f7d461cb0898da12812b0e40452 100644 --- a/alib2data/src/tree/ranked/RankedPattern.h +++ b/alib2data/src/tree/ranked/RankedPattern.h @@ -39,7 +39,7 @@ public: */ virtual TreeBase* plunder() &&; -// explicit RankedPattern(const UnrankedPattern& other); + explicit RankedPattern(const UnrankedPattern& other); explicit RankedPattern(alphabet::RankedSymbol subtreeWildcard, std::set<alphabet::RankedSymbol> alphabet, RankedNode pattern); explicit RankedPattern(alphabet::RankedSymbol subtreeWildcard, RankedNode pattern); diff --git a/alib2data/src/tree/unranked/UnrankedNode.h b/alib2data/src/tree/unranked/UnrankedNode.h index 3acbdc64beece34218297446f13d421b7844dfba..a4cabbaaf7b32bd01734d0604ebfd2f50d8d3c18 100644 --- a/alib2data/src/tree/unranked/UnrankedNode.h +++ b/alib2data/src/tree/unranked/UnrankedNode.h @@ -113,6 +113,7 @@ public: friend class UnrankedTree; friend class UnrankedPattern; friend class RankedTree; + friend class RankedPattern; }; } /* namespace tree */ diff --git a/alib2data/src/tree/unranked/UnrankedPattern.cpp b/alib2data/src/tree/unranked/UnrankedPattern.cpp index 9ab01b3f6ea6fa158913497b979fc54d71886ce7..3dc27ddc66c81d1a77a22f2c76a881fa32f0ddb7 100644 --- a/alib2data/src/tree/unranked/UnrankedPattern.cpp +++ b/alib2data/src/tree/unranked/UnrankedPattern.cpp @@ -12,17 +12,17 @@ #include <algorithm> #include <sstream> -//#include "../unranked/RankedPattern.h" +#include "../ranked/RankedPattern.h" namespace tree { -/*UnrankedPattern::UnrankedPattern(const RankedPattern& other) { +UnrankedPattern::UnrankedPattern(const RankedPattern& other) : UnrankedPatternAlphabet(other.getSubtreeWildcard().getSymbol()) { this->pattern = NULL; - UnrankedNode* element = other.getRoot().cloneAsRanked(); + UnrankedNode* element = other.getRoot().cloneAsUnranked(); element->computeMinimalAlphabet(alphabet); setTree(std::move(*element)); delete element; -}*/ +} UnrankedPattern::UnrankedPattern(alphabet::Symbol subtreeWildcard, std::set<alphabet::Symbol> alphabet, UnrankedNode pattern) : UnrankedPatternAlphabet(std::move(subtreeWildcard)) { setAlphabet(std::move(alphabet)); @@ -96,7 +96,7 @@ bool UnrankedPattern::removeSymbolFromAlphabet(const alphabet::Symbol & symbol) throw exception::AlibException("Input symbol \"" + (std::string) symbol + "\" is used."); if(this->subtreeWildcard == symbol) - throw exception::AlibException("Input symbol \"" + (std::string) symbol + "\" is subtreeWildcard."); + throw exception::AlibException("Input symbol \"" + (std::string) symbol + "\" is subtree wildcard."); return alphabet.erase(symbol); } diff --git a/alib2data/src/tree/unranked/UnrankedPattern.h b/alib2data/src/tree/unranked/UnrankedPattern.h index d671ae52820ff79181408cf2b481147a192bc9fa..28dca3bddf6d11e706b27e3f6ef73af3ddc650e0 100644 --- a/alib2data/src/tree/unranked/UnrankedPattern.h +++ b/alib2data/src/tree/unranked/UnrankedPattern.h @@ -39,7 +39,7 @@ public: */ virtual TreeBase* plunder() &&; -// explicit UnrankedPattern(const RankedPattern& other); + explicit UnrankedPattern(const RankedPattern& other); explicit UnrankedPattern(alphabet::Symbol subtreeWildcard, std::set<alphabet::Symbol> alphabet, UnrankedNode pattern); explicit UnrankedPattern(alphabet::Symbol subtreeWildcard, UnrankedNode pattern); diff --git a/alib2data/test-src/tree/TreeTest.cpp b/alib2data/test-src/tree/TreeTest.cpp index 59c0516f0bf38261044437e33172f6e0be25d5b4..66162edd7baf230ac6836c698a67aa4f0e6f3fb4 100644 --- a/alib2data/test-src/tree/TreeTest.cpp +++ b/alib2data/test-src/tree/TreeTest.cpp @@ -407,6 +407,24 @@ void TreeTest::testRankedPatternParser() { std::cout << std::endl; tree2.getRoot().nicePrint(std::cout); } + + const alphabet::Symbol ua = alphabet::symbolFrom('a'); + const alphabet::Symbol ub = alphabet::symbolFrom('b'); + const alphabet::Symbol uc = alphabet::symbolFrom('c'); + + const alphabet::Symbol uS { alphabet::SubtreeWildcardSymbol {} }; + const std::set<alphabet::Symbol> ualphabet {ua, ub, uc, uS}; + + tree::UnrankedNode * unode3 = new tree::UnrankedNode(uc, {}); + tree::UnrankedNode * unode4 = new tree::UnrankedNode(uS, {}); + tree::UnrankedNode * unode2 = new tree::UnrankedNode(ub, {unode3}); + tree::UnrankedNode unode1(ua, {unode2, unode4}); + + tree::UnrankedPattern tree2(uS, ualphabet, std::move(unode1)); + + tree::UnrankedPattern tree3 (tree ); + + CPPUNIT_ASSERT(tree3 == tree2); } void TreeTest::testUnrankedPatternParser() { @@ -439,5 +457,23 @@ void TreeTest::testUnrankedPatternParser() { std::cout << std::endl; tree2.getRoot().nicePrint(std::cout); } + + const alphabet::RankedSymbol ra ('a', 2); + const alphabet::RankedSymbol rb ('b', 1); + const alphabet::RankedSymbol rc ('c', 0); + + const alphabet::RankedSymbol rS { alphabet::Symbol { alphabet::SubtreeWildcardSymbol {} }, 0}; + const std::set<alphabet::RankedSymbol> ralphabet {ra, rb, rc, rS}; + + tree::RankedNode * rnode3 = new tree::RankedNode(rc, {}); + tree::RankedNode * rnode4 = new tree::RankedNode(rS, {}); + tree::RankedNode * rnode2 = new tree::RankedNode(rb, {rnode3}); + tree::RankedNode rnode1(ra, {rnode2, rnode4}); + + tree::RankedPattern tree2(rS, ralphabet, std::move(rnode1)); + + tree::RankedPattern tree3 (tree); + + CPPUNIT_ASSERT(tree3 == tree2); }