From 6d18c231007034967bdbf1e9c5900456bfcebb82 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Mon, 20 Oct 2014 14:27:58 +0200
Subject: [PATCH] implementation of RankedSymbol and BarSymbol

---
 alib2data/src/Api.cpp                         | 24 +++++++
 alib2data/src/Api.hpp                         | 14 ++++
 alib2data/src/alphabet/BarSymbol.cpp          | 47 ++++++++++++
 alib2data/src/alphabet/BarSymbol.h            | 42 +++++++++++
 alib2data/src/alphabet/RankedSymbol.cpp       | 72 +++++++++++++++++++
 alib2data/src/alphabet/RankedSymbol.h         | 62 ++++++++++++++++
 alib2data/src/alphabet/SymbolBase.h           |  2 +-
 .../src/alphabet/SymbolFromXMLParser.cpp      | 16 ++++-
 alib2data/src/alphabet/SymbolFromXMLParser.h  |  4 ++
 .../src/alphabet/SymbolToStringComposer.cpp   | 15 ++++
 .../src/alphabet/SymbolToStringComposer.h     |  2 +
 .../src/alphabet/SymbolToXMLComposer.cpp      | 16 +++++
 alib2data/src/alphabet/SymbolToXMLComposer.h  |  2 +
 alib2data/src/object/ObjectBase.h             |  6 +-
 14 files changed, 320 insertions(+), 4 deletions(-)
 create mode 100644 alib2data/src/alphabet/BarSymbol.cpp
 create mode 100644 alib2data/src/alphabet/BarSymbol.h
 create mode 100644 alib2data/src/alphabet/RankedSymbol.cpp
 create mode 100644 alib2data/src/alphabet/RankedSymbol.h

diff --git a/alib2data/src/Api.cpp b/alib2data/src/Api.cpp
index 1a7dba0475..9935a06342 100644
--- a/alib2data/src/Api.cpp
+++ b/alib2data/src/Api.cpp
@@ -137,6 +137,22 @@ std::list<sax::Token> api<alphabet::EndSymbol>::compose(const alphabet::EndSymbo
 	return ToXMLComposers::symbolComposer.compose(data);
 }
 
+alphabet::RankedSymbol api<alphabet::RankedSymbol>::parse(std::list<sax::Token>& input) {
+	return FromXMLParsers::symbolParser.parseRankedSymbol(input);
+}
+
+std::list<sax::Token> api<alphabet::RankedSymbol>::compose(const alphabet::RankedSymbol& data) {
+	return ToXMLComposers::symbolComposer.compose(data);
+}
+
+alphabet::BarSymbol api<alphabet::BarSymbol>::parse(std::list<sax::Token>& input) {
+	return FromXMLParsers::symbolParser.parseBarSymbol(input);
+}
+
+std::list<sax::Token> api<alphabet::BarSymbol>::compose(const alphabet::BarSymbol& data) {
+	return ToXMLComposers::symbolComposer.compose(data);
+}
+
 
 automaton::Automaton api<automaton::Automaton>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::automatonParser.parseAutomaton(input);
@@ -572,6 +588,14 @@ void ToXMLComposers::Visit(void* data, const alphabet::EndSymbol& symbol) const
 	*((std::list<sax::Token>*) data) = std::move(api<alphabet::EndSymbol>::compose(symbol));
 }
 
+void ToXMLComposers::Visit(void* data, const alphabet::RankedSymbol& symbol) const {
+	*((std::list<sax::Token>*) data) = std::move(api<alphabet::RankedSymbol>::compose(symbol));
+}
+
+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::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 36881e004e..7d5b11d276 100644
--- a/alib2data/src/Api.hpp
+++ b/alib2data/src/Api.hpp
@@ -138,6 +138,18 @@ struct api<alphabet::EndSymbol> {
 };
 
 
