From e1a504bd0f58ac410f1784634677804beeb505f1 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Mon, 1 Dec 2014 09:52:07 +0100
Subject: [PATCH] UniqueSymbol implementation

---
 alib2data/src/Api.cpp                         | 27 +++++--
 alib2data/src/Api.hpp                         |  9 +++
 alib2data/src/alphabet/SymbolBase.h           |  2 +-
 alib2data/src/alphabet/SymbolFeatures.h       |  3 +-
 .../src/alphabet/SymbolFromXMLParser.cpp      | 18 ++++-
 alib2data/src/alphabet/SymbolFromXMLParser.h  |  2 +
 .../src/alphabet/SymbolToStringComposer.cpp   | 12 +++
 .../src/alphabet/SymbolToStringComposer.h     |  1 +
 .../src/alphabet/SymbolToXMLComposer.cpp      |  9 +++
 alib2data/src/alphabet/SymbolToXMLComposer.h  |  1 +
 alib2data/src/alphabet/UniqueSymbol.cpp       | 55 ++++++++++++++
 alib2data/src/alphabet/UniqueSymbol.h         | 76 +++++++++++++++++++
 alib2data/src/object/ObjectBase.h             |  5 +-
 13 files changed, 209 insertions(+), 11 deletions(-)
 create mode 100644 alib2data/src/alphabet/UniqueSymbol.cpp
 create mode 100644 alib2data/src/alphabet/UniqueSymbol.h

diff --git a/alib2data/src/Api.cpp b/alib2data/src/Api.cpp
index bb2d9c18d4..1639aec82b 100644
--- a/alib2data/src/Api.cpp
+++ b/alib2data/src/Api.cpp
@@ -49,6 +49,7 @@ const std::string Names::ALPHABET_RANKED_BAR_SYMBOL = "RankedBarSymbol";
 const std::string Names::ALPHABET_SUBTREE_WILDCARD_SYMBOL = "SubtreeWildcardSymbol";
 const std::string Names::ALPHABET_SYMBOL_SET_SYMBOL = "SymbolSetSymbol";
 const std::string Names::ALPHABET_SYMBOL_PAIR_SYMBOL = "SymbolPairSymbol";
+const std::string Names::ALPHABET_UNIQUE_SYMBOL = "UniqueSymbol";
 const std::string Names::AUTOMATON_EPSILON_NFA = "EpsilonNFA";
 const std::string Names::AUTOMATON_MULTI_INITIAL_STATE_NFA = "MultiInitialStateNFA";
 const std::string Names::AUTOMATON_NFA = "NFA";
@@ -325,6 +326,18 @@ std::list<sax::Token> api<alphabet::SymbolPairSymbol>::compose(const alphabet::S
 	return ToXMLComposers::symbolComposer.compose(data);
 }
 
+alphabet::UniqueSymbol api<alphabet::UniqueSymbol>::parse(std::list<sax::Token>& input) {
+	return FromXMLParsers::symbolParser.parseUniqueSymbol(input);
+}
+
+bool api<alphabet::UniqueSymbol>::first(const std::list<sax::Token>& input) {
+	return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::ALPHABET_UNIQUE_SYMBOL);
+}
+
+std::list<sax::Token> api<alphabet::UniqueSymbol>::compose(const alphabet::UniqueSymbol& data) {
+	return ToXMLComposers::symbolComposer.compose(data);
+}
+
 
 automaton::Automaton api<automaton::Automaton>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::automatonParser.parseAutomaton(input);
@@ -789,7 +802,7 @@ label::UniqueLabel api<label::UniqueLabel>::parse(std::list<sax::Token>& input)
 }
 
 bool api<label::UniqueLabel>::first(const std::list<sax::Token>& input) {
-	return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::LABEL_LABEL_PAIR_LABEL);
+	return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::LABEL_UNIQUE_LABEL);
 }
 
 std::list<sax::Token> api<label::UniqueLabel>::compose(const label::UniqueLabel& data) {
@@ -1047,12 +1060,16 @@ void ToXMLComposers::Visit(void* data, const alphabet::LabeledSymbol& symbol) co
 	*((std::list<sax::Token>*) data) = std::move(api<alphabet::LabeledSymbol>::compose(symbol));
 }
 
