From 642063f4d29d8836d15a39f7564bd349ca9500a0 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Thu, 28 May 2015 16:23:52 +0200 Subject: [PATCH] +variables bar in prefixRankedBar notat.of pattern --- .../src/alphabet/SymbolFromXMLParser.cpp | 4 +-- alib2data/src/tree/TreeFromXMLParser.cpp | 10 ++++++- alib2data/src/tree/TreeFromXMLParser.h | 1 + alib2data/src/tree/TreeToXMLComposer.cpp | 7 +++++ alib2data/src/tree/TreeToXMLComposer.h | 1 + .../tree/ranked/PrefixRankedBarPattern.cpp | 29 ++++++++++++++----- .../src/tree/ranked/PrefixRankedBarPattern.h | 9 ++++-- alib2data/test-src/tree/PatternTest.cpp | 5 +++- alib2data/test-src/tree/TreeTest.cpp | 2 ++ 9 files changed, 53 insertions(+), 15 deletions(-) diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.cpp b/alib2data/src/alphabet/SymbolFromXMLParser.cpp index 22ed3b9dde..d29283081c 100644 --- a/alib2data/src/alphabet/SymbolFromXMLParser.cpp +++ b/alib2data/src/alphabet/SymbolFromXMLParser.cpp @@ -114,8 +114,8 @@ BarSymbol SymbolFromXMLParser::parseBarSymbol(std::deque<sax::Token>& input) con } VariablesBarSymbol SymbolFromXMLParser::parseVariablesBarSymbol(std::deque<sax::Token>& input) const { - popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::ALPHABET_BAR_SYMBOL); - popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::ALPHABET_BAR_SYMBOL); + popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::ALPHABET_VARIABLES_BAR_SYMBOL); + popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::ALPHABET_VARIABLES_BAR_SYMBOL); return VariablesBarSymbol(); } diff --git a/alib2data/src/tree/TreeFromXMLParser.cpp b/alib2data/src/tree/TreeFromXMLParser.cpp index 304fcf03ec..10a058806b 100644 --- a/alib2data/src/tree/TreeFromXMLParser.cpp +++ b/alib2data/src/tree/TreeFromXMLParser.cpp @@ -105,10 +105,11 @@ PrefixRankedBarPattern TreeFromXMLParser::parsePrefixRankedBarPattern(std::deque popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::TREE_PREFIX_RANKED_BAR_PATTERN); alphabet::Symbol bar = parseBar(input); + alphabet::Symbol variablesBar = parseVariablesBar(input); alphabet::RankedSymbol subtreeWildcard = parseSubtreeWildcard<alphabet::RankedSymbol>(input); std::set<alphabet::RankedSymbol> rankedAlphabet = parseRankedAlphabet(input); std::vector<alphabet::RankedSymbol> data = parseContentData(input); - PrefixRankedBarPattern tree(std::move(bar), std::move(subtreeWildcard), std::move(rankedAlphabet), std::move(data)); + PrefixRankedBarPattern tree(std::move(bar), std::move(variablesBar), std::move(subtreeWildcard), std::move(rankedAlphabet), std::move(data)); popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::TREE_PREFIX_RANKED_BAR_PATTERN); return tree; @@ -144,6 +145,13 @@ alphabet::Symbol TreeFromXMLParser::parseBar(std::deque<sax::Token>& input) cons return bar; } +alphabet::Symbol TreeFromXMLParser::parseVariablesBar(std::deque<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, "variablesBar"); + alphabet::Symbol variablesBar(alib::xmlApi<alphabet::Symbol>::parse(input)); + popToken(input, sax::Token::TokenType::END_ELEMENT, "variablesBar"); + return variablesBar; +} + template<class T> T TreeFromXMLParser::parseSubtreeWildcard(std::deque<sax::Token>& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, "subtreeWildcard"); diff --git a/alib2data/src/tree/TreeFromXMLParser.h b/alib2data/src/tree/TreeFromXMLParser.h index 46059085a6..66eebf3780 100644 --- a/alib2data/src/tree/TreeFromXMLParser.h +++ b/alib2data/src/tree/TreeFromXMLParser.h @@ -43,6 +43,7 @@ private: std::set<alphabet::Symbol> parseAlphabet(std::deque<sax::Token> &input) const; alphabet::Symbol parseBar(std::deque<sax::Token> &input) const; + alphabet::Symbol parseVariablesBar(std::deque<sax::Token> &input) const; template<class T> T parseSubtreeWildcard(std::deque<sax::Token> &input) const; diff --git a/alib2data/src/tree/TreeToXMLComposer.cpp b/alib2data/src/tree/TreeToXMLComposer.cpp index e7529dc56e..5cb8455434 100644 --- a/alib2data/src/tree/TreeToXMLComposer.cpp +++ b/alib2data/src/tree/TreeToXMLComposer.cpp @@ -17,6 +17,12 @@ void TreeToXMLComposer::composeBar(std::deque<sax::Token>& out, const alphabet:: out.emplace_back(sax::Token("bar", sax::Token::TokenType::END_ELEMENT)); } +void TreeToXMLComposer::composeVariablesBar(std::deque<sax::Token>& out, const alphabet::Symbol& symbol) const { + out.emplace_back(sax::Token("variablesBar", sax::Token::TokenType::START_ELEMENT)); + alib::xmlApi<alphabet::Symbol>::compose(out, symbol); + out.emplace_back(sax::Token("variablesBar", sax::Token::TokenType::END_ELEMENT)); +} + template<class T> void TreeToXMLComposer::composeSubtreeWildcard(std::deque<sax::Token>& out, const T& symbol) const { out.emplace_back(sax::Token("subtreeWildcard", sax::Token::TokenType::START_ELEMENT)); @@ -98,6 +104,7 @@ void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const PrefixRankedB out.emplace_back(sax::Token(alib::Names::TREE_PREFIX_RANKED_BAR_PATTERN, sax::Token::TokenType::START_ELEMENT)); composeBar(out, tree.getBarSymbol()); + composeVariablesBar(out, tree.getVariablesBarSymbol()); composeSubtreeWildcard(out, tree.getSubtreeWildcard()); composeAlphabet(out, tree.getAlphabet()); out.emplace_back("content", sax::Token::TokenType::START_ELEMENT); diff --git a/alib2data/src/tree/TreeToXMLComposer.h b/alib2data/src/tree/TreeToXMLComposer.h index 8c2fe0a5c6..b5a978c641 100644 --- a/alib2data/src/tree/TreeToXMLComposer.h +++ b/alib2data/src/tree/TreeToXMLComposer.h @@ -42,6 +42,7 @@ private: void composeAlphabet(std::deque<sax::Token>& out, const std::set<alphabet::Symbol>& symbols) const; void composeBar(std::deque<sax::Token>& out, const alphabet::Symbol& symbol) const; + void composeVariablesBar(std::deque<sax::Token>& out, const alphabet::Symbol& symbol) const; template<class T> void composeSubtreeWildcard(std::deque<sax::Token>& out, const T& symbol) const; diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp index 0bdbfc0a1e..7a799e6926 100644 --- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp +++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp @@ -16,28 +16,33 @@ namespace tree { -PrefixRankedBarPattern::PrefixRankedBarPattern(alphabet::Symbol bar, alphabet::RankedSymbol subtreeWildcard, std::set<alphabet::RankedSymbol> alphabet, std::vector<alphabet::RankedSymbol> data) : RankedPatternAlphabet(std::move(subtreeWildcard)), bar(std::move(bar)) { +PrefixRankedBarPattern::PrefixRankedBarPattern(alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::set<alphabet::RankedSymbol> alphabet, std::vector<alphabet::RankedSymbol> data) : RankedPatternAlphabet(std::move(subtreeWildcard)), bar(std::move(bar)), variablesBar(std::move(variablesBar)) { this->alphabet = std::move(alphabet); setContent(std::move(data)); } -PrefixRankedBarPattern::PrefixRankedBarPattern(alphabet::Symbol bar, alphabet::RankedSymbol subtreeWildcard, std::vector<alphabet::RankedSymbol> data) : RankedPatternAlphabet(std::move(subtreeWildcard)), bar(std::move(bar)) { +PrefixRankedBarPattern::PrefixRankedBarPattern(alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::vector<alphabet::RankedSymbol> data) : RankedPatternAlphabet(std::move(subtreeWildcard)), bar(std::move(bar)), variablesBar(std::move(variablesBar)) { arityChecksum(data); alphabet = std::set<alphabet::RankedSymbol>(data.begin(), data.end()); m_Data = std::move(data); } -PrefixRankedBarPattern::PrefixRankedBarPattern(alphabet::Symbol bar, const RankedPattern& tree) : RankedPatternAlphabet(tree.getSubtreeWildcard()), bar(bar) { +PrefixRankedBarPattern::PrefixRankedBarPattern(alphabet::Symbol bar, alphabet::Symbol variablesBar, const RankedPattern& tree) : RankedPatternAlphabet(tree.getSubtreeWildcard()), bar(std::move(bar)), variablesBar(std::move(variablesBar)) { toPrefixRankedBar(tree.getRoot()); alphabet = std::set<alphabet::RankedSymbol>(m_Data.begin(), m_Data.end()); } void PrefixRankedBarPattern::toPrefixRankedBar(const RankedNode& node) { - m_Data.push_back(node.getSymbol()); - for(const RankedNode* child : node.getChildren()) - toPrefixRankedBar(*child); - m_Data.push_back(alphabet::RankedSymbol(bar, node.getSymbol().getRank())); + if(node.getSymbol() == subtreeWildcard) { + m_Data.push_back(node.getSymbol()); + m_Data.push_back(alphabet::RankedSymbol(variablesBar, node.getSymbol().getRank())); + } else { + m_Data.push_back(node.getSymbol()); + for(const RankedNode* child : node.getChildren()) + toPrefixRankedBar(*child); + m_Data.push_back(alphabet::RankedSymbol(bar, node.getSymbol().getRank())); + } } TreeBase* PrefixRankedBarPattern::clone() const { @@ -79,12 +84,16 @@ const alphabet::Symbol& PrefixRankedBarPattern::getBarSymbol() const { return bar; } +const alphabet::Symbol& PrefixRankedBarPattern::getVariablesBarSymbol() const { + return variablesBar; +} + void PrefixRankedBarPattern::arityChecksum(const std::vector<alphabet::RankedSymbol>& data) { int arityChecksumTerminals = 1; int arityChecksumBars = 1; int arityChecksumTypes = 0; for(const alphabet::RankedSymbol& symbol : data) { - if(symbol.getSymbol() != bar) { + if(symbol.getSymbol() != bar && symbol.getSymbol() != variablesBar) { arityChecksumTerminals += symbol.getRank().getData(); arityChecksumTerminals -= 1; arityChecksumTypes += 1; @@ -96,6 +105,10 @@ void PrefixRankedBarPattern::arityChecksum(const std::vector<alphabet::RankedSym } if(arityChecksumTerminals != 0 || arityChecksumBars != 0 || arityChecksumTypes != 0) throw exception::AlibException("The string does not form a tree"); + + for(unsigned i = 0; i < data.size(); i++) { + if(data[i] == subtreeWildcard && ((i + 1) == data.size() || data[i + 1].getSymbol() != variablesBar)) throw exception::AlibException("Inconsystency of SubtreeWildcard and variablesBar"); + } } bool PrefixRankedBarPattern::isEmpty() const { diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h index ae5376242c..c558848c3d 100644 --- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h +++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h @@ -26,11 +26,12 @@ class PrefixRankedBarPattern : public std::acceptor<PrefixRankedBarPattern, Visi std::vector<alphabet::RankedSymbol> m_Data; alphabet::Symbol bar; + alphabet::Symbol variablesBar; public: - explicit PrefixRankedBarPattern(alphabet::Symbol bar, alphabet::RankedSymbol subtreeWildcard, std::set<alphabet::RankedSymbol> alphabet, std::vector<alphabet::RankedSymbol> data); - explicit PrefixRankedBarPattern(alphabet::Symbol bar, alphabet::RankedSymbol subtreeWildcard, std::vector<alphabet::RankedSymbol> data); - explicit PrefixRankedBarPattern(alphabet::Symbol bar, const RankedPattern& tree); + explicit PrefixRankedBarPattern(alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::set<alphabet::RankedSymbol> alphabet, std::vector<alphabet::RankedSymbol> data); + explicit PrefixRankedBarPattern(alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::vector<alphabet::RankedSymbol> data); + explicit PrefixRankedBarPattern(alphabet::Symbol bar, alphabet::Symbol variablesBar, const RankedPattern& tree); void toPrefixRankedBar(const RankedNode& node); @@ -48,6 +49,8 @@ public: const alphabet::Symbol& getBarSymbol() const; + const alphabet::Symbol& getVariablesBarSymbol() const; + void arityChecksum(const std::vector<alphabet::RankedSymbol>& data); /** * @return true if tree is an empty word (vector length is 0) diff --git a/alib2data/test-src/tree/PatternTest.cpp b/alib2data/test-src/tree/PatternTest.cpp index d56649a30f..d943e0b11d 100644 --- a/alib2data/test-src/tree/PatternTest.cpp +++ b/alib2data/test-src/tree/PatternTest.cpp @@ -159,6 +159,7 @@ void PatternTest::testPrefixRankedPatternParser() { void PatternTest::testPrefixRankedBarPatternParser() { const alphabet::Symbol bar{alphabet::BarSymbol{}}; + const alphabet::Symbol variablesBar{alphabet::VariablesBarSymbol{}}; const alphabet::RankedSymbol a ('a', 2); const alphabet::RankedSymbol b ('b', 1); @@ -173,7 +174,7 @@ void PatternTest::testPrefixRankedBarPatternParser() { tree::RankedNode node1(a, {node2, node4}); tree::RankedPattern pattern(S, alphabet, std::move(node1)); - tree::PrefixRankedBarPattern pattern2(bar, pattern); + tree::PrefixRankedBarPattern pattern2(bar, variablesBar, pattern); CPPUNIT_ASSERT( pattern2 == pattern2 ); { @@ -181,6 +182,8 @@ void PatternTest::testPrefixRankedBarPatternParser() { std::string tmp; sax::SaxComposeInterface::printMemory(tmp, tokens); + std::cout << tmp << std::endl << std::endl; + std::deque<sax::Token> tokens2; sax::SaxParseInterface::parseMemory(tmp, tokens2); tree::PrefixRankedBarPattern pattern3 = alib::XmlDataFactory::fromTokens<tree::PrefixRankedBarPattern>(tokens2); diff --git a/alib2data/test-src/tree/TreeTest.cpp b/alib2data/test-src/tree/TreeTest.cpp index 8f5eff3aa8..f957fe0bf4 100644 --- a/alib2data/test-src/tree/TreeTest.cpp +++ b/alib2data/test-src/tree/TreeTest.cpp @@ -402,6 +402,8 @@ void TreeTest::testPrefixRankedBarParser() { std::string tmp; sax::SaxComposeInterface::printMemory(tmp, tokens); + std::cout << tmp << std::endl << std::endl; + std::deque<sax::Token> tokens2; sax::SaxParseInterface::parseMemory(tmp, tokens2); tree::PrefixRankedBarTree tree3 = alib::XmlDataFactory::fromTokens<tree::PrefixRankedBarTree>(tokens2); -- GitLab