From 173fbcadd4d78c0df431e01264ca74e353c16c99 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Sat, 27 Sep 2014 16:07:39 +0200
Subject: [PATCH] add ObjectLabel -- wrapper of anything as Label

---
 alib2data/src/Api.cpp                         | 12 ++++
 alib2data/src/Api.hpp                         |  7 +++
 alib2data/src/label/LabelBase.h               |  2 +-
 alib2data/src/label/LabelFeatures.h           |  1 +
 alib2data/src/label/LabelFromStringParser.cpp |  3 +-
 alib2data/src/label/LabelFromXMLParser.cpp    | 17 +++++-
 alib2data/src/label/LabelFromXMLParser.h      |  2 +
 alib2data/src/label/LabelToStringComposer.cpp |  6 ++
 alib2data/src/label/LabelToStringComposer.h   |  1 +
 alib2data/src/label/LabelToXMLComposer.cpp    | 11 +++-
 alib2data/src/label/LabelToXMLComposer.h      |  1 +
 alib2data/src/label/NextLabel.cpp             |  4 ++
 alib2data/src/label/NextLabel.h               |  1 +
 alib2data/src/label/ObjectLabel.cpp           | 57 +++++++++++++++++
 alib2data/src/label/ObjectLabel.h             | 61 +++++++++++++++++++
 alib2data/src/object/ObjectBase.h             |  5 +-
 16 files changed, 181 insertions(+), 10 deletions(-)
 create mode 100644 alib2data/src/label/ObjectLabel.cpp
 create mode 100644 alib2data/src/label/ObjectLabel.h

diff --git a/alib2data/src/Api.cpp b/alib2data/src/Api.cpp
index 39901ba263..2234b408bd 100644
--- a/alib2data/src/Api.cpp
+++ b/alib2data/src/Api.cpp
@@ -404,6 +404,14 @@ std::list<sax::Token> api<label::CharacterLabel>::compose(const label::Character
 	return ToXMLComposers::labelComposer.compose(data);
 }
 
+label::ObjectLabel api<label::ObjectLabel>::parse(std::list<sax::Token>& input) {
+	return FromXMLParsers::labelParser.parseObjectLabel(input);
+}
+
+std::list<sax::Token> api<label::ObjectLabel>::compose(const label::ObjectLabel& data) {
+	return ToXMLComposers::labelComposer.compose(data);
+}
+
 label::LabelSetLabel api<label::LabelSetLabel>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::labelParser.parseLabelSetLabel(input);
 }
@@ -668,6 +676,10 @@ void ToXMLComposers::Visit(void* data, const label::CharacterLabel& label) const
 	*((std::list<sax::Token>*) data) = std::move(api<label::CharacterLabel>::compose(label));
 }
 
+void ToXMLComposers::Visit(void* data, const label::ObjectLabel& label) const {
+	*((std::list<sax::Token>*) data) = std::move(api<label::ObjectLabel>::compose(label));
+}
+
 void ToXMLComposers::Visit(void* data, const label::LabelSetLabel& label) const {
 	*((std::list<sax::Token>*) data) = std::move(api<label::LabelSetLabel>::compose(label));
 }
diff --git a/alib2data/src/Api.hpp b/alib2data/src/Api.hpp
index fd58922caa..1207d0cabb 100644
--- a/alib2data/src/Api.hpp
+++ b/alib2data/src/Api.hpp
@@ -338,6 +338,12 @@ struct api<label::CharacterLabel> {
 	static std::list<sax::Token> compose(const label::CharacterLabel& data);
 };
 
