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