From 994e3f7a01a28fee21ae2d86dc4e86c8346e9164 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Thu, 30 Oct 2014 13:34:01 +0100
Subject: [PATCH] implementation of RankedBarSymbol

---
 alib2data/src/Api.cpp                         | 12 +++++
 alib2data/src/Api.hpp                         |  7 +++
 alib2data/src/alphabet/RankedBarSymbol.cpp    | 53 +++++++++++++++++++
 alib2data/src/alphabet/RankedBarSymbol.h      | 48 +++++++++++++++++
 alib2data/src/alphabet/SymbolBase.h           |  2 +-
 alib2data/src/alphabet/SymbolFeatures.h       |  3 +-
 .../src/alphabet/SymbolFromXMLParser.cpp      | 16 ++++--
 alib2data/src/alphabet/SymbolFromXMLParser.h  |  2 +
 .../src/alphabet/SymbolToStringComposer.cpp   |  9 ++++
 .../src/alphabet/SymbolToStringComposer.h     |  1 +
 .../src/alphabet/SymbolToXMLComposer.cpp      |  8 +++
 alib2data/src/alphabet/SymbolToXMLComposer.h  |  1 +
 alib2data/src/object/ObjectBase.h             |  5 +-
 13 files changed, 160 insertions(+), 7 deletions(-)
 create mode 100644 alib2data/src/alphabet/RankedBarSymbol.cpp
 create mode 100644 alib2data/src/alphabet/RankedBarSymbol.h

diff --git a/alib2data/src/Api.cpp b/alib2data/src/Api.cpp
index 11eacfe239..6d9d2525ac 100644
--- a/alib2data/src/Api.cpp
+++ b/alib2data/src/Api.cpp
@@ -153,6 +153,14 @@ std::list<sax::Token> api<alphabet::BarSymbol>::compose(const alphabet::BarSymbo
 	return ToXMLComposers::symbolComposer.compose(data);
 }
 
+alphabet::RankedBarSymbol api<alphabet::RankedBarSymbol>::parse(std::list<sax::Token>& input) {
+	return FromXMLParsers::symbolParser.parseRankedBarSymbol(input);
+}
+
+std::list<sax::Token> api<alphabet::RankedBarSymbol>::compose(const alphabet::RankedBarSymbol& data) {
+	return ToXMLComposers::symbolComposer.compose(data);
+}
+
 
 automaton::Automaton api<automaton::Automaton>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::automatonParser.parseAutomaton(input);
@@ -635,6 +643,10 @@ void ToXMLComposers::Visit(void* data, const alphabet::BarSymbol& symbol) const
 	*((std::list<sax::Token>*) data) = std::move(api<alphabet::BarSymbol>::compose(symbol));
 }
 
+void ToXMLComposers::Visit(void* data, const alphabet::RankedBarSymbol& symbol) const {
+	*((std::list<sax::Token>*) data) = std::move(api<alphabet::RankedBarSymbol>::compose(symbol));
+}
+
 void ToXMLComposers::Visit(void* data, const alphabet::LabeledSymbol& symbol) const {
 	*((std::list<sax::Token>*) data) = std::move(api<alphabet::LabeledSymbol>::compose(symbol));
 }
diff --git a/alib2data/src/Api.hpp b/alib2data/src/Api.hpp
index 2a0e0acc79..0970cdfe69 100644
--- a/alib2data/src/Api.hpp
+++ b/alib2data/src/Api.hpp
@@ -150,6 +150,12 @@ struct api<alphabet::BarSymbol> {
 	static std::list<sax::Token> compose(const alphabet::BarSymbol& data);
 };
 