-void ToXMLComposers::Visit(void* data, const alphabet::SymbolSetSymbol& label) const {
-	*((std::list<sax::Token>*) data) = std::move(api<alphabet::SymbolSetSymbol>::compose(label));
+void ToXMLComposers::Visit(void* data, const alphabet::SymbolSetSymbol& symbol) const {
+	*((std::list<sax::Token>*) data) = std::move(api<alphabet::SymbolSetSymbol>::compose(symbol));
+}
+
+void ToXMLComposers::Visit(void* data, const alphabet::SymbolPairSymbol& symbol) const {
+	*((std::list<sax::Token>*) data) = std::move(api<alphabet::SymbolPairSymbol>::compose(symbol));
 }
 
-void ToXMLComposers::Visit(void* data, const alphabet::SymbolPairSymbol& label) const {
-	*((std::list<sax::Token>*) data) = std::move(api<alphabet::SymbolPairSymbol>::compose(label));
+void ToXMLComposers::Visit(void* data, const alphabet::UniqueSymbol& symbol) const {
+	*((std::list<sax::Token>*) data) = std::move(api<alphabet::UniqueSymbol>::compose(symbol));
 }
 
 void ToXMLComposers::Visit(void* data, const automaton::EpsilonNFA& automaton) const {
diff --git a/alib2data/src/Api.hpp b/alib2data/src/Api.hpp
index 1a908f2881..18d041ce2f 100644
--- a/alib2data/src/Api.hpp
+++ b/alib2data/src/Api.hpp
@@ -50,6 +50,7 @@ public:
 	const static std::string ALPHABET_SUBTREE_WILDCARD_SYMBOL;
 	const static std::string ALPHABET_SYMBOL_PAIR_SYMBOL;
 	const static std::string ALPHABET_SYMBOL_SET_SYMBOL;
+	const static std::string ALPHABET_UNIQUE_SYMBOL;
 	const static std::string AUTOMATON_EPSILON_NFA;
 	const static std::string AUTOMATON_MULTI_INITIAL_STATE_NFA;
 	const static std::string AUTOMATON_NFA;
@@ -277,6 +278,13 @@ struct api<alphabet::SymbolPairSymbol> {
 	static std::list<sax::Token> compose(const alphabet::SymbolPairSymbol& data);
 };
 
+template<>
+struct api<alphabet::UniqueSymbol> {
+	static alphabet::UniqueSymbol parse(std::list<sax::Token>& input);
+	static bool first(const std::list<sax::Token>& input);
+	static std::list<sax::Token> compose(const alphabet::UniqueSymbol& data);
+};
+
 
 template<>
 struct api<automaton::Automaton> {
@@ -716,6 +724,7 @@ class ToXMLComposers : public VisitableObjectBase::const_visitor_type {
 	void Visit(void*, const alphabet::SubtreeWildcardSymbol& symbol) const;
 	void Visit(void*, const alphabet::SymbolSetSymbol& label) const;
 	void Visit(void*, const alphabet::SymbolPairSymbol& label) const;
+	void Visit(void*, const alphabet::UniqueSymbol& label) const;
 
 	void Visit(void*, const automaton::EpsilonNFA& automaton) const;
 	void Visit(void*, const automaton::MultiInitialStateNFA& automaton) const;
diff --git a/alib2data/src/alphabet/SymbolBase.h b/alib2data/src/alphabet/SymbolBase.h
index 9c0e18661c..4692bfe859 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, RankedBarSymbol, SubtreeWildcardSymbol, SymbolSetSymbol, SymbolPairSymbol
+			LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, RankedSymbol, BarSymbol, RankedBarSymbol, SubtreeWildcardSymbol, SymbolSetSymbol, SymbolPairSymbol, UniqueSymbol
 	> VisitableSymbolBase;
 
 /**
diff --git a/alib2data/src/alphabet/SymbolFeatures.h b/alib2data/src/alphabet/SymbolFeatures.h
index b1957bbdc8..2344e56daf 100644
--- a/alib2data/src/alphabet/SymbolFeatures.h
+++ b/alib2data/src/alphabet/SymbolFeatures.h
@@ -20,7 +20,8 @@ enum class FEATURES {
 	RANKED_BAR,
 	SUBTREE_WILDCARD,
 	SYMBOL_SET_SYMBOL,
-	SYMBOL_PAIR_SYMBOL
+	SYMBOL_PAIR_SYMBOL,
+	UNIQUE_SYMBOL
 };
 
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.cpp b/alib2data/src/alphabet/SymbolFromXMLParser.cpp
index d054189e5d..b00bdb3b88 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, FEATURES::RANKED_BAR, FEATURES::SUBTREE_WILDCARD, FEATURES::SYMBOL_PAIR_SYMBOL, FEATURES::SYMBOL_SET_SYMBOL}));
+	return parseSymbol(input, std::set<FEATURES>({FEATURES::LABELED, FEATURES::BLANK, FEATURES::BOTTOM, FEATURES::END, FEATURES::RANKED, FEATURES::BAR, FEATURES::RANKED_BAR, FEATURES::SUBTREE_WILDCARD, FEATURES::SYMBOL_PAIR_SYMBOL, FEATURES::SYMBOL_SET_SYMBOL, FEATURES::UNIQUE_SYMBOL}));
 }
 
 Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std::set<FEATURES>& features) const {
@@ -49,8 +49,11 @@ Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std:
 	} else if(alib::api<SymbolSetSymbol>::first(input)) {
 		if(!features.count(FEATURES::SYMBOL_SET_SYMBOL)) throw exception::AlibException();
 		return Symbol(parseSymbolSetSymbol(input));
+	} else if(alib::api<UniqueSymbol>::first(input)) {
+		if(!features.count(FEATURES::UNIQUE_SYMBOL)) throw exception::AlibException();
+		return Symbol(parseUniqueSymbol(input));
 	} else {
-		throw sax::ParserException(sax::Token("LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, RankedSymbol, BarSymbol, RankedBarSymbol, SubtreeWildcardSymbol, SymbolPairSymbol, SymbolSetSymbol", sax::Token::TokenType::START_ELEMENT), input.front());
+		throw sax::ParserException(sax::Token("LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, RankedSymbol, BarSymbol, RankedBarSymbol, SubtreeWildcardSymbol, SymbolPairSymbol, SymbolSetSymbol, UniqueSymbol", sax::Token::TokenType::START_ELEMENT), input.front());
 	}
 }
 
@@ -136,4 +139,15 @@ SymbolPairSymbol SymbolFromXMLParser::parseSymbolPairSymbol(std::list<sax::Token
 	return data;
 }
 
+UniqueSymbol SymbolFromXMLParser::parseUniqueSymbol(std::list<sax::Token>& input) const {
+	popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::ALPHABET_UNIQUE_SYMBOL);
+	
+	Symbol firstSymbol = parseSymbol(input);
+	primitive::Integer secondSymbol = alib::api<primitive::Integer>::parse(input);
+
+	UniqueSymbol data(firstSymbol, secondSymbol);
+	popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::ALPHABET_UNIQUE_SYMBOL);
+	return data;
+}
+
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.h b/alib2data/src/alphabet/SymbolFromXMLParser.h
index 05d260e2e6..f661309e53 100644
--- a/alib2data/src/alphabet/SymbolFromXMLParser.h
+++ b/alib2data/src/alphabet/SymbolFromXMLParser.h
@@ -26,6 +26,7 @@
 #include "SubtreeWildcardSymbol.h"
 #include "SymbolPairSymbol.h"
 #include "SymbolSetSymbol.h"
+#include "UniqueSymbol.h"
 
 namespace alib {
 
@@ -53,6 +54,7 @@ class SymbolFromXMLParser : public sax::FromXMLParserHelper {
 	SubtreeWildcardSymbol parseSubtreeWildcardSymbol(std::list<sax::Token>& input) const;
 	SymbolPairSymbol parseSymbolPairSymbol(std::list<sax::Token>& input) const;
 	SymbolSetSymbol parseSymbolSetSymbol(std::list<sax::Token>& input) const;
+	UniqueSymbol parseUniqueSymbol(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 1929dcbc39..d9f5918694 100644
--- a/alib2data/src/alphabet/SymbolToStringComposer.cpp
+++ b/alib2data/src/alphabet/SymbolToStringComposer.cpp
@@ -14,6 +14,7 @@
 #include "RankedBarSymbol.h"
 #include "SymbolPairSymbol.h"
 #include "SymbolSetSymbol.h"
+#include "UniqueSymbol.h"
 
 namespace alphabet {
 
@@ -96,6 +97,17 @@ void SymbolToStringComposer::Visit(void* userData, const SymbolPairSymbol& symbo
 	out << '>';
 }
 
+void SymbolToStringComposer::Visit(void* userData, const UniqueSymbol& symbol) {
+	std::stringstream &out = *((std::stringstream*) userData);
+
+	out << '<';
+	symbol.getSymbol().getData().Accept(userData, *this);
+	out << ", ";
+	primitive::PrimitiveToStringComposer composer;
+	symbol.getId().Accept(userData, composer);
+	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 84cc336fb7..64b3d2c07c 100644
--- a/alib2data/src/alphabet/SymbolToStringComposer.h
+++ b/alib2data/src/alphabet/SymbolToStringComposer.h
@@ -29,6 +29,7 @@ class SymbolToStringComposer : public VisitableSymbolBase::visitor_type {
 	void Visit(void*, const SubtreeWildcardSymbol& symbol);
 	void Visit(void*, const SymbolPairSymbol& symbol);
 	void Visit(void*, const SymbolSetSymbol& symbol);
+	void Visit(void*, const UniqueSymbol& symbol);
 
 public:
 	/**
diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.cpp b/alib2data/src/alphabet/SymbolToXMLComposer.cpp
index 7bf62d747f..506034e151 100644
--- a/alib2data/src/alphabet/SymbolToXMLComposer.cpp
+++ b/alib2data/src/alphabet/SymbolToXMLComposer.cpp
@@ -102,4 +102,13 @@ std::list<sax::Token> SymbolToXMLComposer::compose(const SymbolPairSymbol& symbo
 	return out;
 }
 
+std::list<sax::Token> SymbolToXMLComposer::compose(const UniqueSymbol& symbol) const {
+	std::list<sax::Token> out;
+	out.push_back(sax::Token(alib::Names::LABEL_UNIQUE_LABEL, sax::Token::TokenType::START_ELEMENT));
+	out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol.getSymbol()));
+	out.splice(out.end(), alib::api<primitive::Integer>::compose(symbol.getId()));
+	out.push_back(sax::Token(alib::Names::LABEL_UNIQUE_LABEL, sax::Token::TokenType::END_ELEMENT));
+	return out;
+}
+
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.h b/alib2data/src/alphabet/SymbolToXMLComposer.h
index 6db563aec2..662137a9ba 100644
--- a/alib2data/src/alphabet/SymbolToXMLComposer.h
+++ b/alib2data/src/alphabet/SymbolToXMLComposer.h
@@ -50,6 +50,7 @@ class SymbolToXMLComposer {
 	std::list<sax::Token> compose(const SubtreeWildcardSymbol& symbol) const;
 	std::list<sax::Token> compose(const SymbolPairSymbol& symbol) const;
 	std::list<sax::Token> compose(const SymbolSetSymbol& symbol) const;
+	std::list<sax::Token> compose(const UniqueSymbol& symbol) const;
 
 	template<typename T> friend class alib::api;
 };
diff --git a/alib2data/src/alphabet/UniqueSymbol.cpp b/alib2data/src/alphabet/UniqueSymbol.cpp
new file mode 100644
index 0000000000..185fa45579
--- /dev/null
+++ b/alib2data/src/alphabet/UniqueSymbol.cpp
@@ -0,0 +1,55 @@
+/*
+ * UniqueSymbol.cpp
+ *
+ *  Created on: Mar 26, 2013
+ *      Author: Jan Travicek
+ */
+
+#include "UniqueSymbol.h"
+#include "../std/set.hpp"
+#include <sstream>
+
+namespace alphabet {
+
+UniqueSymbol::UniqueSymbol(const Symbol& symbol, primitive::Integer& id) : symbol(symbol), id(id) {
+
+}
+
+SymbolBase* UniqueSymbol::clone() const {
+	return new UniqueSymbol(*this);
+}
+
+SymbolBase* UniqueSymbol::plunder() && {
+	return new UniqueSymbol(std::move(*this));
+}
+
+const Symbol& UniqueSymbol::getSymbol() const {
+	return symbol;
+}
+
+const primitive::Integer& UniqueSymbol::getId() const {
+	return id;
+}
+
+int UniqueSymbol::compare(const UniqueSymbol& other) const {
+	int res = symbol.getData().compare(other.symbol.getData());
+	if(res == 0) res = id.compare(other.id);
+	return res;
+}
+
+void UniqueSymbol::operator>>(std::ostream& out) const {
+	out << "(UniqueSymbol " << symbol << ", " << id << ")";
+}
+
+UniqueSymbol::operator std::string() const {
+	std::stringstream ss;
+	ss << "{";
+	ss << symbol;
+	ss << ", ";
+	ss << id;
+	ss << "}";
+	return std::move(ss).str();
+}
+
+} /* namespace alphabet */
+
diff --git a/alib2data/src/alphabet/UniqueSymbol.h b/alib2data/src/alphabet/UniqueSymbol.h
new file mode 100644
index 0000000000..36b0cda210
--- /dev/null
+++ b/alib2data/src/alphabet/UniqueSymbol.h
@@ -0,0 +1,76 @@
+/*
+ * UniqueSymbol.h
+ *
+ *  Created on: Mar 26, 2013
+ *      Author: Jan Travnicek
+ */
+
+#ifndef SYMBOL_ID_SYMBOL_H_
+#define SYMBOL_ID_SYMBOL_H_
+
+#include <string>
+#include <ostream>
+
+#include "Symbol.h"
+#include "SymbolBase.h"
+#include <set>
+#include "../primitive/Integer.h"
+
+namespace alphabet {
+
+/**
+ * Represents symbol in an alphabet.
+ */
+class UniqueSymbol : public std::acceptor<UniqueSymbol, VisitableSymbolBase, std::acceptor<UniqueSymbol, alib::VisitableObjectBase, SymbolBase> > {
+protected:
+	Symbol symbol;
+	primitive::Integer id;
+
+public:
+	/**
+	 * Creates new symbol with given name.
+	 * @param symbol name of the symbol
+	 */
+	explicit UniqueSymbol(const Symbol& symbol, primitive::Integer& id);
+
+	virtual SymbolBase* clone() const;
+
+	virtual SymbolBase* plunder() &&;
+
+	/**
+	 * @return name of the symbol
+	 */
+	const Symbol& getSymbol() const;
+
+	const primitive::Integer& getId() const;
+
+	virtual int compare(const ObjectBase& other) const {
+		return -other.compare(*this);
+	}
+
+	virtual int compare(const UniqueSymbol& other) const;
+
+	virtual void operator>>(std::ostream&) const;
+
+	virtual operator std::string () const;
+
+	virtual int selfTypeId() const {
+		return typeId<UniqueSymbol>();
+	}
+};
+
+} /* namespace alphabet */
+
+namespace std {
+
+template<>
+struct compare<alphabet::UniqueSymbol> {
+	int operator()(const alphabet::UniqueSymbol& first, const alphabet::UniqueSymbol& second) const {
+		return first.compare(second);
+	}
+};
+
+} /* namespace std */
+
+#endif /* SYMBOL_ID_SYMBOL_H_ */
+
diff --git a/alib2data/src/object/ObjectBase.h b/alib2data/src/object/ObjectBase.h
index c4a21b2acc..b9b8014be6 100644
--- a/alib2data/src/object/ObjectBase.h
+++ b/alib2data/src/object/ObjectBase.h
@@ -101,6 +101,7 @@ class RankedBarSymbol;
 class SubtreeWildcardSymbol;
 class SymbolSetSymbol;
 class SymbolPairSymbol;
+class UniqueSymbol;
 
 }
 
@@ -133,7 +134,7 @@ typedef std::acceptor_base<ObjectBase,
 			label::PrimitiveLabel, label::HexavigesimalLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel, label::UniqueLabel,
 			regexp::UnboundedRegExp, regexp::FormalRegExp,
 			string::Epsilon, string::LinearString, string::CyclicString,
-			alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol, alphabet::SubtreeWildcardSymbol, alphabet::SymbolPairSymbol, alphabet::SymbolSetSymbol,
+			alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol, alphabet::SubtreeWildcardSymbol, alphabet::SymbolPairSymbol, alphabet::SymbolSetSymbol, alphabet::UniqueSymbol,
 			container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap,
 			primitive::String, primitive::Integer, primitive::Character
 	> VisitableObjectBase;
@@ -148,7 +149,7 @@ class ObjectBase :
 			label::PrimitiveLabel, label::HexavigesimalLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel, label::UniqueLabel,
 			regexp::UnboundedRegExp, regexp::FormalRegExp,
 			string::Epsilon, string::LinearString, string::CyclicString,
-			alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol, alphabet::SubtreeWildcardSymbol, alphabet::SymbolPairSymbol, alphabet::SymbolSetSymbol,
+			alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol, alphabet::SubtreeWildcardSymbol, alphabet::SymbolPairSymbol, alphabet::SymbolSetSymbol, alphabet::UniqueSymbol,
 			container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap,
 			primitive::String, primitive::Integer, primitive::Character
 	>, public VisitableObjectBase {
-- 
GitLab