+template<>
+struct api<alphabet::RankedSymbol> {
+	static alphabet::RankedSymbol parse(std::list<sax::Token>& input);
+	static std::list<sax::Token> compose(const alphabet::RankedSymbol& data);
+};
+
+template<>
+struct api<alphabet::BarSymbol> {
+	static alphabet::BarSymbol parse(std::list<sax::Token>& input);
+	static std::list<sax::Token> compose(const alphabet::BarSymbol& data);
+};
+
 template<>
 struct api<automaton::Automaton> {
 	static automaton::Automaton parse(std::list<sax::Token>& input);
@@ -478,6 +490,8 @@ class ToXMLComposers : public VisitableObjectBase::const_visitor_type {
 	void Visit(void*, const alphabet::BlankSymbol& symbol) const;
 	void Visit(void*, const alphabet::BottomOfTheStackSymbol& symbol) const;
 	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 automaton::EpsilonNFA& automaton) const;
 	void Visit(void*, const automaton::MultiInitialStateNFA& automaton) const;
diff --git a/alib2data/src/alphabet/BarSymbol.cpp b/alib2data/src/alphabet/BarSymbol.cpp
new file mode 100644
index 0000000000..e147bc3c3d
--- /dev/null
+++ b/alib2data/src/alphabet/BarSymbol.cpp
@@ -0,0 +1,47 @@
+#include "BarSymbol.h"
+
+namespace alphabet {
+
+BarSymbol::BarSymbol() {
+
+}
+
+SymbolBase* BarSymbol::clone() const {
+	return new BarSymbol(*this);
+}
+
+SymbolBase* BarSymbol::plunder() && {
+	return new BarSymbol(std::move(*this));
+}
+
+bool BarSymbol::operator <(const ObjectBase& other) const {
+	return other > *this;
+}
+
+bool BarSymbol::operator ==(const ObjectBase& other) const {
+	return other == *this;
+}
+
+bool BarSymbol::operator >(const ObjectBase& other) const {
+	return other < *this;
+}
+
+bool BarSymbol::operator ==(const BarSymbol&) const {
+	return true;
+}
+
+bool BarSymbol::operator <(const BarSymbol&) const {
+	return false;
+}
+
+void BarSymbol::operator>>(std::ostream& out) const {
+	out << "(Bar symbol)";
+}
+
+BarSymbol::operator std::string () const {
+	return "|";
+}
+
+BarSymbol BarSymbol::BAR = BarSymbol();
+
+} /* namespace alphabet */
diff --git a/alib2data/src/alphabet/BarSymbol.h b/alib2data/src/alphabet/BarSymbol.h
new file mode 100644
index 0000000000..a6512759d8
--- /dev/null
+++ b/alib2data/src/alphabet/BarSymbol.h
@@ -0,0 +1,42 @@
+#ifndef BAR_SYMBOL_H_
+#define BAR_SYMBOL_H_
+
+#include "Symbol.h"
+
+namespace alphabet {
+
+/**
+ * Represents bar symbol for tree linearization.
+ */
+class BarSymbol : public std::acceptor<BarSymbol, VisitableSymbolBase, std::acceptor<BarSymbol, alib::VisitableObjectBase, SymbolBase> > {
+public:
+	/**
+	 * Creates a bar symbol.
+	 * @param symbol name of the symbol
+	 */
+	explicit BarSymbol();
+
+	virtual SymbolBase* clone() const;
+	virtual SymbolBase* plunder() &&;
+
+	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 BarSymbol& other) const;
+	virtual bool operator <(const BarSymbol& other) const;
+
+	virtual void operator>>(std::ostream& out) const;
+
+	virtual operator std::string () const;
+
+	virtual int selfTypeId() const {
+		return typeId<BarSymbol>();
+	}
+
+	static BarSymbol BAR;
+};
+
+} /* namespace alphabet */
+
+#endif /* BAR_SYMBOL_H_ */
diff --git a/alib2data/src/alphabet/RankedSymbol.cpp b/alib2data/src/alphabet/RankedSymbol.cpp
new file mode 100644
index 0000000000..a5320a7408
--- /dev/null
+++ b/alib2data/src/alphabet/RankedSymbol.cpp
@@ -0,0 +1,72 @@
+#include "RankedSymbol.h"
+
+namespace alphabet {
+
+RankedSymbol::RankedSymbol(int number, int rank) : label(label::labelFrom(number)), rank(rank) {
+
+}
+
+RankedSymbol::RankedSymbol(char character, int rank) : label(label::labelFrom(character)), rank(rank) {
+
+}
+
+RankedSymbol::RankedSymbol(const std::string& label, int rank) : label(label::labelFrom(label)), rank(rank) {
+
+}
+
+RankedSymbol::RankedSymbol(const label::Label& label, int rank) : label(label), rank(rank) {
+
+}
+
+RankedSymbol::RankedSymbol(label::Label&& label, int rank) : label(std::move(label)), rank(rank) {
+
+}
+
+SymbolBase* RankedSymbol::clone() const {
+	return new RankedSymbol(*this);
+}
+
+SymbolBase* RankedSymbol::plunder() && {
+	return new RankedSymbol(std::move(*this));
+}
+
+const label::Label& RankedSymbol::getLabel() const {
+	return label;
+}
+
+int RankedSymbol::getRank() const {
+	return rank;
+}
+
+bool RankedSymbol::operator <(const ObjectBase& other) const {
+	return other > *this;
+}
+
+bool RankedSymbol::operator ==(const ObjectBase& other) const {
+	return other == *this;
+}
+
+bool RankedSymbol::operator >(const ObjectBase& other) const {
+	return other < *this;
+}
+
+bool RankedSymbol::operator ==(const RankedSymbol& other) const {
+	return this->label == other.label && this -> rank == other.rank;
+}
+
+bool RankedSymbol::operator <(const RankedSymbol& other) const {
+	if (this->label < other.label) return true;
+	else if (this -> label == other.label) return this -> rank < other.rank;
+	else return false;
+}
+
+void RankedSymbol::operator>>(std::ostream& out) const {
+	out << "(RankedSymbol " << this->label << " #" << rank << ")";
+}
+
+RankedSymbol::operator std::string () const {
+	return (std::string) label + "_" + std::to_string(rank);
+}
+
+} /* namespace alphabet */
+
diff --git a/alib2data/src/alphabet/RankedSymbol.h b/alib2data/src/alphabet/RankedSymbol.h
new file mode 100644
index 0000000000..bda49d7815
--- /dev/null
+++ b/alib2data/src/alphabet/RankedSymbol.h
@@ -0,0 +1,62 @@
+#ifndef RANKED_SYMBOL_H_
+#define RANKED_SYMBOL_H_
+
+#include "../label/Label.h"
+#include "SymbolBase.h"
+#include <ostream>
+
+namespace alphabet {
+
+/**
+ * Represents symbol in an alphabet.
+ */
+class RankedSymbol : public std::acceptor<RankedSymbol, VisitableSymbolBase, std::acceptor<RankedSymbol, alib::VisitableObjectBase, SymbolBase> > {
+protected:
+	label::Label label;
+	int rank;
+	
+public:
+	explicit RankedSymbol(int number, int rank);
+	explicit RankedSymbol(char character, int rank);
+	explicit RankedSymbol(const std::string& label, int rank);
+
+	/**
+	 * Creates new symbol with given name and rank.
+	 * @param symbol name of the symbol
+	 * @param rank of the symbol
+	 */
+	explicit RankedSymbol(const label::Label& label, int rank);
+	explicit RankedSymbol(label::Label&& label, int rank);
+
+	virtual SymbolBase* clone() const;
+	virtual SymbolBase* plunder() &&;
+
+	/**
+	 * @return name of the symbol
+	 */
+	const label::Label& getLabel() const;
+
+	/**
+	 * @return rank of the symbol
+	 */
+	int 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 RankedSymbol& other) const;
+	virtual bool operator <(const RankedSymbol& other) const;
+
+	virtual void operator>>(std::ostream& out) const;
+
+	virtual operator std::string () const;
+
+	virtual int selfTypeId() const {
+		return typeId<RankedSymbol>();
+	}
+};
+
+} /* namespace alphabet */
+
+#endif /* RANKED_SYMBOL_H_ */
diff --git a/alib2data/src/alphabet/SymbolBase.h b/alib2data/src/alphabet/SymbolBase.h
index 18027e6451..de06282c45 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
+			LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, RankedSymbol, BarSymbol
 	> VisitableSymbolBase;
 
 /**
diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.cpp b/alib2data/src/alphabet/SymbolFromXMLParser.cpp
index aae1577e63..a2769e2896 100644
--- a/alib2data/src/alphabet/SymbolFromXMLParser.cpp
+++ b/alib2data/src/alphabet/SymbolFromXMLParser.cpp
@@ -37,7 +37,7 @@ Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std:
 }
 
 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")) {
+	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")) {
 		return true;
 	} else {
 		return false;
@@ -69,4 +69,18 @@ EndSymbol SymbolFromXMLParser::parseEndSymbol(std::list<sax::Token>& input) cons
 	return EndSymbol();
 }
 
+RankedSymbol SymbolFromXMLParser::parseRankedSymbol(std::list<sax::Token>& input) const {
+	popToken(input, sax::Token::TokenType::START_ELEMENT, "RankedSymbol");
+	label::Label data = alib::api<label::Label>::parse(input);
+	int rank = std::stoi(popTokenData(input, sax::Token::TokenType::CHARACTER));
+	popToken(input, sax::Token::TokenType::END_ELEMENT, "RankedSymbol");
+	return RankedSymbol(data, rank);
+}
+
+BarSymbol SymbolFromXMLParser::parseBarSymbol(std::list<sax::Token>& input) const {
+	popToken(input, sax::Token::TokenType::START_ELEMENT, "BarSymbol");
+	popToken(input, sax::Token::TokenType::END_ELEMENT, "BarSymbol");
+	return BarSymbol();
+}
+
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.h b/alib2data/src/alphabet/SymbolFromXMLParser.h
index 2dafe3a604..add3c29373 100644
--- a/alib2data/src/alphabet/SymbolFromXMLParser.h
+++ b/alib2data/src/alphabet/SymbolFromXMLParser.h
@@ -20,6 +20,8 @@
 #include "BottomOfTheStackSymbol.h"
 #include "EndSymbol.h"
 #include "LabeledSymbol.h"
+#include "RankedSymbol.h"
+#include "BarSymbol.h"
 
 namespace alib {
 
@@ -41,6 +43,8 @@ class SymbolFromXMLParser : public sax::FromXMLParserHelper {
 	BlankSymbol parseBlankSymbol(std::list<sax::Token>& input) const;
 	BottomOfTheStackSymbol parseBottomOfTheStackSymbol(std::list<sax::Token>& input) const;
 	EndSymbol parseEndSymbol(std::list<sax::Token>& input) const;
+	RankedSymbol parseRankedSymbol(std::list<sax::Token>& input) const;
+	BarSymbol parseBarSymbol(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 eacdda14b0..3b365ce9a6 100644
--- a/alib2data/src/alphabet/SymbolToStringComposer.cpp
+++ b/alib2data/src/alphabet/SymbolToStringComposer.cpp
@@ -9,6 +9,7 @@
 #include "../label/LabelToStringComposer.h"
 #include <algorithm>
 #include "LabeledSymbol.h"
+#include "RankedSymbol.h"
 
 namespace alphabet {
 
@@ -37,6 +38,20 @@ void SymbolToStringComposer::Visit(void* userData, const EndSymbol&) {
 	out << "#E";
 }
 
+void SymbolToStringComposer::Visit(void* userData, const RankedSymbol& symbol) {
+	std::stringstream &out = *((std::stringstream*) userData);
+
+	label::LabelToStringComposer composer;
+	out << composer.compose(symbol.getLabel());
+	out << std::to_string(symbol.getRank());
+}
+
+void SymbolToStringComposer::Visit(void* userData, const BarSymbol&) {
+	std::stringstream &out = *((std::stringstream*) userData);
+
+	out << "#|";
+}
+
 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 66b1db2b57..8d00e6c4ab 100644
--- a/alib2data/src/alphabet/SymbolToStringComposer.h
+++ b/alib2data/src/alphabet/SymbolToStringComposer.h
@@ -23,6 +23,8 @@ class SymbolToStringComposer : public VisitableSymbolBase::visitor_type {
 	void Visit(void*, const BlankSymbol& symbol);
 	void Visit(void*, const BottomOfTheStackSymbol& symbol);
 	void Visit(void*, const EndSymbol& symbol);
+	void Visit(void*, const RankedSymbol& symbol);
+	void Visit(void*, const BarSymbol& symbol);
 
 public:
 	/**
diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.cpp b/alib2data/src/alphabet/SymbolToXMLComposer.cpp
index 76f674fb8e..d3a4e07231 100644
--- a/alib2data/src/alphabet/SymbolToXMLComposer.cpp
+++ b/alib2data/src/alphabet/SymbolToXMLComposer.cpp
@@ -52,4 +52,20 @@ std::list<sax::Token> SymbolToXMLComposer::compose(const EndSymbol&) const {
 	return out;
 }
 
+std::list<sax::Token> SymbolToXMLComposer::compose(const RankedSymbol& symbol) const {
+	std::list<sax::Token> out;
+	out.push_back(sax::Token("RankedSymbol", sax::Token::TokenType::START_ELEMENT));
+	out.splice(out.end(), alib::api<label::Label>::compose(symbol.getLabel()));
+	out.push_back(sax::Token(std::to_string(symbol.getRank()), sax::Token::TokenType::CHARACTER));
+	out.push_back(sax::Token("RankedSymbol", sax::Token::TokenType::END_ELEMENT));
+	return out;
+}
+
+std::list<sax::Token> SymbolToXMLComposer::compose(const BarSymbol&) const {
+	std::list<sax::Token> out;
+	out.push_back(sax::Token("BarSymbol", sax::Token::TokenType::START_ELEMENT));
+	out.push_back(sax::Token("BarSymbol", sax::Token::TokenType::END_ELEMENT));
+	return out;
+}
+
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.h b/alib2data/src/alphabet/SymbolToXMLComposer.h
index dff6166b3b..664340592e 100644
--- a/alib2data/src/alphabet/SymbolToXMLComposer.h
+++ b/alib2data/src/alphabet/SymbolToXMLComposer.h
@@ -44,6 +44,8 @@ class SymbolToXMLComposer {
 	std::list<sax::Token> compose(const BlankSymbol& symbol) const;
 	std::list<sax::Token> compose(const BottomOfTheStackSymbol& symbol) const;
 	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;
 
 	template<typename T> friend class alib::api;
 };
diff --git a/alib2data/src/object/ObjectBase.h b/alib2data/src/object/ObjectBase.h
index 0a99bd83e8..17b35d2457 100644
--- a/alib2data/src/object/ObjectBase.h
+++ b/alib2data/src/object/ObjectBase.h
@@ -93,6 +93,8 @@ class LabeledSymbol;
 class BlankSymbol;
 class BottomOfTheStackSymbol;
 class EndSymbol;
+class RankedSymbol;
+class BarSymbol;
 
 }
 
@@ -125,7 +127,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::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol,
 			container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap,
 			primitive::String, primitive::Integer, primitive::Character
 	> VisitableObjectBase;
@@ -140,7 +142,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::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol,
 			container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap,
 			primitive::String, primitive::Integer, primitive::Character
 	>, public VisitableObjectBase {
-- 
GitLab