+template<>
+struct api<alphabet::RankedBarSymbol> {
+	static alphabet::RankedBarSymbol parse(std::list<sax::Token>& input);
+	static std::list<sax::Token> compose(const alphabet::RankedBarSymbol& data);
+};
+
 template<>
 struct api<automaton::Automaton> {
 	static automaton::Automaton parse(std::list<sax::Token>& input);
@@ -522,6 +528,7 @@ class ToXMLComposers : public VisitableObjectBase::const_visitor_type {
 	void Visit(void*, const alphabet::EndSymbol& symbol) const;
 	void Visit(void*, const alphabet::RankedSymbol& symbol) const;
 	void Visit(void*, const alphabet::BarSymbol& symbol) const;
+	void Visit(void*, const alphabet::RankedBarSymbol& symbol) const;
 
 	void Visit(void*, const automaton::EpsilonNFA& automaton) const;
 	void Visit(void*, const automaton::MultiInitialStateNFA& automaton) const;
diff --git a/alib2data/src/alphabet/RankedBarSymbol.cpp b/alib2data/src/alphabet/RankedBarSymbol.cpp
new file mode 100644
index 0000000000..2ceef4f6be
--- /dev/null
+++ b/alib2data/src/alphabet/RankedBarSymbol.cpp
@@ -0,0 +1,53 @@
+#include "RankedBarSymbol.h"
+
+namespace alphabet {
+
+RankedBarSymbol::RankedBarSymbol(int rank) : rank(primitive::Integer(rank)) {
+
+}
+
+RankedBarSymbol::RankedBarSymbol(const primitive::Integer& rank) : rank(rank) {
+
+}
+
+SymbolBase* RankedBarSymbol::clone() const {
+	return new RankedBarSymbol(*this);
+}
+
+SymbolBase* RankedBarSymbol::plunder() && {
+	return new RankedBarSymbol(std::move(*this));
+}
+
+const primitive::Integer& RankedBarSymbol::getRank() const {
+	return rank;
+}
+
+bool RankedBarSymbol::operator <(const ObjectBase& other) const {
+	return other > *this;
+}
+
+bool RankedBarSymbol::operator ==(const ObjectBase& other) const {
+	return other == *this;
+}
+
+bool RankedBarSymbol::operator >(const ObjectBase& other) const {
+	return other < *this;
+}
+
+bool RankedBarSymbol::operator ==(const RankedBarSymbol&) const {
+	return true;
+}
+
+bool RankedBarSymbol::operator <(const RankedBarSymbol&) const {
+	return false;
+}
+
+void RankedBarSymbol::operator>>(std::ostream& out) const {
+	out << "(RankedBar symbol)";
+}
+
+RankedBarSymbol::operator std::string () const {
+	return "|";
+}
+
+} /* namespace alphabet */
diff --git a/alib2data/src/alphabet/RankedBarSymbol.h b/alib2data/src/alphabet/RankedBarSymbol.h
new file mode 100644
index 0000000000..10a520f8e8
--- /dev/null
+++ b/alib2data/src/alphabet/RankedBarSymbol.h
@@ -0,0 +1,48 @@
+#ifndef RANKED_BAR_SYMBOL_H_
+#define RANKED_BAR_SYMBOL_H_
+
+#include "Symbol.h"
+#include "../primitive/Integer.h"
+
+namespace alphabet {
+
+/**
+ * Represents rankedBar symbol for tree linearization.
+ */
+class RankedBarSymbol : public std::acceptor<RankedBarSymbol, VisitableSymbolBase, std::acceptor<RankedBarSymbol, alib::VisitableObjectBase, SymbolBase> > {
+	primitive::Integer rank;
+public:
+	/**
+	 * Creates a rankedBar symbol.
+	 * @param symbol name of the symbol
+	 */
+	explicit RankedBarSymbol(int rank);
+	explicit RankedBarSymbol(const primitive::Integer& rank);
+
+	virtual SymbolBase* clone() const;
+	virtual SymbolBase* plunder() &&;
+
+	/**
+	 * @return rank of the symbol
+	 */
+	const primitive::Integer& getRank() const;
+
+	virtual bool operator <(const alib::ObjectBase& other) const;
+	virtual bool operator ==(const alib::ObjectBase& other) const;
+	virtual bool operator >(const alib::ObjectBase& other) const;
+
+	virtual bool operator ==(const RankedBarSymbol& other) const;
+	virtual bool operator <(const RankedBarSymbol& other) const;
+
+	virtual void operator>>(std::ostream& out) const;
+
+	virtual operator std::string () const;
+
+	virtual int selfTypeId() const {
+		return typeId<RankedBarSymbol>();
+	}
+};
+
+} /* namespace alphabet */
+
+#endif /* RANKED_BAR_SYMBOL_H_ */
diff --git a/alib2data/src/alphabet/SymbolBase.h b/alib2data/src/alphabet/SymbolBase.h
index de06282c45..9450d51d84 100644
--- a/alib2data/src/alphabet/SymbolBase.h
+++ b/alib2data/src/alphabet/SymbolBase.h
@@ -16,7 +16,7 @@ namespace alphabet {
 class SymbolBase;
 
 typedef std::acceptor_base<SymbolBase,
-			LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, RankedSymbol, BarSymbol
+			LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, RankedSymbol, BarSymbol, RankedBarSymbol
 	> VisitableSymbolBase;
 
 /**
diff --git a/alib2data/src/alphabet/SymbolFeatures.h b/alib2data/src/alphabet/SymbolFeatures.h
index 23d2f2c799..f9a22e1ace 100644
--- a/alib2data/src/alphabet/SymbolFeatures.h
+++ b/alib2data/src/alphabet/SymbolFeatures.h
@@ -16,7 +16,8 @@ enum class FEATURES {
 	BOTTOM,
 	END,
 	RANKED,
-	BAR
+	BAR,
+	RANKED_BAR
 };
 
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.cpp b/alib2data/src/alphabet/SymbolFromXMLParser.cpp
index 408d7b1002..9caeddef5d 100644
--- a/alib2data/src/alphabet/SymbolFromXMLParser.cpp
+++ b/alib2data/src/alphabet/SymbolFromXMLParser.cpp
@@ -15,7 +15,7 @@
 namespace alphabet {
 
 Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input) const {
-	return parseSymbol(input, std::set<FEATURES>({FEATURES::LABELED, FEATURES::BLANK, FEATURES::BOTTOM, FEATURES::END, FEATURES::RANKED, FEATURES::BAR}));
+	return parseSymbol(input, std::set<FEATURES>({FEATURES::LABELED, FEATURES::BLANK, FEATURES::BOTTOM, FEATURES::END, FEATURES::RANKED, FEATURES::BAR, FEATURES::RANKED_BAR}));
 }
 
 Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std::set<FEATURES>& features) const {
@@ -37,13 +37,16 @@ Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std:
 	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "BarSymbol")) {
 		if(!features.count(FEATURES::BAR)) throw exception::AlibException();
 		return Symbol(parseBarSymbol(input));
+	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "RankedBarSymbol")) {
+		if(!features.count(FEATURES::RANKED_BAR)) throw exception::AlibException();
+		return Symbol(parseRankedBarSymbol(input));
 	} else {
-		throw sax::ParserException(sax::Token("LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol", sax::Token::TokenType::START_ELEMENT), input.front());
+		throw sax::ParserException(sax::Token("LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, RankedSymbol, BarSymbol, RankedBarSymbol", sax::Token::TokenType::START_ELEMENT), input.front());
 	}
 }
 
 bool SymbolFromXMLParser::first(std::list<sax::Token>& input) const {
-	if(isToken(input, sax::Token::TokenType::START_ELEMENT, "LabeledSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "BlankSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "BottomOfTheStackSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "EndSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "RankedSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "BarSymbol")) {
+	if(isToken(input, sax::Token::TokenType::START_ELEMENT, "LabeledSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "BlankSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "BottomOfTheStackSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "EndSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "RankedSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "BarSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "RankedBarSymbol")) {
 		return true;
 	} else {
 		return false;
@@ -89,4 +92,11 @@ BarSymbol SymbolFromXMLParser::parseBarSymbol(std::list<sax::Token>& input) cons
 	return BarSymbol();
 }
 
+RankedBarSymbol SymbolFromXMLParser::parseRankedBarSymbol(std::list<sax::Token>& input) const {
+	popToken(input, sax::Token::TokenType::START_ELEMENT, "RankedBarSymbol");
+	primitive::Integer rank = alib::api<primitive::Integer>::parse(input);
+	popToken(input, sax::Token::TokenType::END_ELEMENT, "RankedBarSymbol");
+	return RankedBarSymbol(rank);
+}
+
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.h b/alib2data/src/alphabet/SymbolFromXMLParser.h
index add3c29373..c7ac2648b2 100644
--- a/alib2data/src/alphabet/SymbolFromXMLParser.h
+++ b/alib2data/src/alphabet/SymbolFromXMLParser.h
@@ -22,6 +22,7 @@
 #include "LabeledSymbol.h"
 #include "RankedSymbol.h"
 #include "BarSymbol.h"
+#include "RankedBarSymbol.h"
 
 namespace alib {
 
@@ -45,6 +46,7 @@ class SymbolFromXMLParser : public sax::FromXMLParserHelper {
 	EndSymbol parseEndSymbol(std::list<sax::Token>& input) const;
 	RankedSymbol parseRankedSymbol(std::list<sax::Token>& input) const;
 	BarSymbol parseBarSymbol(std::list<sax::Token>& input) const;
+	RankedBarSymbol parseRankedBarSymbol(std::list<sax::Token>& input) const;
 
 	template<typename T> friend class alib::api;
 public:
diff --git a/alib2data/src/alphabet/SymbolToStringComposer.cpp b/alib2data/src/alphabet/SymbolToStringComposer.cpp
index 651e4a3e53..3f8b61b498 100644
--- a/alib2data/src/alphabet/SymbolToStringComposer.cpp
+++ b/alib2data/src/alphabet/SymbolToStringComposer.cpp
@@ -11,6 +11,7 @@
 #include <algorithm>
 #include "LabeledSymbol.h"
 #include "RankedSymbol.h"
+#include "RankedBarSymbol.h"
 
 namespace alphabet {
 
@@ -54,6 +55,14 @@ void SymbolToStringComposer::Visit(void* userData, const BarSymbol&) {
 	out << "#|";
 }
 
+void SymbolToStringComposer::Visit(void* userData, const RankedBarSymbol& symbol) {
+	std::stringstream &out = *((std::stringstream*) userData);
+
+	out << "#|";
+	primitive::PrimitiveToStringComposer composer2;
+	out << composer2.compose(primitive::Primitive(symbol.getRank()));
+}
+
 std::string SymbolToStringComposer::compose(const Symbol& symbol) {
 	std::stringstream out;
 	symbol.getData().Accept((void*) &out, *this);
diff --git a/alib2data/src/alphabet/SymbolToStringComposer.h b/alib2data/src/alphabet/SymbolToStringComposer.h
index 8d00e6c4ab..52080a3c13 100644
--- a/alib2data/src/alphabet/SymbolToStringComposer.h
+++ b/alib2data/src/alphabet/SymbolToStringComposer.h
@@ -25,6 +25,7 @@ class SymbolToStringComposer : public VisitableSymbolBase::visitor_type {
 	void Visit(void*, const EndSymbol& symbol);
 	void Visit(void*, const RankedSymbol& symbol);
 	void Visit(void*, const BarSymbol& symbol);
+	void Visit(void*, const RankedBarSymbol& symbol);
 
 public:
 	/**
diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.cpp b/alib2data/src/alphabet/SymbolToXMLComposer.cpp
index 263155c543..6012d948bf 100644
--- a/alib2data/src/alphabet/SymbolToXMLComposer.cpp
+++ b/alib2data/src/alphabet/SymbolToXMLComposer.cpp
@@ -68,4 +68,12 @@ std::list<sax::Token> SymbolToXMLComposer::compose(const BarSymbol&) const {
 	return out;
 }
 
+std::list<sax::Token> SymbolToXMLComposer::compose(const RankedBarSymbol& symbol) const {
+	std::list<sax::Token> out;
+	out.push_back(sax::Token("RankedBarSymbol", sax::Token::TokenType::START_ELEMENT));
+	out.splice(out.end(), alib::api<primitive::Integer>::compose(symbol.getRank()));
+	out.push_back(sax::Token("RankedBarSymbol", sax::Token::TokenType::END_ELEMENT));
+	return out;
+}
+
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.h b/alib2data/src/alphabet/SymbolToXMLComposer.h
index 664340592e..cf2c837c08 100644
--- a/alib2data/src/alphabet/SymbolToXMLComposer.h
+++ b/alib2data/src/alphabet/SymbolToXMLComposer.h
@@ -46,6 +46,7 @@ class SymbolToXMLComposer {
 	std::list<sax::Token> compose(const EndSymbol& symbol) const;
 	std::list<sax::Token> compose(const RankedSymbol& symbol) const;
 	std::list<sax::Token> compose(const BarSymbol& symbol) const;
+	std::list<sax::Token> compose(const RankedBarSymbol& symbol) const;
 
 	template<typename T> friend class alib::api;
 };
diff --git a/alib2data/src/object/ObjectBase.h b/alib2data/src/object/ObjectBase.h
index 17b35d2457..b4115da1c8 100644
--- a/alib2data/src/object/ObjectBase.h
+++ b/alib2data/src/object/ObjectBase.h
@@ -95,6 +95,7 @@ class BottomOfTheStackSymbol;
 class EndSymbol;
 class RankedSymbol;
 class BarSymbol;
+class RankedBarSymbol;
 
 }
 
@@ -127,7 +128,7 @@ typedef std::acceptor_base<ObjectBase,
 			label::PrimitiveLabel, label::HexavigesimalLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel,
 			regexp::UnboundedRegExp, regexp::FormalRegExp,
 			string::Epsilon, string::LinearString, string::CyclicString,
-			alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol,
+			alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol,
 			container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap,
 			primitive::String, primitive::Integer, primitive::Character
 	> VisitableObjectBase;
@@ -142,7 +143,7 @@ class ObjectBase :
 			label::PrimitiveLabel, label::HexavigesimalLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel,
 			regexp::UnboundedRegExp, regexp::FormalRegExp,
 			string::Epsilon, string::LinearString, string::CyclicString,
-			alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol,
+			alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol,
 			container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap,
 			primitive::String, primitive::Integer, primitive::Character
 	>, public VisitableObjectBase {
-- 
GitLab