+template<>
+struct api<label::ObjectLabel> {
+	static label::ObjectLabel parse(std::list<sax::Token>& input);
+	static std::list<sax::Token> compose(const label::ObjectLabel& data);
+};
+
 template<>
 struct api<label::LabelSetLabel> {
 	static label::LabelSetLabel parse(std::list<sax::Token>& input);
@@ -493,6 +499,7 @@ class ToXMLComposers : public VisitableObjectBase::const_visitor_type {
 	void Visit(void*, const label::StringLabel& label) const;
 	void Visit(void*, const label::IntegerLabel& label) const;
 	void Visit(void*, const label::CharacterLabel& label) const;
+	void Visit(void*, const label::ObjectLabel& label) const;
 	void Visit(void*, const label::LabelSetLabel& label) const;
 	void Visit(void*, const label::LabelPairLabel& label) const;
 
diff --git a/alib2data/src/label/LabelBase.h b/alib2data/src/label/LabelBase.h
index 708a41f71d..6ac8e84349 100644
--- a/alib2data/src/label/LabelBase.h
+++ b/alib2data/src/label/LabelBase.h
@@ -14,7 +14,7 @@
 namespace label {
 
 typedef std::acceptor_base<
-			label::StringLabel, label::IntegerLabel, label::CharacterLabel, label::LabelSetLabel, label::LabelPairLabel
+			label::StringLabel, label::IntegerLabel, label::CharacterLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel
 	> VisitableLabelBase;
 
 /**
diff --git a/alib2data/src/label/LabelFeatures.h b/alib2data/src/label/LabelFeatures.h
index 0e9ddc62c0..b6e49feaad 100644
--- a/alib2data/src/label/LabelFeatures.h
+++ b/alib2data/src/label/LabelFeatures.h
@@ -14,6 +14,7 @@ enum class FEATURES {
 	STRING,
 	CHAR,
 	INTEGER,
+	OBJECT,
 	LABEL_SET,
 	LABEL_PAIR
 };
diff --git a/alib2data/src/label/LabelFromStringParser.cpp b/alib2data/src/label/LabelFromStringParser.cpp
index bd74f08cb7..41475b38cd 100644
--- a/alib2data/src/label/LabelFromStringParser.cpp
+++ b/alib2data/src/label/LabelFromStringParser.cpp
@@ -10,6 +10,7 @@
 #include "StringLabel.h"
 #include "IntegerLabel.h"
 #include "CharacterLabel.h"
+#include "ObjectLabel.h"
 #include "LabelSetLabel.h"
 #include "LabelPairLabel.h"
 #include <algorithm>
@@ -21,7 +22,7 @@ LabelFromStringParser::LabelFromStringParser(std::istream& input) : m_Lexer(inpu
 }
 
 Label LabelFromStringParser::parse() {
-	return parse(std::set<FEATURES>({FEATURES::STRING, FEATURES::CHAR, FEATURES::INTEGER, FEATURES::LABEL_SET, FEATURES::LABEL_PAIR}));
+	return parse(std::set<FEATURES>({FEATURES::STRING, FEATURES::CHAR, FEATURES::INTEGER, FEATURES::OBJECT, FEATURES::LABEL_SET, FEATURES::LABEL_PAIR}));
 }
 
 Label LabelFromStringParser::parse(const std::set<FEATURES>& features) {
diff --git a/alib2data/src/label/LabelFromXMLParser.cpp b/alib2data/src/label/LabelFromXMLParser.cpp
index e17fd7453a..dc18f1e036 100644
--- a/alib2data/src/label/LabelFromXMLParser.cpp
+++ b/alib2data/src/label/LabelFromXMLParser.cpp
@@ -7,12 +7,13 @@
 
 #include "LabelFromXMLParser.h"
 #include "../sax/ParserException.h"
+#include "../Api.hpp"
 #include <algorithm>
 
 namespace label {
 
 Label LabelFromXMLParser::parseLabel(std::list<sax::Token>& input) const {
-	return parseLabel(input, std::set<FEATURES>({FEATURES::STRING, FEATURES::CHAR, FEATURES::INTEGER, FEATURES::LABEL_SET, FEATURES::LABEL_PAIR}));
+	return parseLabel(input, std::set<FEATURES>({FEATURES::STRING, FEATURES::CHAR, FEATURES::INTEGER, FEATURES::OBJECT, FEATURES::LABEL_SET, FEATURES::LABEL_PAIR}));
 }
 
 Label LabelFromXMLParser::parseLabel(std::list<sax::Token>& input, const std::set<FEATURES>& features) const {
@@ -25,6 +26,9 @@ Label LabelFromXMLParser::parseLabel(std::list<sax::Token>& input, const std::se
 	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "CharacterLabel")) {
 		if(!features.count(FEATURES::CHAR)) throw exception::AlibException();
 		return Label(parseCharacterLabel(input));
+	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "ObjectLabel")) {
+		if(!features.count(FEATURES::OBJECT)) throw exception::AlibException();
+		return Label(parseObjectLabel(input));
 	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "LabelSetLabel")) {
 		if(!features.count(FEATURES::LABEL_SET)) throw exception::AlibException();
 		return Label(parseLabelSetLabel(input));
@@ -32,12 +36,12 @@ Label LabelFromXMLParser::parseLabel(std::list<sax::Token>& input, const std::se
 		if(!features.count(FEATURES::LABEL_PAIR)) throw exception::AlibException();
 		return Label(parseLabelPairLabel(input));
 	} else {
-		throw sax::ParserException(sax::Token("IntegerLabel, StringLabel, CharacterLabel, LabelSetLabel, LabelPairLabel", sax::Token::TokenType::START_ELEMENT), input.front());
+		throw sax::ParserException(sax::Token("IntegerLabel, StringLabel, CharacterLabel, ObjectLabel, LabelSetLabel, LabelPairLabel", sax::Token::TokenType::START_ELEMENT), input.front());
 	}
 }
 
 bool LabelFromXMLParser::first(std::list<sax::Token>& input) const {
-	if(isToken(input, sax::Token::TokenType::START_ELEMENT, "IntegerLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "StringLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "CharacterLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "LabelSetLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "LabelPairLabel")) {
+	if(isToken(input, sax::Token::TokenType::START_ELEMENT, "IntegerLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "StringLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "CharacterLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "ObjectLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "LabelSetLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "LabelPairLabel")) {
 		return true;
 	} else {
 		return false;
@@ -65,6 +69,13 @@ StringLabel LabelFromXMLParser::parseStringLabel(std::list<sax::Token>& input) c
 	return data;
 }
 
+ObjectLabel LabelFromXMLParser::parseObjectLabel(std::list<sax::Token>& input) const {
+	popToken(input, sax::Token::TokenType::START_ELEMENT, "ObjectLabel");
+	ObjectLabel data(alib::api<alib::Object>::parse(input));
+	popToken(input, sax::Token::TokenType::END_ELEMENT, "ObjectLabel");
+	return data;
+}
+
 LabelSetLabel LabelFromXMLParser::parseLabelSetLabel(std::list<sax::Token>& input) const {
 	popToken(input, sax::Token::TokenType::START_ELEMENT, "LabelSetLabel");
 	std::set<Label> labels;
diff --git a/alib2data/src/label/LabelFromXMLParser.h b/alib2data/src/label/LabelFromXMLParser.h
index 6aed29fc63..6452b69067 100644
--- a/alib2data/src/label/LabelFromXMLParser.h
+++ b/alib2data/src/label/LabelFromXMLParser.h
@@ -16,6 +16,7 @@
 #include "StringLabel.h"
 #include "IntegerLabel.h"
 #include "CharacterLabel.h"
+#include "ObjectLabel.h"
 #include "LabelSetLabel.h"
 #include "LabelPairLabel.h"
 #include "../sax/Token.h"
@@ -39,6 +40,7 @@ class LabelFromXMLParser : public sax::FromXMLParserHelper {
 	IntegerLabel parseIntegerLabel(std::list<sax::Token>& input) const;
 	CharacterLabel parseCharacterLabel(std::list<sax::Token>& input) const;
 	StringLabel parseStringLabel(std::list<sax::Token>& input) const;
+	ObjectLabel parseObjectLabel(std::list<sax::Token>& input) const;
 	LabelSetLabel parseLabelSetLabel(std::list<sax::Token>& input) const;
 	LabelPairLabel parseLabelPairLabel(std::list<sax::Token>& input) const;
 
diff --git a/alib2data/src/label/LabelToStringComposer.cpp b/alib2data/src/label/LabelToStringComposer.cpp
index 9023693bfa..97f8f7df93 100644
--- a/alib2data/src/label/LabelToStringComposer.cpp
+++ b/alib2data/src/label/LabelToStringComposer.cpp
@@ -13,6 +13,8 @@
 #include "LabelSetLabel.h"
 #include "LabelPairLabel.h"
 
+#include "../exception/AlibException.h"
+
 namespace label {
 
 void LabelToStringComposer::Visit(void* userData, const label::StringLabel& label) {
@@ -43,6 +45,10 @@ void LabelToStringComposer::Visit(void* userData, const IntegerLabel& label) {
 	out << label.getData();
 }
 
+void LabelToStringComposer::Visit(void*, const ObjectLabel&) {
+	throw exception::AlibException("Unsupported type in conversion to string (ObjectLabel)");
+}
+
 void LabelToStringComposer::Visit(void* userData, const LabelSetLabel& label) {
 	std::stringstream &out = *((std::stringstream*) userData);
 
diff --git a/alib2data/src/label/LabelToStringComposer.h b/alib2data/src/label/LabelToStringComposer.h
index ea86b8e058..361289bdec 100644
--- a/alib2data/src/label/LabelToStringComposer.h
+++ b/alib2data/src/label/LabelToStringComposer.h
@@ -21,6 +21,7 @@ class LabelToStringComposer : public VisitableLabelBase::visitor_type {
 	void Visit(void*, const IntegerLabel& label);
 	void Visit(void*, const StringLabel& label);
 	void Visit(void*, const CharacterLabel& label);
+	void Visit(void*, const ObjectLabel& label);
 	void Visit(void*, const LabelSetLabel& label);
 	void Visit(void*, const LabelPairLabel& label);
 public:
diff --git a/alib2data/src/label/LabelToXMLComposer.cpp b/alib2data/src/label/LabelToXMLComposer.cpp
index ba7131b9b4..7376275be3 100644
--- a/alib2data/src/label/LabelToXMLComposer.cpp
+++ b/alib2data/src/label/LabelToXMLComposer.cpp
@@ -6,9 +6,6 @@
  */
 
 #include "LabelToXMLComposer.h"
-#include "IntegerLabel.h"
-#include "StringLabel.h"
-#include "CharacterLabel.h"
 #include "../std/itos.h"
 
 #include "../Api.hpp"
@@ -51,6 +48,14 @@ std::list<sax::Token> LabelToXMLComposer::compose(const StringLabel& label) cons
 	return out;
 }
 
+std::list<sax::Token> LabelToXMLComposer::compose(const ObjectLabel& label) const {
+	std::list<sax::Token> out;
+	out.push_back(sax::Token("ObjectLabel", sax::Token::TokenType::START_ELEMENT));
+	out.splice(out.end(), alib::api<alib::Object>::compose(label.getData()));
+	out.push_back(sax::Token("ObjectLabel", sax::Token::TokenType::END_ELEMENT));
+	return out;
+}
+
 std::list<sax::Token> LabelToXMLComposer::compose(const LabelSetLabel& label) const {
 	std::list<sax::Token> out;
 	out.push_back(sax::Token("LabelSetLabel", sax::Token::TokenType::START_ELEMENT));
diff --git a/alib2data/src/label/LabelToXMLComposer.h b/alib2data/src/label/LabelToXMLComposer.h
index 7259b30c4e..7a1b9f2b7c 100644
--- a/alib2data/src/label/LabelToXMLComposer.h
+++ b/alib2data/src/label/LabelToXMLComposer.h
@@ -42,6 +42,7 @@ class LabelToXMLComposer {
 	std::list<sax::Token> compose(const StringLabel& label) const;
 	std::list<sax::Token> compose(const IntegerLabel& label) const;
 	std::list<sax::Token> compose(const CharacterLabel& label) const;
+	std::list<sax::Token> compose(const ObjectLabel& label) const;
 	std::list<sax::Token> compose(const LabelSetLabel& label) const;
 	std::list<sax::Token> compose(const LabelPairLabel& label) const;
 
diff --git a/alib2data/src/label/NextLabel.cpp b/alib2data/src/label/NextLabel.cpp
index 377ff424f3..ad56b2774c 100644
--- a/alib2data/src/label/NextLabel.cpp
+++ b/alib2data/src/label/NextLabel.cpp
@@ -32,6 +32,10 @@ void NextLabel::Visit(void* userData, const StringLabel& label) {
 	out = new Label(StringLabel(label.getData() + '\''));
 }
 
+void NextLabel::Visit(void*, const ObjectLabel&) {
+	throw exception::AlibException("LabelSet has no next Label.");
+}
+
 void NextLabel::Visit(void*, const LabelSetLabel&) {
 	throw exception::AlibException("LabelSet has no next Label.");
 }
diff --git a/alib2data/src/label/NextLabel.h b/alib2data/src/label/NextLabel.h
index 67a4fdc610..6e47e85164 100644
--- a/alib2data/src/label/NextLabel.h
+++ b/alib2data/src/label/NextLabel.h
@@ -21,6 +21,7 @@ class NextLabel : public VisitableLabelBase::visitor_type {
 	void Visit(void*, const StringLabel& label);
 	void Visit(void*, const IntegerLabel& label);
 	void Visit(void*, const CharacterLabel& label);
+	void Visit(void*, const ObjectLabel& label);
 	void Visit(void*, const LabelSetLabel& label);
 	void Visit(void*, const LabelPairLabel& label);
 
diff --git a/alib2data/src/label/ObjectLabel.cpp b/alib2data/src/label/ObjectLabel.cpp
new file mode 100644
index 0000000000..a4dedcf4d4
--- /dev/null
+++ b/alib2data/src/label/ObjectLabel.cpp
@@ -0,0 +1,57 @@
+/*
+ * ObjectLabel.cpp
+ *
+ *  Created on: Mar 26, 2013
+ *      Author:Jan Travnicek 
+ */
+
+#include "ObjectLabel.h"
+
+namespace label {
+
+ObjectLabel::ObjectLabel(const alib::Object& label) : label(label) {
+
+}
+
+LabelBase* ObjectLabel::clone() const {
+	return new ObjectLabel(*this);
+}
+
+LabelBase* ObjectLabel::plunder() && {
+	return new ObjectLabel(std::move(*this));
+}
+
+const alib::Object& ObjectLabel::getData() const {
+	return label;
+}
+
+bool ObjectLabel::operator <(const alib::ObjectBase& other) const {
+	return other > *this;
+}
+
+bool ObjectLabel::operator ==(const alib::ObjectBase& other) const {
+	return other == *this;
+}
+
+bool ObjectLabel::operator >(const alib::ObjectBase& other) const {
+	return other < *this;
+}
+
+bool ObjectLabel::operator <(const ObjectLabel& other) const {
+	return label < other.label;
+}
+
+bool ObjectLabel::operator ==(const ObjectLabel& other) const {
+	return label == other.label;
+}
+
+void ObjectLabel::operator>>(std::ostream& out) const {
+	out << "(ObjectLabel " << label << ")";
+}
+
+ObjectLabel::operator std::string() const {
+	return (std::string) label;
+}
+
+} /* namespace label */
+
diff --git a/alib2data/src/label/ObjectLabel.h b/alib2data/src/label/ObjectLabel.h
new file mode 100644
index 0000000000..c5f9f2fe62
--- /dev/null
+++ b/alib2data/src/label/ObjectLabel.h
@@ -0,0 +1,61 @@
+/*
+ * ObjectLabel.h
+ *
+ *  Created on: Mar 26, 2013
+ *      Author: Jan Travnicek
+ */
+
+#ifndef OBJECT_LABEL_H_
+#define OBJECT_LABEL_H_
+
+#include <ostream>
+
+#include "LabelBase.h"
+#include "../object/Object.h"
+
+namespace label {
+
+/**
+ * Represents symbol in an alphabet.
+ */
+class ObjectLabel : public std::acceptor<ObjectLabel, VisitableLabelBase, std::acceptor<ObjectLabel, alib::VisitableObjectBase, LabelBase> > {
+protected:
+	alib::Object label;
+public:
+	virtual LabelBase* clone() const;
+
+	virtual LabelBase* plunder() &&;
+
+	/**
+	 * Creates new symbol with given name.
+	 * @param symbol name of the symbol
+	 */
+	explicit ObjectLabel(const alib::Object& label);
+
+	virtual bool operator<(const alib::ObjectBase& other) const;
+	
+	virtual bool operator>(const alib::ObjectBase& other) const;
+
+	virtual bool operator==(const alib::ObjectBase& other) const;
+
+	/**
+	 * @return name of the symbol
+	 */
+	const alib::Object& getData() const;
+
+	virtual bool operator <(const ObjectLabel& other) const;
+	
+	virtual bool operator ==(const ObjectLabel& other) const;
+	
+	virtual void operator>>(std::ostream&) const;
+
+	virtual operator std::string() const;
+
+	virtual int selfTypeId() const {
+		return typeId(*this);
+	}
+};
+
+} /* namespace label */
+
+#endif /* OBJECT_LABEL_H_ */
diff --git a/alib2data/src/object/ObjectBase.h b/alib2data/src/object/ObjectBase.h
index 9116b8c38f..b9c9b95391 100644
--- a/alib2data/src/object/ObjectBase.h
+++ b/alib2data/src/object/ObjectBase.h
@@ -60,6 +60,7 @@ namespace label {
 class StringLabel;
 class IntegerLabel;
 class CharacterLabel;
+class ObjectLabel;
 class LabelSetLabel;
 class LabelPairLabel;
 
@@ -112,7 +113,7 @@ typedef std::acceptor_base<
 			exception::AlibException,
 			automaton::UnknownAutomaton, automaton::DFA, automaton::NFA, automaton::EpsilonNFA, automaton::CompactNFA, automaton::ExtendedNFA, automaton::DPDA, automaton::SinglePopDPDA, automaton::InputDrivenNPDA, automaton::VisiblyPushdownNPDA, automaton::RealTimeHeightDeterministicNPDA, automaton::NPDA, automaton::SinglePopNPDA, automaton::OneTapeDTM,
 			grammar::UnknownGrammar, grammar::LeftLG, grammar::LeftRG, grammar::RightLG, grammar::RightRG, grammar::LG, grammar::CFG, grammar::EpsilonFreeCFG, grammar::CNF, grammar::GNF, grammar::CSG, grammar::NonContractingGrammar, grammar::ContextPreservingUnrestrictedGrammar, grammar::UnrestrictedGrammar,
-			label::StringLabel, label::IntegerLabel, label::CharacterLabel, label::LabelSetLabel, label::LabelPairLabel,
+			label::StringLabel, label::IntegerLabel, label::CharacterLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel,
 			regexp::UnboundedRegExp, regexp::FormalRegExp,
 			string::Epsilon, string::LinearString, string::CyclicString,
 			alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol,
@@ -126,7 +127,7 @@ class ObjectBase :
 			exception::AlibException,
 			automaton::UnknownAutomaton, automaton::DFA, automaton::NFA, automaton::EpsilonNFA, automaton::CompactNFA, automaton::ExtendedNFA, automaton::DPDA, automaton::SinglePopDPDA, automaton::InputDrivenNPDA, automaton::VisiblyPushdownNPDA, automaton::RealTimeHeightDeterministicNPDA, automaton::NPDA, automaton::SinglePopNPDA, automaton::OneTapeDTM,
 			grammar::UnknownGrammar, grammar::LeftLG, grammar::LeftRG, grammar::RightLG, grammar::RightRG, grammar::LG, grammar::CFG, grammar::EpsilonFreeCFG, grammar::CNF, grammar::GNF, grammar::CSG, grammar::NonContractingGrammar, grammar::ContextPreservingUnrestrictedGrammar, grammar::UnrestrictedGrammar,
-			label::StringLabel, label::IntegerLabel, label::CharacterLabel, label::LabelSetLabel, label::LabelPairLabel,
+			label::StringLabel, label::IntegerLabel, label::CharacterLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel,
 			regexp::UnboundedRegExp, regexp::FormalRegExp,
 			string::Epsilon, string::LinearString, string::CyclicString,
 			alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol,
-- 
GitLab