From efea7e7874e3105edad6d6949189029a755ca17c Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Fri, 20 Jun 2014 15:03:14 +0200
Subject: [PATCH] refactor parsers and composers

---
 alib2/src/alphabet/SymbolFeatures.h           |  21 +
 alib2/src/alphabet/SymbolFromStringParser.cpp |  55 +-
 alib2/src/alphabet/SymbolFromStringParser.h   |  20 +-
 alib2/src/alphabet/SymbolFromXMLParser.cpp    |  52 +-
 alib2/src/alphabet/SymbolFromXMLParser.h      |  43 +-
 .../src/automaton/AutomatonFromXMLParser.cpp  |  18 +
 alib2/src/automaton/AutomatonFromXMLParser.h  |   5 +-
 alib2/src/factory/AutomatonFactory.cpp        |   2 +-
 alib2/src/factory/LabelFactory.cpp            |   2 +-
 alib2/src/factory/RegExpFactory.cpp           |   2 +-
 alib2/src/factory/StringFactory.cpp           |   2 +-
 alib2/src/factory/SymbolFactory.cpp           |   2 +-
 alib2/src/label/LabelFeatures.h               |  21 +
 alib2/src/label/LabelFromStringParser.cpp     |  52 +-
 alib2/src/label/LabelFromStringParser.h       |  31 +-
 alib2/src/label/LabelFromXMLParser.cpp        |  33 +-
 alib2/src/label/LabelFromXMLParser.h          |  39 +-
 alib2/src/regexp/RegExpFromStringParser.cpp   | 160 +++---
 alib2/src/regexp/RegExpFromStringParser.h     |   5 +-
 alib2/src/regexp/RegExpFromXMLParser.cpp      |  54 +-
 alib2/src/regexp/RegExpFromXMLParser.h        |   5 +-
 alib2/src/regexp/RegExpToXMLComposer.cpp      |  10 +-
 alib2/src/string/String.cpp                   |  14 +-
 alib2/src/string/StringFromStringParser.cpp   |  51 +-
 alib2/src/string/StringFromStringParser.h     |   6 +-
 alib2/src/string/StringFromXMLParser.cpp      |  68 ++-
 alib2/src/string/StringFromXMLParser.h        |   9 +-
 alib2/src/string/StringToXMLComposer.cpp      |  26 +-
 alib2/src/string/StringToXMLComposer.h        |   1 -
 alib2/test-src/alphabet/SymbolTest.cpp        | 452 +----------------
 alib2/test-src/alphabet/SymbolTest.h          |   2 -
 alib2/test-src/label/LabelTest.cpp            |  14 +-
 alib2/test-src/regexp/RegExpTest.cpp          |  14 +-
 alib2/test-src/string/StringTest.cpp          | 470 +-----------------
 alib2/test-src/string/StringTest.h            |   4 -
 35 files changed, 604 insertions(+), 1161 deletions(-)
 create mode 100644 alib2/src/alphabet/SymbolFeatures.h
 create mode 100644 alib2/src/label/LabelFeatures.h

diff --git a/alib2/src/alphabet/SymbolFeatures.h b/alib2/src/alphabet/SymbolFeatures.h
new file mode 100644
index 0000000000..2219a4fb01
--- /dev/null
+++ b/alib2/src/alphabet/SymbolFeatures.h
@@ -0,0 +1,21 @@
+/*
+ * LabelFeatures.h
+ *
+ *  Created on: Jun 19, 2014
+ *      Author: Jan Travnicek
+ */
+
+#ifndef LABEL_FEATURES_H_
+#define LABEL_FEATURES_H_
+
+namespace label {
+
+enum class FEATURES {
+	LABELED_SYMBOL,
+	BLANK_SYMBOL,
+	BOTTOM_OF_THE_STACK_SYMBOL
+};
+
+} /* namespace label */
+
+#endif /* LABEL_FEATURES_H_ */
diff --git a/alib2/src/alphabet/SymbolFromStringParser.cpp b/alib2/src/alphabet/SymbolFromStringParser.cpp
index 66a8635e1d..527fe7795f 100644
--- a/alib2/src/alphabet/SymbolFromStringParser.cpp
+++ b/alib2/src/alphabet/SymbolFromStringParser.cpp
@@ -10,40 +10,51 @@ SymbolFromStringParser::SymbolFromStringParser(std::stringstream& input) : m_Sym
 
 }
 
-Symbol* SymbolFromStringParser::parse() {
-	SymbolFromStringLexer::Token token = m_SymbolLexer.next().token();
+Symbol SymbolFromStringParser::parse() {
+	SymbolFromStringLexer::Token token = m_SymbolLexer.token();
 	switch(token.type) {
 	case SymbolFromStringLexer::TokenType::BLANK:
-		return new Symbol(BlankSymbol());
+		return Symbol(BlankSymbol());
 	case SymbolFromStringLexer::TokenType::BOTTOM:
-		return new Symbol(BottomOfTheStackSymbol());
-	case SymbolFromStringLexer::TokenType::ERROR: {
-		label::Label* label = m_LabelParser.parse();
-		if(label != NULL) {
-			Symbol* res = new Symbol(LabeledSymbol(std::move(*label)));
-			delete label;
-			return res;
-		} else
-			return NULL;
-	}
+		return Symbol(BottomOfTheStackSymbol());
+	case SymbolFromStringLexer::TokenType::ERROR:
+		return Symbol(LabeledSymbol(m_LabelParser.parse()));
 	case SymbolFromStringLexer::TokenType::TEOF:
-		return NULL;
+		throw alib::AlibException();
 	}
-	return NULL;
+	throw alib::AlibException();
 }
 
-Symbol SymbolFromStringParser::parseSymbol() {
-	Symbol* symbol = parse();
-
+Symbol SymbolFromStringParser::parseValue() {
 	SymbolFromStringLexer::Token token = m_SymbolLexer.next().token();
-	if(token.type == SymbolFromStringLexer::TokenType::TEOF && symbol != NULL) {
-		Symbol res = std::move(*symbol);
-		delete symbol;
+	if(token.type == SymbolFromStringLexer::TokenType::ERROR) {
+		m_LabelParser.m_Lexer.next();
+	}
+	Symbol res = parse();
+
+	token = m_SymbolLexer.next().token();
+	if(token.type == SymbolFromStringLexer::TokenType::TEOF) {
 		return std::move(res);
 	} else {
-		delete symbol;
 		throw alib::AlibException();
 	}
 }
 
+Symbol* SymbolFromStringParser::parsePointer() {
+	SymbolFromStringLexer::Token token = m_SymbolLexer.next().token();
+	if(token.type == SymbolFromStringLexer::TokenType::BLANK || token.type == SymbolFromStringLexer::TokenType::BOTTOM) {
+		return new Symbol(parse());
+	} else if(token.type == SymbolFromStringLexer::TokenType::ERROR) {
+		label::LabelFromStringLexer::Token token2 = m_LabelParser.m_Lexer.next().token();
+		if(token2.type == label::LabelFromStringLexer::TokenType::STRING || token2.type == label::LabelFromStringLexer::TokenType::CHAR || token2.type == label::LabelFromStringLexer::TokenType::INTEGER) {
+			return new Symbol(parse());
+		} else {
+			return NULL;
+		}
+	} else {
+		return NULL;
+	}
+
+}
+
 } /* namespace alphabet */
diff --git a/alib2/src/alphabet/SymbolFromStringParser.h b/alib2/src/alphabet/SymbolFromStringParser.h
index 4cc7d589f8..6115aef72d 100644
--- a/alib2/src/alphabet/SymbolFromStringParser.h
+++ b/alib2/src/alphabet/SymbolFromStringParser.h
@@ -14,6 +14,18 @@
 #include "SymbolFromStringLexer.h"
 #include "../label/LabelFromStringParser.h"
 
+namespace string {
+
+class StringFromStringParser;
+
+} /* namespace alphabet */
+
+namespace regexp {
+
+class RegExpFromStringParser;
+
+} /* namespace regexp */
+
 namespace alphabet {
 
 class SymbolFromStringParser {
@@ -21,11 +33,13 @@ class SymbolFromStringParser {
 	
 	SymbolFromStringLexer m_SymbolLexer;
 	label::LabelFromStringParser m_LabelParser;
+	Symbol* parsePointer();
+	Symbol parse();
 public:
 	SymbolFromStringParser(std::stringstream&);
-	Symbol* parse();
-	Symbol parseSymbol();
-
+	Symbol parseValue();
+	friend class string::StringFromStringParser;
+	friend class regexp::RegExpFromStringParser;
 };
 
 } /* namespace alphabet */
diff --git a/alib2/src/alphabet/SymbolFromXMLParser.cpp b/alib2/src/alphabet/SymbolFromXMLParser.cpp
index 650cd201cc..903d8fb56a 100644
--- a/alib2/src/alphabet/SymbolFromXMLParser.cpp
+++ b/alib2/src/alphabet/SymbolFromXMLParser.cpp
@@ -19,20 +19,50 @@ namespace alphabet {
 
 Symbol SymbolFromXMLParser::parse(std::list<sax::Token>& input) const {
 	if(isToken(input, sax::Token::TokenType::START_ELEMENT, "LabeledSymbol")) {
-		popToken(input, sax::Token::TokenType::START_ELEMENT, "LabeledSymbol");
-		label::Label data = alib::FromXMLParsers::labelParser.parse(input);
-		popToken(input, sax::Token::TokenType::END_ELEMENT, "LabeledSymbol");
-		return Symbol(LabeledSymbol(data));
+		return parseLabeledSymbol(input);
 	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "BlankSymbol")) {
-		popToken(input, sax::Token::TokenType::START_ELEMENT, "BlankSymbol");
-		popToken(input, sax::Token::TokenType::END_ELEMENT, "BlankSymbol");
-		return Symbol(BlankSymbol());
+		return parseBlankSymbol(input);
 	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "BottomOfTheStackSymbol")) {
-		popToken(input, sax::Token::TokenType::START_ELEMENT, "BottomOfTheStackSymbol");
-		popToken(input, sax::Token::TokenType::END_ELEMENT, "BottomOfTheStackSymbol");
-		return Symbol(BlankSymbol());
+		return parseBlankSymbol(input);
 	} else {
-		throw sax::ParserException(sax::Token("", sax::Token::TokenType::START_ELEMENT), input.front());
+		throw sax::ParserException(sax::Token("LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol", sax::Token::TokenType::START_ELEMENT), input.front());
+	}
+}
+
+Symbol SymbolFromXMLParser::parseLabeledSymbol(std::list<sax::Token>& input) const {
+	popToken(input, sax::Token::TokenType::START_ELEMENT, "LabeledSymbol");
+	label::Label data = alib::FromXMLParsers::labelParser.parse(input);
+	popToken(input, sax::Token::TokenType::END_ELEMENT, "LabeledSymbol");
+	return Symbol(LabeledSymbol(data));
+}
+
+Symbol SymbolFromXMLParser::parseBlankSymbol(std::list<sax::Token>& input) const {
+	popToken(input, sax::Token::TokenType::START_ELEMENT, "BlankSymbol");
+	popToken(input, sax::Token::TokenType::END_ELEMENT, "BlankSymbol");
+	return Symbol(BlankSymbol());
+}
+
+Symbol SymbolFromXMLParser::parseBottomOfTheStackSymbol(std::list<sax::Token>& input) const {
+	popToken(input, sax::Token::TokenType::START_ELEMENT, "BottomOfTheStackSymbol");
+	popToken(input, sax::Token::TokenType::END_ELEMENT, "BottomOfTheStackSymbol");
+	return Symbol(BottomOfTheStackSymbol());
+}
+
+Symbol SymbolFromXMLParser::parseValue(std::list<sax::Token>& input) const {
+	Symbol res = parse(input);
+
+	if(input.size() == 0) {
+		return res;
+	} else {
+		throw alib::AlibException();
+	}
+}
+
+Symbol* SymbolFromXMLParser::parsePointer(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")) {
+		return new Symbol(parse(input));
+	} else {
+		return NULL;
 	}
 }
 
diff --git a/alib2/src/alphabet/SymbolFromXMLParser.h b/alib2/src/alphabet/SymbolFromXMLParser.h
index 17089602eb..0761c30f8c 100644
--- a/alib2/src/alphabet/SymbolFromXMLParser.h
+++ b/alib2/src/alphabet/SymbolFromXMLParser.h
@@ -14,21 +14,54 @@
 #include "../sax/Token.h"
 #include "../label/Label.h"
 
+namespace string {
+
+class StringFromXMLParser;
+
+} /* namespace alphabet */
+
+namespace regexp {
+
+class RegExpFromXMLParser;
+
+} /* namespace regexp */
+
+namespace automaton {
+
+class AutomatonFromXMLParser;
+
+} /* namespace automaton */
+
 namespace alphabet {
 
 /**
  * Parser used to get String from XML parsed into list of tokens.
  */
 class SymbolFromXMLParser : public sax::FromXMLParser {
+	Symbol parse(std::list<sax::Token>& input) const;
+
+	Symbol parseLabeledSymbol(std::list<sax::Token>& input) const;
+	Symbol parseBlankSymbol(std::list<sax::Token>& input) const;
+	Symbol parseBottomOfTheStackSymbol(std::list<sax::Token>& input) const;
+	/**
+	 * Parses the XML tokens and returns symbol. The input is destroyed in the process.
+	 * @param input XML tokens represented as list of tokens
+	 * @return Symbol* the parsed symbol or NULL when by first token it is not a symbol
+	 * @throws ParserException when tokens do not represent Symbol but first token seemd as a symbol
+	 */
+	Symbol* parsePointer(std::list<sax::Token>& input) const;
 public:
 	/**
-	 * Parses the XML and returns regular expression. The input is destroyed in the process.
-	 * @param input XML represented as list of tokens
-	 * @return String
-	 * @throws ParserException when an error occurs
+	 * Parses the XML tokens and returns symbol. The input is destroyed in the process.
+	 * @param input XML tokens represented as list of tokens
+	 * @return Symbol the parsed symbol
+	 * @throws ParserException when tokens do not represent Symbol
 	 */
-	Symbol parse(std::list<sax::Token>& input) const;
+	Symbol parseValue(std::list<sax::Token>& input) const;
 
+	friend class string::StringFromXMLParser;
+	friend class regexp::RegExpFromXMLParser;
+	friend class automaton::AutomatonFromXMLParser;
 };
 
 } /* namespace alphabet */
diff --git a/alib2/src/automaton/AutomatonFromXMLParser.cpp b/alib2/src/automaton/AutomatonFromXMLParser.cpp
index 12d149bb70..7cd16f866f 100644
--- a/alib2/src/automaton/AutomatonFromXMLParser.cpp
+++ b/alib2/src/automaton/AutomatonFromXMLParser.cpp
@@ -15,6 +15,24 @@
 
 namespace automaton {
 
+Automaton AutomatonFromXMLParser::parseValue(std::list<sax::Token>& input) const {
+	Automaton res = parse(input);
+
+	if(input.size() == 0) {
+		return res;
+	} else {
+		throw alib::AlibException();
+	}
+}
+
+Automaton* AutomatonFromXMLParser::parsePointer(std::list<sax::Token>& input) const {
+	if(isToken(input, sax::Token::TokenType::START_ELEMENT, "automaton") || isToken(input, sax::Token::TokenType::START_ELEMENT, "EpsilonNFA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "NFA") || isToken(input, sax::Token::TokenType::START_ELEMENT, "DFA")) {
+		return new Automaton(parse(input));
+	} else {
+		return NULL;
+	}
+}
+
 Automaton AutomatonFromXMLParser::parse(std::list<sax::Token> &input) const {
 	if(isToken(input, sax::Token::TokenType::START_ELEMENT, "automaton"))
 		return Automaton(parseUnknownAutomaton(input));
diff --git a/alib2/src/automaton/AutomatonFromXMLParser.h b/alib2/src/automaton/AutomatonFromXMLParser.h
index cda6323585..743242e006 100644
--- a/alib2/src/automaton/AutomatonFromXMLParser.h
+++ b/alib2/src/automaton/AutomatonFromXMLParser.h
@@ -61,6 +61,9 @@ protected:
 
 	alphabet::Symbol parseSymbolIO(std::list<sax::Token> &input) const;
 	std::variant<string::Epsilon, alphabet::Symbol> parseEpsilonSymbolIO(std::list<sax::Token> &input) const;
+
+	Automaton parse(std::list<sax::Token>& input) const;
+	Automaton* parsePointer(std::list<sax::Token>& input) const;
 public:
 	/**
 	 * Parses the xml and returns the automaton. The input is destroyed in the process.
@@ -68,7 +71,7 @@ public:
 	 * @return UnknownAutomaton
 	 * @throws ParserException when an error occurs
 	 */
-	Automaton parse(std::list<sax::Token> &input) const;
+	Automaton parseValue(std::list<sax::Token> &input) const;
 
 	UnknownAutomaton parseUnknownAutomaton(std::list<sax::Token>& input) const;
 	EpsilonNFA parseEpsilonNFA(std::list<sax::Token>& input) const;
diff --git a/alib2/src/factory/AutomatonFactory.cpp b/alib2/src/factory/AutomatonFactory.cpp
index 8840a7e576..5c9db6d2f9 100644
--- a/alib2/src/factory/AutomatonFactory.cpp
+++ b/alib2/src/factory/AutomatonFactory.cpp
@@ -36,7 +36,7 @@ Automaton AutomatonFactory::fromStream(std::istream& in) {
 }
 
 Automaton AutomatonFactory::parse(std::list<sax::Token> tokens) {
-	return alib::FromXMLParsers::automatonParser.parse(tokens);
+	return alib::FromXMLParsers::automatonParser.parseValue(tokens);
 }
 
 void AutomatonFactory::toFile(const Automaton& automaton, const std::string& filename) {
diff --git a/alib2/src/factory/LabelFactory.cpp b/alib2/src/factory/LabelFactory.cpp
index f3f60ec401..806f3c8092 100644
--- a/alib2/src/factory/LabelFactory.cpp
+++ b/alib2/src/factory/LabelFactory.cpp
@@ -36,7 +36,7 @@ Label LabelFactory::fromStream(std::istream& in) {
 }
 
 Label LabelFactory::parse(std::list<sax::Token> tokens) {
-	return alib::FromXMLParsers::labelParser.parse(tokens);
+	return alib::FromXMLParsers::labelParser.parseValue(tokens);
 }
 
 void LabelFactory::toFile(const Label& symbol, const std::string& filename) {
diff --git a/alib2/src/factory/RegExpFactory.cpp b/alib2/src/factory/RegExpFactory.cpp
index 72235a3002..26ff3043f5 100644
--- a/alib2/src/factory/RegExpFactory.cpp
+++ b/alib2/src/factory/RegExpFactory.cpp
@@ -36,7 +36,7 @@ RegExp RegExpFactory::fromStream(std::istream& in) {
 }
 
 RegExp RegExpFactory::parse(std::list<sax::Token> tokens) {
-	return alib::FromXMLParsers::regexpParser.parse(tokens);
+	return alib::FromXMLParsers::regexpParser.parseValue(tokens);
 }
 
 void RegExpFactory::toFile(const RegExp& regexp, const std::string& filename) {
diff --git a/alib2/src/factory/StringFactory.cpp b/alib2/src/factory/StringFactory.cpp
index 13ff353bf2..008d49552c 100644
--- a/alib2/src/factory/StringFactory.cpp
+++ b/alib2/src/factory/StringFactory.cpp
@@ -36,7 +36,7 @@ String StringFactory::fromStream(std::istream& in) {
 }
 
 String StringFactory::parse(std::list<sax::Token> tokens) {
-	return alib::FromXMLParsers::stringParser.parse(tokens);
+	return alib::FromXMLParsers::stringParser.parseValue(tokens);
 }
 
 void StringFactory::toFile(const String& string, const std::string& filename) {
diff --git a/alib2/src/factory/SymbolFactory.cpp b/alib2/src/factory/SymbolFactory.cpp
index d007df997c..cd80ca0a3d 100644
--- a/alib2/src/factory/SymbolFactory.cpp
+++ b/alib2/src/factory/SymbolFactory.cpp
@@ -36,7 +36,7 @@ Symbol SymbolFactory::fromStream(std::istream& in) {
 }
 
 Symbol SymbolFactory::parse(std::list<sax::Token> tokens) {
-	return alib::FromXMLParsers::symbolParser.parse(tokens);
+	return alib::FromXMLParsers::symbolParser.parseValue(tokens);
 }
 
 void SymbolFactory::toFile(const Symbol& symbol, const std::string& filename) {
diff --git a/alib2/src/label/LabelFeatures.h b/alib2/src/label/LabelFeatures.h
new file mode 100644
index 0000000000..d821ce879a
--- /dev/null
+++ b/alib2/src/label/LabelFeatures.h
@@ -0,0 +1,21 @@
+/*
+ * LabelFeatures.h
+ *
+ *  Created on: Jun 19, 2014
+ *      Author: Jan Travnicek
+ */
+
+#ifndef LABEL_FEATURES_H_
+#define LABEL_FEATURES_H_
+
+namespace label {
+
+enum class FEATURES {
+	STRING,
+	CHAR,
+	INTEGER
+};
+
+} /* namespace label */
+
+#endif /* LABEL_FEATURES_H_ */
diff --git a/alib2/src/label/LabelFromStringParser.cpp b/alib2/src/label/LabelFromStringParser.cpp
index d172aef6bc..908a47125f 100644
--- a/alib2/src/label/LabelFromStringParser.cpp
+++ b/alib2/src/label/LabelFromStringParser.cpp
@@ -11,32 +11,48 @@ LabelFromStringParser::LabelFromStringParser(std::stringstream& input) : m_Lexer
 
 }
 
-Label* LabelFromStringParser::parse() {
+Label LabelFromStringParser::parse() {
+	return parse(std::set<FEATURES>({FEATURES::STRING, FEATURES::CHAR, FEATURES::INTEGER}));
+}
+
+Label LabelFromStringParser::parse(const std::set<FEATURES>& features) {
+	LabelFromStringLexer::Token token = m_Lexer.token();
+	switch(token.type) {
+	case LabelFromStringLexer::TokenType::TEOF:
+		throw alib::AlibException();
+	case LabelFromStringLexer::TokenType::STRING:
+		if(!features.count(FEATURES::STRING)) throw alib::AlibException();
+		return Label(label::StringLabel(token.value));
+	case LabelFromStringLexer::TokenType::CHAR:
+		if(!features.count(FEATURES::CHAR)) throw alib::AlibException();
+		return Label(label::CharacterLabel(token.value[0]));
+	case LabelFromStringLexer::TokenType::INTEGER:
+		if(!features.count(FEATURES::INTEGER)) throw alib::AlibException();
+		return Label(label::IntegerLabel(std::stoi(token.value)));
+	case LabelFromStringLexer::TokenType::ERROR:
+		break;
+	}
+	throw alib::AlibException();
+}
+
+Label LabelFromStringParser::parseValue() {
+	m_Lexer.next();
+	Label res = parse();
+	
 	LabelFromStringLexer::Token token = m_Lexer.next().token();
 	if(token.type == LabelFromStringLexer::TokenType::TEOF) {
-		return NULL;
-	} else if(token.type == LabelFromStringLexer::TokenType::STRING) {
-		return new label::Label(label::StringLabel(token.value));
-	} else if(token.type == LabelFromStringLexer::TokenType::CHAR) {
-		return new label::Label(label::CharacterLabel(token.value[0]));
-	} else if(token.type == LabelFromStringLexer::TokenType::INTEGER) {
-		return new label::Label(label::IntegerLabel(std::stoi(token.value)));
+		return std::move(res);
 	} else {
-		return NULL;
+		throw alib::AlibException();
 	}
 }
 
-Label LabelFromStringParser::parseLabel() {
-	Label* label = parse();
-
+Label* LabelFromStringParser::parsePointer() {
 	LabelFromStringLexer::Token token = m_Lexer.next().token();
-	if(token.type == LabelFromStringLexer::TokenType::TEOF && label != NULL) {
-		Label res = std::move(*label);
-		delete label;
-		return std::move(res);
+	if(token.type == LabelFromStringLexer::TokenType::STRING || token.type == LabelFromStringLexer::TokenType::CHAR || token.type == LabelFromStringLexer::TokenType::INTEGER) {
+		return new Label(parse());
 	} else {
-		delete label;
-		throw alib::AlibException();
+		return NULL;
 	}
 }
 
diff --git a/alib2/src/label/LabelFromStringParser.h b/alib2/src/label/LabelFromStringParser.h
index 8e2ee7c34b..3b36cdc4a6 100644
--- a/alib2/src/label/LabelFromStringParser.h
+++ b/alib2/src/label/LabelFromStringParser.h
@@ -9,19 +9,44 @@
 #define LABEL_FROM_STRING_PARSER_H_
 
 #include "Label.h"
+#include "LabelFeatures.h"
 #include <vector>
+#include <set>
 
 #include "LabelFromStringLexer.h"
 
+namespace alphabet {
+
+class SymbolFromStringParser;
+
+} /* namespace alphabet */
+
+namespace regexp {
+
+class RegExpFromStringParser;
+
+} /* namespace regexp */
+
+namespace string {
+
+class StringFromStringParser;
+
+} /* namespace string */
+
 namespace label {
 
 class LabelFromStringParser {
 	LabelFromStringLexer m_Lexer;
+	Label parse(const std::set<FEATURES>&);
+	Label parse();
+	Label* parsePointer();
+
 public:
 	LabelFromStringParser(std::stringstream&);
-	Label* parse();
-	Label parseLabel();
-
+	Label parseValue();
+	friend class alphabet::SymbolFromStringParser;
+	friend class regexp::RegExpFromStringParser;
+	friend class string::StringFromStringParser;
 };
 
 } /* namespace label */
diff --git a/alib2/src/label/LabelFromXMLParser.cpp b/alib2/src/label/LabelFromXMLParser.cpp
index 43995a545d..3b7ebdb4ae 100644
--- a/alib2/src/label/LabelFromXMLParser.cpp
+++ b/alib2/src/label/LabelFromXMLParser.cpp
@@ -15,23 +15,48 @@
 namespace label {
 
 Label LabelFromXMLParser::parse(std::list<sax::Token>& input) const {
+	return parse(input, std::set<FEATURES>({FEATURES::STRING, FEATURES::CHAR, FEATURES::INTEGER}));
+}
+
+Label LabelFromXMLParser::parse(std::list<sax::Token>& input, const std::set<FEATURES>& features) const {
 	if(isToken(input, sax::Token::TokenType::START_ELEMENT, "IntegerLabel")) {
+		if(!features.count(FEATURES::INTEGER)) throw alib::AlibException();
 		popToken(input, sax::Token::TokenType::START_ELEMENT, "IntegerLabel");
-		label::Label data = Label(IntegerLabel(std::stoi(popTokenData(input, sax::Token::TokenType::CHARACTER))));
+		Label data(IntegerLabel(std::stoi(popTokenData(input, sax::Token::TokenType::CHARACTER))));
 		popToken(input, sax::Token::TokenType::END_ELEMENT, "IntegerLabel");
 		return data;
 	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "StringLabel")) {
+		if(!features.count(FEATURES::STRING)) throw alib::AlibException();
 		popToken(input, sax::Token::TokenType::START_ELEMENT, "StringLabel");
-		label::Label data = Label(StringLabel(popTokenData(input, sax::Token::TokenType::CHARACTER)));
+		Label data(StringLabel(popTokenData(input, sax::Token::TokenType::CHARACTER)));
 		popToken(input, sax::Token::TokenType::END_ELEMENT, "StringLabel");
 		return data;
 	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "CharacterLabel")) {
+		if(!features.count(FEATURES::CHAR)) throw alib::AlibException();
 		popToken(input, sax::Token::TokenType::START_ELEMENT, "CharacterLabel");
-		label::Label data = Label(CharacterLabel(popTokenData(input, sax::Token::TokenType::CHARACTER)[0]));
+		Label data(CharacterLabel(popTokenData(input, sax::Token::TokenType::CHARACTER)[0]));
 		popToken(input, sax::Token::TokenType::END_ELEMENT, "CharacterLabel");
 		return data;
 	} else {
-		throw sax::ParserException(sax::Token("", sax::Token::TokenType::START_ELEMENT), input.front());
+		throw sax::ParserException(sax::Token("IntegerLabel, StringLabel, CharacterLabel", sax::Token::TokenType::START_ELEMENT), input.front());
+	}
+}
+
+Label LabelFromXMLParser::parseValue(std::list<sax::Token>& input) const {
+	Label label = parse(input);
+
+	if(input.size() == 0) {
+		return std::move(label);
+	} else {
+		throw new alib::AlibException();
+	}
+}
+
+Label* LabelFromXMLParser::parsePointer(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")) {
+		return new Label(parse(input));
+	} else {
+		return NULL;
 	}
 }
 
diff --git a/alib2/src/label/LabelFromXMLParser.h b/alib2/src/label/LabelFromXMLParser.h
index 2f5fa2b02d..4374f6534a 100644
--- a/alib2/src/label/LabelFromXMLParser.h
+++ b/alib2/src/label/LabelFromXMLParser.h
@@ -10,25 +10,50 @@
 
 #include "../sax/FromXMLParser.h"
 #include <vector>
+#include <set>
 #include "Label.h"
+#include "LabelFeatures.h"
 #include "../sax/Token.h"
 #include "../label/Label.h"
 
+namespace alphabet {
+
+class SymbolFromXMLParser;
+
+} /* namespace alphabet */
+
+namespace automaton {
+
+class AutomatonFromXMLParser;
+
+} /* namespace automaton */
+
 namespace label {
 
 /**
- * Parser used to get String from XML parsed into list of tokens.
+ * Parser used to transform sequence of xml tokens to internal representation of Label.
  */
 class LabelFromXMLParser : public sax::FromXMLParser {
+	Label parse(std::list<sax::Token>& input, const std::set<FEATURES>&) const;
+	Label parse(std::list<sax::Token>& input) const;
+
+	/**
+	 * Parses the XML tokens and returns label. The input is destroyed in the process.
+	 * @param input XML tokens represented as list of tokens
+	 * @return Label* the parsed label or NULL when by first token it is not a label
+	 * @throws ParserException when tokens do not represent Label but first token seemd as a label
+	 */
+	Label* parsePointer(std::list<sax::Token>& input) const;
 public:
 	/**
-	 * Parses the XML and returns regular expression. The input is destroyed in the process.
-	 * @param input XML represented as list of tokens
-	 * @return String
-	 * @throws ParserException when an error occurs
+	 * Parses the XML tokens and returns label. The input is destroyed in the process.
+	 * @param input XML tokens represented as list of tokens
+	 * @return Label the parsed label
+	 * @throws ParserException when tokens do not represent Label
 	 */
-	Label parse(std::list<sax::Token>& input) const;
-
+	Label parseValue(std::list<sax::Token>& input) const;
+	friend class alphabet::SymbolFromXMLParser;
+	friend class automaton::AutomatonFromXMLParser;
 };
 
 } /* namespace label */
diff --git a/alib2/src/regexp/RegExpFromStringParser.cpp b/alib2/src/regexp/RegExpFromStringParser.cpp
index 296bfb5a43..d94b4169d4 100644
--- a/alib2/src/regexp/RegExpFromStringParser.cpp
+++ b/alib2/src/regexp/RegExpFromStringParser.cpp
@@ -8,57 +8,81 @@ RegExpFromStringParser::RegExpFromStringParser(std::stringstream& input) : m_Reg
 
 }
 
-RegExp* RegExpFromStringParser::parse() {
-	m_RegexpLexer.next();
+RegExp RegExpFromStringParser::parse() {
 	RegExpElement* element = this->alternation();
-	if(element != NULL) {
-		RegExp* regexp = new RegExp(std::move(*element));
-		delete element;
-		return regexp;
-	} else {
-		return NULL;
-	}
+	RegExp regexp(std::move(*element));
+	delete element;
+	return regexp;
 }
 
-RegExp RegExpFromStringParser::parseRegexp() {
-	RegExp* regexp = parse();
+RegExp RegExpFromStringParser::parseValue() {
+	RegExpFromStringLexer::Token token = m_RegexpLexer.next().token();
+	if(token.type == RegExpFromStringLexer::TokenType::ERROR) {
+		alphabet::SymbolFromStringLexer::Token token = m_SymbolParser.m_SymbolLexer.next().token();
+		if(token.type == alphabet::SymbolFromStringLexer::TokenType::ERROR) {
+			m_SymbolParser.m_LabelParser.m_Lexer.next();
+		}
+	}
+	RegExp res = parse();
 
-	RegExpFromStringLexer::Token token = m_RegexpLexer.token();
-	if(token.type == RegExpFromStringLexer::TokenType::TEOF && regexp != NULL) {
-		RegExp res = std::move(*regexp);
-		delete regexp;
+	token = m_RegexpLexer.token();
+	if(token.type == RegExpFromStringLexer::TokenType::TEOF) {
 		return std::move(res);
 	} else {
-		delete regexp;
 		throw alib::AlibException();
 	}
 }
 
-
-RegExpElement* RegExpFromStringParser::alternation() {
-	RegExpElement* concatenation = this->concatenation();
-	if(concatenation != NULL) {
-		return this->alternationCont(concatenation);
+RegExp* RegExpFromStringParser::parsePointer() {
+	RegExpFromStringLexer::Token token = m_RegexpLexer.next().token();
+	if(token.type == RegExpFromStringLexer::TokenType::EMPTY || token.type == RegExpFromStringLexer::TokenType::EPS || token.type == RegExpFromStringLexer::TokenType::LPAR) {
+		return new RegExp(parse());
+	} else if(token.type == RegExpFromStringLexer::TokenType::ERROR) {
+		alphabet::SymbolFromStringLexer::Token token = m_SymbolParser.m_SymbolLexer.next().token();
+		if(token.type == alphabet::SymbolFromStringLexer::TokenType::BLANK) {
+			return new RegExp(parse());
+		} else if(token.type == alphabet::SymbolFromStringLexer::TokenType::ERROR) {
+			label::LabelFromStringLexer::Token token = m_SymbolParser.m_LabelParser.m_Lexer.next().token();
+			if(token.type == label::LabelFromStringLexer::TokenType::STRING || token.type == label::LabelFromStringLexer::TokenType::CHAR || token.type == label::LabelFromStringLexer::TokenType::INTEGER) {
+				return new RegExp(parse());
+			} else {
+				return NULL;
+			}
+		} else {
+			return NULL;
+		}
 	} else {
 		return NULL;
 	}
+
+}
+
+RegExpElement* RegExpFromStringParser::alternation() {
+	return this->alternationCont(this->concatenation());
 }
 
 RegExpElement* RegExpFromStringParser::alternationCont(RegExpElement* left) {
 	RegExpFromStringLexer::Token token = m_RegexpLexer.token();
 	if(token.type == RegExpFromStringLexer::TokenType::PLUS) {
-		m_RegexpLexer.next();
+		RegExpFromStringLexer::Token token = m_RegexpLexer.next().token();
+		if(token.type == RegExpFromStringLexer::TokenType::ERROR) {
+			alphabet::SymbolFromStringLexer::Token token = m_SymbolParser.m_SymbolLexer.next().token();
+			if(token.type == alphabet::SymbolFromStringLexer::TokenType::ERROR) {
+				m_SymbolParser.m_LabelParser.m_Lexer.next();
+			}
+		}
 
-		RegExpElement* right = this->concatenation();
-		if(right != NULL) {
+		try {
+			RegExpElement* right = this->concatenation();
 			Alternation* res = new Alternation(std::move(*left), std::move(*right));
-
-			delete left;
 			delete right;
+			delete left;
+			left = NULL;
+
 			return this->alternationContCont(res);
-		} else {
+		} catch (...) {
 			delete left;
-			return NULL;
+			throw;
 		}
 	} else {
 		return left;
@@ -68,17 +92,24 @@ RegExpElement* RegExpFromStringParser::alternationCont(RegExpElement* left) {
 RegExpElement* RegExpFromStringParser::alternationContCont(Alternation* res) {
 	RegExpFromStringLexer::Token token = m_RegexpLexer.token();
 	if(token.type == RegExpFromStringLexer::TokenType::PLUS) {
-		m_RegexpLexer.next();
+		RegExpFromStringLexer::Token token = m_RegexpLexer.next().token();
+		if(token.type == RegExpFromStringLexer::TokenType::ERROR) {
+			alphabet::SymbolFromStringLexer::Token token = m_SymbolParser.m_SymbolLexer.next().token();
+			if(token.type == alphabet::SymbolFromStringLexer::TokenType::ERROR) {
+				m_SymbolParser.m_LabelParser.m_Lexer.next();
+			}
+		}
 
-		RegExpElement* next = this->concatenation();
-		if(next != NULL) {
+		try {
+			RegExpElement* next = this->concatenation();
 			res->appendElement(std::move(*next));
 			delete next;
-		} else {
-			return NULL;
-		}
 
-		return this->alternationContCont(res);
+			return this->alternationContCont(res);
+		} catch (...) {
+			delete res;
+			throw;
+		}
 	} else {
 		return res;
 	}
@@ -86,28 +117,24 @@ RegExpElement* RegExpFromStringParser::alternationContCont(Alternation* res) {
 
 
 RegExpElement* RegExpFromStringParser::concatenation() {
-	RegExpElement* factor = this->factor();
-	if(factor != NULL) {
-		return this->concatenationCont(factor);
-	} else {
-		return NULL;
-	}
+	return this->concatenationCont(this->factor());
 }
 
 RegExpElement* RegExpFromStringParser::concatenationCont(RegExpElement* left) {
 	RegExpFromStringLexer::Token token = m_RegexpLexer.token();
 	if(token.type == RegExpFromStringLexer::TokenType::ERROR || token.type == RegExpFromStringLexer::TokenType::LPAR || token.type == RegExpFromStringLexer::TokenType::EPS || token.type == RegExpFromStringLexer::TokenType::EMPTY) {
 
-		RegExpElement* right = this->factor();
-		if(right != NULL) {
+		try {
+			RegExpElement* right = this->factor();
 			Concatenation* res = new Concatenation(std::move(*left), std::move(*right));
-
-			delete left;
 			delete right;
+			delete left;
+			left = NULL;
+
 			return this->concatenationContCont(res);
-		} else {
+		} catch (...) {
 			delete left;
-			return NULL;
+			throw;
 		}
 	} else {
 		return left;
@@ -118,14 +145,16 @@ RegExpElement* RegExpFromStringParser::concatenationContCont(Concatenation* res)
 	RegExpFromStringLexer::Token token = m_RegexpLexer.token();
 	if(token.type == RegExpFromStringLexer::TokenType::ERROR || token.type == RegExpFromStringLexer::TokenType::LPAR || token.type == RegExpFromStringLexer::TokenType::EPS || token.type == RegExpFromStringLexer::TokenType::EMPTY) {
 
-		RegExpElement* next = this->factor();
-		if(next != NULL) {
+		try {
+			RegExpElement* next = this->factor();
 			res->appendElement(std::move(*next));
 			delete next;
-		} else {
-			return NULL;
+
+			return this->concatenationContCont(res);
+		} catch (...) {
+			delete res;
+			throw;
 		}
-		return this->concatenationContCont(res);
 	} else {
 		return res;
 	}
@@ -134,30 +163,37 @@ RegExpElement* RegExpFromStringParser::concatenationContCont(Concatenation* res)
 RegExpElement* RegExpFromStringParser::factor() {
 	RegExpFromStringLexer::Token token = m_RegexpLexer.token();
 	if(token.type == RegExpFromStringLexer::TokenType::LPAR) {
-		m_RegexpLexer.next();
+		RegExpFromStringLexer::Token token = m_RegexpLexer.next().token();
+		if(token.type == RegExpFromStringLexer::TokenType::ERROR) {
+			alphabet::SymbolFromStringLexer::Token token = m_SymbolParser.m_SymbolLexer.next().token();
+			if(token.type == alphabet::SymbolFromStringLexer::TokenType::ERROR) {
+				m_SymbolParser.m_LabelParser.m_Lexer.next();
+			}
+		}
 		RegExpElement* base = this->alternation();
 		token = m_RegexpLexer.token();
-		if(token.type != RegExpFromStringLexer::TokenType::RPAR) return NULL;
+		if(token.type != RegExpFromStringLexer::TokenType::RPAR) throw alib::AlibException();
 		return this->star(base);
 	} else if(token.type == RegExpFromStringLexer::TokenType::EPS) {
 		return this->star(new RegExpEpsilon());
 	} else if(token.type == RegExpFromStringLexer::TokenType::EMPTY) {
 		return this->star(new RegExpEmpty());
 	} else if(token.type == RegExpFromStringLexer::TokenType::ERROR) {
-		alphabet::Symbol* symbol = m_SymbolParser.parse();
-		if(symbol != NULL) {
-			RegExpSymbol* res = new RegExpSymbol(std::move(*symbol));
-			delete symbol;
-			return this->star(res);
-		} else
-			return NULL;
+		RegExpSymbol* res = new RegExpSymbol(m_SymbolParser.parse());
+		return this->star(res);
 	} else {
-		return NULL;
+		throw alib::AlibException();
 	}
 }
 
 RegExpElement* RegExpFromStringParser::star(RegExpElement* elem) {
 	RegExpFromStringLexer::Token token = m_RegexpLexer.next().token();
+	if(token.type == RegExpFromStringLexer::TokenType::ERROR) {
+		alphabet::SymbolFromStringLexer::Token token = m_SymbolParser.m_SymbolLexer.next().token();
+		if(token.type == alphabet::SymbolFromStringLexer::TokenType::ERROR) {
+			m_SymbolParser.m_LabelParser.m_Lexer.next();
+		}
+	}
 	if(token.type == RegExpFromStringLexer::TokenType::STAR) {
 		Iteration* iter = new Iteration(std::move(*elem));
 		delete elem;
diff --git a/alib2/src/regexp/RegExpFromStringParser.h b/alib2/src/regexp/RegExpFromStringParser.h
index 910ce2821e..f7775f82bb 100644
--- a/alib2/src/regexp/RegExpFromStringParser.h
+++ b/alib2/src/regexp/RegExpFromStringParser.h
@@ -31,10 +31,11 @@ class RegExpFromStringParser {
 	RegExpFromStringLexer m_RegexpLexer;
 	alphabet::SymbolFromStringParser m_SymbolParser;
 
+	RegExp parse();
+	RegExp* parsePointer();
 public:
 	RegExpFromStringParser(std::stringstream&);
-	RegExp* parse();
-	RegExp parseRegexp();
+	RegExp parseValue();
 
 };
 
diff --git a/alib2/src/regexp/RegExpFromXMLParser.cpp b/alib2/src/regexp/RegExpFromXMLParser.cpp
index 9aa1028697..9d29abb388 100644
--- a/alib2/src/regexp/RegExpFromXMLParser.cpp
+++ b/alib2/src/regexp/RegExpFromXMLParser.cpp
@@ -9,6 +9,8 @@
 #include "../sax/ParserException.h"
 #include "../label/StringLabel.h"
 
+#include "../FromXMLParsers.h"
+
 namespace regexp {
 
 RegExp RegExpFromXMLParser::parse(std::list<sax::Token>& input) const {
@@ -17,31 +19,43 @@ RegExp RegExpFromXMLParser::parse(std::list<sax::Token>& input) const {
 	RegExp regexp;
 	parseAlphabet(input, regexp);
 	
-	if(isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
-		RegExpElement* element = parseElement(input);
-		regexp.setRegExp(std::move(*element));
-		delete element;
-	}
+	RegExpElement* element = parseElement(input);
+	regexp.setRegExp(std::move(*element));
+	delete element;
 	
 	popToken(input, sax::Token::TokenType::END_ELEMENT, "regexp");
 
 	return regexp;
 }
 
+RegExp RegExpFromXMLParser::parseValue(std::list<sax::Token>& input) const {
+	RegExp res = parse(input);
+
+	if(input.size() == 0) {
+		return res;
+	} else {
+		throw alib::AlibException();
+	}
+}
+
+RegExp* RegExpFromXMLParser::parsePointer(std::list<sax::Token>& input) const {
+	if(isToken(input, sax::Token::TokenType::START_ELEMENT, "regexp")) {
+		return new RegExp(parse(input));
+	} else {
+		return NULL;
+	}
+}
+
 void RegExpFromXMLParser::parseAlphabet(std::list<sax::Token> &input, RegExp& regexp) const {
 	popToken(input, sax::Token::TokenType::START_ELEMENT, "alphabet");
-	while (isToken(input, sax::Token::TokenType::START_ELEMENT, "symbol")) {
-		alphabet::Symbol* symbol = parseSymbol<alphabet::Symbol>(input);
-		regexp.addSymbolToAlphabet(*symbol);
-		delete symbol;
+	while (isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
+		regexp.addSymbolToAlphabet(alib::FromXMLParsers::symbolParser.parse(input));
 	}
 	popToken(input, sax::Token::TokenType::END_ELEMENT, "alphabet");
 }
 
 RegExpElement* RegExpFromXMLParser::parseElement(std::list<sax::Token>& input) const {
-	if (isToken(input, sax::Token::TokenType::START_ELEMENT, "symbol")) {
-		return parseSymbol<RegExpSymbol>(input);
-	} else if (isToken(input, sax::Token::TokenType::START_ELEMENT, "empty")) {
+	if (isToken(input, sax::Token::TokenType::START_ELEMENT, "empty")) {
 		return parseEmpty(input);
 	} else if (isToken(input, sax::Token::TokenType::START_ELEMENT, "epsilon")) {
 		return parseEpsilon(input);
@@ -52,7 +66,7 @@ RegExpElement* RegExpFromXMLParser::parseElement(std::list<sax::Token>& input) c
 	} else if (isToken(input, sax::Token::TokenType::START_ELEMENT, "concatenation")) {
 		return parseConcatenation(input);
 	} else {
-		return NULL;
+		return new RegExpSymbol(alib::FromXMLParsers::symbolParser.parse(input));
 	}
 }
 
@@ -60,9 +74,7 @@ Alternation* RegExpFromXMLParser::parseAlternation(std::list<sax::Token>& input)
 	popToken(input, sax::Token::TokenType::START_ELEMENT, "alternation");
 
 	RegExpElement* element1 = parseElement(input);
-	if(!element1) throw alib::AlibException("Not enought elements in alternation");
 	RegExpElement* element2 = parseElement(input);
-	if(!element2) throw alib::AlibException("Not enought elements in alternation");
 	
 	Alternation* alternation = new Alternation(std::move(*element1), std::move(*element2));
 	delete element1;
@@ -82,9 +94,7 @@ Concatenation* RegExpFromXMLParser::parseConcatenation(std::list<sax::Token>& in
 	popToken(input, sax::Token::TokenType::START_ELEMENT, "concatenation");
 
 	RegExpElement* element1 = parseElement(input);
-	if(!element1) throw alib::AlibException("Not enought elements in concatenation");
 	RegExpElement* element2 = parseElement(input);
-	if(!element2) throw alib::AlibException("Not enought elements in concatenation");
 	
 	Concatenation* concatenation = new Concatenation(std::move(*element1), std::move(*element2));
 	delete element1;
@@ -105,7 +115,6 @@ Iteration* RegExpFromXMLParser::parseIteration(std::list<sax::Token>& input) con
 	popToken(input, sax::Token::TokenType::START_ELEMENT, "iteration");
 
 	RegExpElement* element = parseElement(input);
-	if(!element) throw sax::ParserException(sax::Token("", sax::Token::TokenType::CHARACTER), input.front());
 	Iteration* iteration = new Iteration(std::move(*element));
 	delete element;
 
@@ -131,14 +140,5 @@ RegExpEmpty* RegExpFromXMLParser::parseEmpty(std::list<sax::Token>& input) const
 	return empty;
 }
 
-template <class T>
-T* RegExpFromXMLParser::parseSymbol(std::list<sax::Token>& input) const {
-	popToken(input, sax::Token::TokenType::START_ELEMENT, "symbol");
-
-	T* symbol = new T(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel(popTokenData(input, sax::Token::TokenType::CHARACTER))))));
-	popToken(input, sax::Token::TokenType::END_ELEMENT, "symbol");
-	return symbol;
-}
-
 } /* namespace regexp */
 
diff --git a/alib2/src/regexp/RegExpFromXMLParser.h b/alib2/src/regexp/RegExpFromXMLParser.h
index d5097dbe02..6ce576a756 100644
--- a/alib2/src/regexp/RegExpFromXMLParser.h
+++ b/alib2/src/regexp/RegExpFromXMLParser.h
@@ -26,11 +26,12 @@ class RegExpFromXMLParser : public sax::FromXMLParser {
 
 	RegExpEpsilon* parseEpsilon(std::list<sax::Token>& input) const;
 	RegExpEmpty* parseEmpty(std::list<sax::Token>& input) const;
-	template <class T> T* parseSymbol(std::list<sax::Token> &input) const;
 	Iteration* parseIteration(std::list<sax::Token> &input) const;
 	Alternation* parseAlternation(std::list<sax::Token> &input) const;
 	Concatenation* parseConcatenation(std::list<sax::Token> &input) const;
 
+	RegExp parse(std::list<sax::Token>& input) const;
+	RegExp* parsePointer(std::list<sax::Token>& input) const;
 public:
 	/**
 	 * Parses the XML and returns regular expression. The input is destroyed in the process.
@@ -38,7 +39,7 @@ public:
 	 * @return RegExp
 	 * @throws ParserException when an error occurs
 	 */
-	RegExp parse(std::list<sax::Token>& input) const;
+	RegExp parseValue(std::list<sax::Token>& input) const;
 };
 
 } /* namespace regexp */
diff --git a/alib2/src/regexp/RegExpToXMLComposer.cpp b/alib2/src/regexp/RegExpToXMLComposer.cpp
index 965c5f20dd..dabb628930 100644
--- a/alib2/src/regexp/RegExpToXMLComposer.cpp
+++ b/alib2/src/regexp/RegExpToXMLComposer.cpp
@@ -7,6 +7,8 @@
 
 #include "RegExpToXMLComposer.h"
 
+#include "../ToXMLComposers.h"
+
 namespace regexp {
 
 void RegExpToXMLComposer::Visit(void* userData, const RegExp& regexp) const {
@@ -16,9 +18,7 @@ void RegExpToXMLComposer::Visit(void* userData, const RegExp& regexp) const {
 	{
 		out.push_back(sax::Token("alphabet", sax::Token::TokenType::START_ELEMENT));
 		for (const auto& symbol: regexp.getAlphabet()) {
-			out.push_back(sax::Token("symbol", sax::Token::TokenType::START_ELEMENT));
-			out.push_back(sax::Token((std::string) symbol, sax::Token::TokenType::CHARACTER));
-			out.push_back(sax::Token("symbol", sax::Token::TokenType::END_ELEMENT));
+			out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol));
 		}
 		out.push_back(sax::Token("alphabet", sax::Token::TokenType::END_ELEMENT));
 	}
@@ -65,9 +65,7 @@ void RegExpToXMLComposer::Visit(void* userData, const Iteration& iteration) cons
 void RegExpToXMLComposer::Visit(void* userData, const RegExpSymbol& symbol) const {
 	std::list<sax::Token> &out = *((std::list<sax::Token>*) userData);
 
-	out.push_back(sax::Token("symbol", sax::Token::TokenType::START_ELEMENT));
-	out.push_back(sax::Token((std::string) symbol.getSymbol(), sax::Token::TokenType::CHARACTER));
-	out.push_back(sax::Token("symbol", sax::Token::TokenType::END_ELEMENT));
+	out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol.getSymbol()));
 }
 
 void RegExpToXMLComposer::Visit(void* userData, const RegExpEpsilon&) const {
diff --git a/alib2/src/string/String.cpp b/alib2/src/string/String.cpp
index 2fd1cfc4f0..82a51d3dd5 100644
--- a/alib2/src/string/String.cpp
+++ b/alib2/src/string/String.cpp
@@ -12,29 +12,25 @@
 
 namespace string {
 
-String::String() {
+String::String() : string(NULL) {
 	setString(Epsilon());
 }
 
-String::String(const std::set<alphabet::Symbol>& alphabet, const StringBase& string) : alphabet(alphabet) {
-	this->string = NULL;
+String::String(const std::set<alphabet::Symbol>& alphabet, const StringBase& string) : string(NULL), alphabet(alphabet) {
 	setString(string);
 }
 
-String::String(std::set<alphabet::Symbol>&& alphabet, StringBase&& string) : alphabet(alphabet) {
-	this->string = NULL;
+String::String(std::set<alphabet::Symbol>&& alphabet, StringBase&& string) : string(NULL), alphabet(alphabet) {
 	setString(std::move(string));
 }
 
-String::String(const StringBase& string) {
+String::String(const StringBase& string) : string(NULL) {
 	string.computeMinimalAlphabet(alphabet);
-	this->string = NULL;
 	setString(string);
 }
 
-String::String(StringBase&& string) {
+String::String(StringBase&& string) : string(NULL) {
 	string.computeMinimalAlphabet(alphabet);
-	this->string = NULL;
 	setString(string);
 }
 
diff --git a/alib2/src/string/StringFromStringParser.cpp b/alib2/src/string/StringFromStringParser.cpp
index d93d79e0e8..84c127dffd 100644
--- a/alib2/src/string/StringFromStringParser.cpp
+++ b/alib2/src/string/StringFromStringParser.cpp
@@ -13,54 +13,63 @@ StringFromStringParser::StringFromStringParser(std::stringstream& input) : m_Str
 
 }
 
-String* StringFromStringParser::parse() {
-	StringFromStringLexer::Token token = m_StringLexer.next().token();
+String StringFromStringParser::parse() {
+	StringFromStringLexer::Token token = m_StringLexer.token();
 	if(token.type == StringFromStringLexer::TokenType::EPSILON) {
-		return new String(Epsilon());
+		return String(Epsilon());
 	} else if(token.type == StringFromStringLexer::TokenType::LESS) {
 		std::vector<alphabet::Symbol> data = parseContent();
-		StringFromStringLexer::Token token = m_StringLexer.next().token();
 		if(token.type == StringFromStringLexer::TokenType::GREATER) {
-			return new String(CyclicString(data));
+			return String(CyclicString(data));
 		} else {
-			return NULL;
+			throw alib::AlibException();
 		}
 	} else if(token.type == StringFromStringLexer::TokenType::QUOTE) {
 		std::vector<alphabet::Symbol> data = parseContent();
-		StringFromStringLexer::Token token = m_StringLexer.next().token();
 		if(token.type == StringFromStringLexer::TokenType::QUOTE) {
-			return new String(LinearString(data));
+			return String(LinearString(data));
 		} else {
-			return NULL;
+			throw alib::AlibException();
 		}
 	} else {
-		return NULL;
+		throw alib::AlibException();
 	}
 }
 
-String StringFromStringParser::parseString() {
-	String* string = parse();
+String StringFromStringParser::parseValue() {
+	m_StringLexer.next();
+	String res = parse();
 
 	StringFromStringLexer::Token token = m_StringLexer.next().token();
-	if(token.type == StringFromStringLexer::TokenType::TEOF && string != NULL) {
-		String res = std::move(*string);
-		delete string;
+	if(token.type == StringFromStringLexer::TokenType::TEOF) {
 		return std::move(res);
 	} else {
-		delete string;
 		throw alib::AlibException();
 	}
 }
 
+String* StringFromStringParser::parsePointer() {
+	StringFromStringLexer::Token token = m_StringLexer.next().token();
+	if(token.type == StringFromStringLexer::TokenType::EPSILON || token.type == StringFromStringLexer::TokenType::LESS || token.type == StringFromStringLexer::TokenType::QUOTE) {
+		return new String(parse());
+	} else {
+		return NULL;
+	}
+}
+
 std::vector<alphabet::Symbol> StringFromStringParser::parseContent() {
 	std::vector<alphabet::Symbol> data;
-	alphabet::Symbol* symbol;
 	do {
-		symbol = m_SymbolParser.parse();
-		if(symbol == NULL)
+		StringFromStringLexer::Token token = m_StringLexer.next().token();
+		if(token.type == StringFromStringLexer::TokenType::ERROR) {
+			alphabet::SymbolFromStringLexer::Token token = m_SymbolParser.m_SymbolLexer.next().token();
+			if(token.type == alphabet::SymbolFromStringLexer::TokenType::ERROR) {
+				m_SymbolParser.m_LabelParser.m_Lexer.next();
+			}
+		}
+		if(token.type == StringFromStringLexer::TokenType::GREATER || token.type == StringFromStringLexer::TokenType::QUOTE)
 			return data;
-		data.push_back(std::move(*symbol));
-		delete symbol;
+		data.push_back(m_SymbolParser.parse());
 	} while(true);
 }
 
diff --git a/alib2/src/string/StringFromStringParser.h b/alib2/src/string/StringFromStringParser.h
index f9c06ee867..04935b2121 100644
--- a/alib2/src/string/StringFromStringParser.h
+++ b/alib2/src/string/StringFromStringParser.h
@@ -22,10 +22,12 @@ class StringFromStringParser {
 	
 	StringFromStringLexer m_StringLexer;
 	alphabet::SymbolFromStringParser m_SymbolParser;
+
+	String parse();
+	String* parsePointer();
 public:
 	StringFromStringParser(std::stringstream&);
-	String* parse();
-	String parseString();
+	String parseValue();
 
 };
 
diff --git a/alib2/src/string/StringFromXMLParser.cpp b/alib2/src/string/StringFromXMLParser.cpp
index 5e82426754..3da9e1b566 100644
--- a/alib2/src/string/StringFromXMLParser.cpp
+++ b/alib2/src/string/StringFromXMLParser.cpp
@@ -10,51 +10,75 @@
 #include "Epsilon.h"
 #include "LinearString.h"
 #include "CyclicString.h"
-#include "../label/StringLabel.h"
-#include "../label/Label.h"
-#include "../alphabet/LabeledSymbol.h"
+
+#include "../FromXMLParsers.h"
 
 namespace string {
 
 String StringFromXMLParser::parse(std::list<sax::Token>& input) const {
+	popToken(input, sax::Token::TokenType::START_ELEMENT, "string");
+	
+	String string;
+	parseAlphabet(input, string);
+	parseContent(input, string);
+	
+	popToken(input, sax::Token::TokenType::END_ELEMENT, "string");
+
+	return string;
+}
+
+void StringFromXMLParser::parseContent(std::list<sax::Token>& input, String& string) const {
 	if(isToken(input, sax::Token::TokenType::START_ELEMENT, "Epsilon")) {
 		popToken(input, sax::Token::TokenType::START_ELEMENT, "Epsilon");
 		popToken(input, sax::Token::TokenType::END_ELEMENT, "Epsilon");
-		return String(Epsilon());
+		string.setString(Epsilon());
 	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "LinearString")) {
 		popToken(input, sax::Token::TokenType::START_ELEMENT, "LinearString");
-		std::vector<alphabet::Symbol> data = parseContent(input);
+		std::vector<alphabet::Symbol> data = parseContentData(input);
 		popToken(input, sax::Token::TokenType::END_ELEMENT, "LinearString");
-		return String(LinearString(data));
+		string.setString(LinearString(data));
 	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "CyclicString")) {
 		popToken(input, sax::Token::TokenType::START_ELEMENT, "CyclicString");
-		std::vector<alphabet::Symbol> data = parseContent(input);
+		std::vector<alphabet::Symbol> data = parseContentData(input);
 		popToken(input, sax::Token::TokenType::END_ELEMENT, "CyclicString");
-		return String(LinearString(data));
+		string.setString(CyclicString(data));
 	} else {
-		throw sax::ParserException(sax::Token("", sax::Token::TokenType::START_ELEMENT), input.front());
+		throw sax::ParserException(sax::Token("Epsilon, LinearString, CyclicString", sax::Token::TokenType::START_ELEMENT), input.front());
 	}
 }
 
-std::vector<alphabet::Symbol> StringFromXMLParser::parseContent(std::list<sax::Token>& input) const {
-	std::vector<alphabet::Symbol> data;
-	while (isToken(input, sax::Token::TokenType::START_ELEMENT, "Symbol")) {
-		data.push_back(parseSymbol(input));
+void StringFromXMLParser::parseAlphabet(std::list<sax::Token> &input, String& string) const {
+	popToken(input, sax::Token::TokenType::START_ELEMENT, "alphabet");
+	while (isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
+		string.addSymbolToAlphabet(alib::FromXMLParsers::symbolParser.parse(input));
 	}
-	return data;
+	popToken(input, sax::Token::TokenType::END_ELEMENT, "alphabet");
 }
 
-alphabet::Symbol StringFromXMLParser::parseSymbol(std::list<sax::Token>& input) const {
-	popToken(input, sax::Token::TokenType::START_ELEMENT, "Symbol");
+String StringFromXMLParser::parseValue(std::list<sax::Token>& input) const {
+	String res = parse(input);
 
-	if (input.front().getType() == sax::Token::TokenType::CHARACTER) {
-		alphabet::Symbol symbol = alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel(input.front().getData()))));
-		input.pop_front();
-		popToken(input, sax::Token::TokenType::END_ELEMENT, "Symbol");
-		return symbol;
+	if(input.size() == 0) {
+		return res;
 	} else {
-		throw sax::ParserException(sax::Token("", sax::Token::TokenType::CHARACTER), input.front());
+		throw alib::AlibException();
 	}
 }
 
+String* StringFromXMLParser::parsePointer(std::list<sax::Token>& input) const {
+	if(isToken(input, sax::Token::TokenType::START_ELEMENT, "Epsilon") || isToken(input, sax::Token::TokenType::START_ELEMENT, "LinearString") || isToken(input, sax::Token::TokenType::START_ELEMENT, "CyclicString")) {
+		return new String(parse(input));
+	} else {
+		return NULL;
+	}
+}
+
+std::vector<alphabet::Symbol> StringFromXMLParser::parseContentData(std::list<sax::Token>& input) const {
+	std::vector<alphabet::Symbol> data;
+	while (isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
+		data.push_back(alib::FromXMLParsers::symbolParser.parse(input));
+	}
+	return data;
+}
+
 } /* namespace string */
diff --git a/alib2/src/string/StringFromXMLParser.h b/alib2/src/string/StringFromXMLParser.h
index 6eccc37f4c..66301d2863 100644
--- a/alib2/src/string/StringFromXMLParser.h
+++ b/alib2/src/string/StringFromXMLParser.h
@@ -20,9 +20,12 @@ namespace string {
  * Parser used to get String from XML parsed into list of tokens.
  */
 class StringFromXMLParser : public sax::FromXMLParser {
-	std::vector<alphabet::Symbol> parseContent(std::list<sax::Token>& input) const;
-	alphabet::Symbol parseSymbol(std::list<sax::Token>& input) const;
+	void parseContent(std::list<sax::Token>& input, String& string) const;
+	std::vector<alphabet::Symbol> parseContentData(std::list<sax::Token>& input) const;
+	void parseAlphabet(std::list<sax::Token> &input, String& string) const;
 
+	String parse(std::list<sax::Token>& input) const;
+	String* parsePointer(std::list<sax::Token>& input) const;
 public:
 	/**
 	 * Parses the XML and returns regular expression. The input is destroyed in the process.
@@ -30,7 +33,7 @@ public:
 	 * @return String
 	 * @throws ParserException when an error occurs
 	 */
-	String parse(std::list<sax::Token>& input) const;
+	String parseValue(std::list<sax::Token>& input) const;
 
 };
 
diff --git a/alib2/src/string/StringToXMLComposer.cpp b/alib2/src/string/StringToXMLComposer.cpp
index 87871557da..dd2dc52d71 100644
--- a/alib2/src/string/StringToXMLComposer.cpp
+++ b/alib2/src/string/StringToXMLComposer.cpp
@@ -10,15 +10,9 @@
 #include "LinearString.h"
 #include "Epsilon.h"
 
-namespace string {
-
-void StringToXMLComposer::Visit(void* userData, const alphabet::Symbol& symbol) const {
-	std::list<sax::Token> &out = *((std::list<sax::Token>*) userData);
+#include "../ToXMLComposers.h"
 
-	out.push_back(sax::Token("symbol", sax::Token::TokenType::START_ELEMENT));
-	out.push_back(sax::Token((std::string) symbol, sax::Token::TokenType::CHARACTER));
-	out.push_back(sax::Token("symbol", sax::Token::TokenType::END_ELEMENT));
-}
+namespace string {
 
 void StringToXMLComposer::Visit(void* userData, const Epsilon&) const {
 	std::list<sax::Token> &out = *((std::list<sax::Token>*) userData);
@@ -32,7 +26,7 @@ void StringToXMLComposer::Visit(void* userData, const CyclicString& string) cons
 
 	out.push_back(sax::Token("CyclicString", sax::Token::TokenType::START_ELEMENT));
 	for(const auto& symbol : string.getContent()) {
-		Visit((void*) &out, symbol);
+		out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol));
 	}
 	out.push_back(sax::Token("CyclicString", sax::Token::TokenType::END_ELEMENT));
 }
@@ -42,14 +36,24 @@ void StringToXMLComposer::Visit(void* userData, const LinearString& string) cons
 
 	out.push_back(sax::Token("LinearString", sax::Token::TokenType::START_ELEMENT));
 	for(const auto& symbol : string.getContent()) {
-		Visit((void*) &out, symbol);
+		out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol));
 	}
 	out.push_back(sax::Token("LinearString", sax::Token::TokenType::END_ELEMENT));
 }
 
 void StringToXMLComposer::Visit(void* userData, const String& string) const {
+	std::list<sax::Token> &out = *((std::list<sax::Token>*) userData);
+	
+	out.push_back(sax::Token("string", sax::Token::TokenType::START_ELEMENT));
+	{
+		out.push_back(sax::Token("alphabet", sax::Token::TokenType::START_ELEMENT));
+		for (const auto& symbol: string.getAlphabet()) {
+			out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol));
+		}
+		out.push_back(sax::Token("alphabet", sax::Token::TokenType::END_ELEMENT));
+	}
 	string.getString().Accept(userData, *this);
-
+	out.push_back(sax::Token("string", sax::Token::TokenType::END_ELEMENT));
 }
 
 std::list<sax::Token> StringToXMLComposer::compose(const String& string) const {
diff --git a/alib2/src/string/StringToXMLComposer.h b/alib2/src/string/StringToXMLComposer.h
index 548c3467e8..bf78531af4 100644
--- a/alib2/src/string/StringToXMLComposer.h
+++ b/alib2/src/string/StringToXMLComposer.h
@@ -19,7 +19,6 @@ namespace string {
  * This class contains methods to print XML representation of string to the output stream.
  */
 class StringToXMLComposer : public StringBase::const_visitor_type {
-	void Visit(void*, const alphabet::Symbol& symbol) const;
 	void Visit(void*, const String& string) const;
 	void Visit(void*, const LinearString& string) const;
 	void Visit(void*, const CyclicString& string) const;
diff --git a/alib2/test-src/alphabet/SymbolTest.cpp b/alib2/test-src/alphabet/SymbolTest.cpp
index 9b1a7b68c5..4ee0d318ee 100644
--- a/alib2/test-src/alphabet/SymbolTest.cpp
+++ b/alib2/test-src/alphabet/SymbolTest.cpp
@@ -6,6 +6,7 @@
 
 #include "alphabet/Symbol.h"
 #include "alphabet/LabeledSymbol.h"
+#include "alphabet/BlankSymbol.h"
 #include "alphabet/SymbolFromStringParser.h"
 #include "alphabet/SymbolToStringComposer.h"
 #include "alphabet/SymbolFromXMLParser.h"
@@ -17,6 +18,7 @@
 #include "label/Label.h"
 
 #define CPPUNIT_IMPLY(x, y) CPPUNIT_ASSERT(!(x) || (y))
+#define CPPUNIT_EXCLUSIVE_OR(x, y) CPPUNIT_ASSERT((!(x) && (y)) || ((x) && !(y)))
 
 CPPUNIT_TEST_SUITE_REGISTRATION( SymbolTest );
 
@@ -44,7 +46,7 @@ void SymbolTest::testEqual() {
     std::stringstream inputs(input);
 
     alphabet::SymbolFromStringParser parser(inputs);
-    alphabet::Symbol symbol = parser.parseSymbol();
+    alphabet::Symbol symbol = parser.parseValue();
 
     alphabet::SymbolToStringComposer composer;
     std::string output = composer.compose(symbol);
@@ -53,7 +55,7 @@ void SymbolTest::testEqual() {
     CPPUNIT_ASSERT( input == output );
 
     alphabet::SymbolFromStringParser parser2(outputs);
-    alphabet::Symbol symbol2 = parser2.parseSymbol();
+    alphabet::Symbol symbol2 = parser2.parseValue();
 
     CPPUNIT_ASSERT( symbol == symbol2 );
   }
@@ -62,7 +64,7 @@ void SymbolTest::testEqual() {
     std::stringstream inputs(input);
 
     alphabet::SymbolFromStringParser parser(inputs);
-    alphabet::Symbol symbol = parser.parseSymbol();
+    alphabet::Symbol symbol = parser.parseValue();
 
     alphabet::SymbolToStringComposer composer;
     std::string output = composer.compose(symbol);
@@ -71,7 +73,7 @@ void SymbolTest::testEqual() {
     CPPUNIT_ASSERT( input == output );
 
     alphabet::SymbolFromStringParser parser2(outputs);
-    alphabet::Symbol symbol2 = parser2.parseSymbol();
+    alphabet::Symbol symbol2 = parser2.parseValue();
 
     CPPUNIT_ASSERT( symbol == symbol2 );
   }
@@ -80,7 +82,7 @@ void SymbolTest::testEqual() {
     std::stringstream inputs(input);
 
     alphabet::SymbolFromStringParser parser(inputs);
-    alphabet::Symbol symbol = parser.parseSymbol();
+    alphabet::Symbol symbol = parser.parseValue();
 
     alphabet::SymbolToStringComposer composer;
     std::string output = composer.compose(symbol);
@@ -89,7 +91,7 @@ void SymbolTest::testEqual() {
     CPPUNIT_ASSERT( input == output );
 
     alphabet::SymbolFromStringParser parser2(outputs);
-    alphabet::Symbol symbol2 = parser2.parseSymbol();
+    alphabet::Symbol symbol2 = parser2.parseValue();
 
     CPPUNIT_ASSERT( symbol == symbol2 );
   }
@@ -108,7 +110,7 @@ void SymbolTest::testXMLParser() {
 	std::list<sax::Token> tokens2;
 	sax::SaxParseInterface::parseMemory(tmp, tokens2);
 	alphabet::SymbolFromXMLParser parser;
-	alphabet::Symbol symbol2 = parser.parse(tokens2);
+	alphabet::Symbol symbol2 = parser.parseValue(tokens2);
   
 	CPPUNIT_ASSERT( symbol == symbol2 );
   }
@@ -121,439 +123,9 @@ void SymbolTest::testXMLParser() {
 }
 
 void SymbolTest::testOrder() {
-/*  string::StringSymbol s1(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("1")))));
-  string::StringEmpty e1;
-  string::StringEpsilon e2;
-  string::Iteration i1(s1);
-
-  string::String alt1(string::Alternation(s1, s1));
-  string::String con1(string::Concatenation (s1, s1));
-  string::String ite1(i1);
-  string::String emp1(e1);
-  string::String eps1(e2);
-  string::String sym1(s1);
-  
-  CPPUNIT_IMPLY( alt1 < con1 && con1 < ite1, alt1 < ite1 );
-  CPPUNIT_IMPLY( alt1 < con1 && con1 < emp1, alt1 < emp1 );
-  CPPUNIT_IMPLY( alt1 < con1 && con1 < eps1, alt1 < eps1 );
-  CPPUNIT_IMPLY( alt1 < con1 && con1 < sym1, alt1 < sym1 );
-  
-  CPPUNIT_IMPLY( alt1 < ite1 && ite1 < con1, alt1 < con1 );
-  CPPUNIT_IMPLY( alt1 < ite1 && ite1 < emp1, alt1 < emp1 );
-  CPPUNIT_IMPLY( alt1 < ite1 && ite1 < eps1, alt1 < eps1 );
-  CPPUNIT_IMPLY( alt1 < ite1 && ite1 < sym1, alt1 < sym1 );
- 
-  CPPUNIT_IMPLY( alt1 < emp1 && emp1 < con1, alt1 < con1 );
-  CPPUNIT_IMPLY( alt1 < emp1 && emp1 < ite1, alt1 < ite1 );
-  CPPUNIT_IMPLY( alt1 < emp1 && emp1 < eps1, alt1 < eps1 );
-  CPPUNIT_IMPLY( alt1 < emp1 && emp1 < sym1, alt1 < sym1 );
-  
-  CPPUNIT_IMPLY( alt1 < eps1 && eps1 < con1, alt1 < con1 );
-  CPPUNIT_IMPLY( alt1 < eps1 && eps1 < ite1, alt1 < ite1 );
-  CPPUNIT_IMPLY( alt1 < eps1 && eps1 < emp1, alt1 < emp1 );
-  CPPUNIT_IMPLY( alt1 < eps1 && eps1 < sym1, alt1 < sym1 );
-  
-  CPPUNIT_IMPLY( alt1 < sym1 && sym1 < con1, alt1 < con1 );
-  CPPUNIT_IMPLY( alt1 < sym1 && sym1 < ite1, alt1 < ite1 );
-  CPPUNIT_IMPLY( alt1 < sym1 && sym1 < emp1, alt1 < emp1 );
-  CPPUNIT_IMPLY( alt1 < sym1 && sym1 < eps1, alt1 < eps1 );
-  
-  
-  
-  CPPUNIT_IMPLY( con1 < alt1 && alt1 < ite1, con1 < ite1 );
-  CPPUNIT_IMPLY( con1 < alt1 && alt1 < emp1, con1 < emp1 );
-  CPPUNIT_IMPLY( con1 < alt1 && alt1 < eps1, con1 < eps1 );
-  CPPUNIT_IMPLY( con1 < alt1 && alt1 < sym1, con1 < sym1 );
-  
-  CPPUNIT_IMPLY( con1 < ite1 && ite1 < alt1, con1 < alt1 );
-  CPPUNIT_IMPLY( con1 < ite1 && ite1 < emp1, con1 < emp1 );
-  CPPUNIT_IMPLY( con1 < ite1 && ite1 < eps1, con1 < eps1 );
-  CPPUNIT_IMPLY( con1 < ite1 && ite1 < sym1, con1 < sym1 );
-  
-  CPPUNIT_IMPLY( con1 < emp1 && emp1 < alt1, con1 < alt1 );
-  CPPUNIT_IMPLY( con1 < emp1 && emp1 < ite1, con1 < ite1 );
-  CPPUNIT_IMPLY( con1 < emp1 && emp1 < eps1, con1 < eps1 );
-  CPPUNIT_IMPLY( con1 < emp1 && emp1 < sym1, con1 < sym1 );
-  
-  CPPUNIT_IMPLY( con1 < eps1 && eps1 < alt1, con1 < alt1 );
-  CPPUNIT_IMPLY( con1 < eps1 && eps1 < ite1, con1 < ite1 );
-  CPPUNIT_IMPLY( con1 < eps1 && eps1 < emp1, con1 < emp1 );
-  CPPUNIT_IMPLY( con1 < eps1 && eps1 < sym1, con1 < sym1 );
-  
-  CPPUNIT_IMPLY( con1 < sym1 && sym1 < alt1, con1 < alt1 );
-  CPPUNIT_IMPLY( con1 < sym1 && sym1 < ite1, con1 < ite1 );
-  CPPUNIT_IMPLY( con1 < sym1 && sym1 < emp1, con1 < emp1 );
-  CPPUNIT_IMPLY( con1 < sym1 && sym1 < eps1, con1 < eps1 );
-  
-
-  
-  CPPUNIT_IMPLY( ite1 < alt1 && alt1 < con1, ite1 < con1 );
-  CPPUNIT_IMPLY( ite1 < alt1 && alt1 < emp1, ite1 < emp1 );
-  CPPUNIT_IMPLY( ite1 < alt1 && alt1 < eps1, ite1 < eps1 );
-  CPPUNIT_IMPLY( ite1 < alt1 && alt1 < sym1, ite1 < sym1 );
-  
-  CPPUNIT_IMPLY( ite1 < con1 && con1 < alt1, ite1 < alt1 );
-  CPPUNIT_IMPLY( ite1 < con1 && con1 < emp1, ite1 < emp1 );
-  CPPUNIT_IMPLY( ite1 < con1 && con1 < eps1, ite1 < eps1 );
-  CPPUNIT_IMPLY( ite1 < con1 && con1 < sym1, ite1 < sym1 );
-  
-  CPPUNIT_IMPLY( ite1 < emp1 && emp1 < alt1, ite1 < alt1 );
-  CPPUNIT_IMPLY( ite1 < emp1 && emp1 < con1, ite1 < con1 );
-  CPPUNIT_IMPLY( ite1 < emp1 && emp1 < eps1, ite1 < eps1 );
-  CPPUNIT_IMPLY( ite1 < emp1 && emp1 < sym1, ite1 < sym1 );
-  
-  CPPUNIT_IMPLY( ite1 < eps1 && eps1 < alt1, ite1 < alt1 );
-  CPPUNIT_IMPLY( ite1 < eps1 && eps1 < con1, ite1 < con1 );
-  CPPUNIT_IMPLY( ite1 < eps1 && eps1 < emp1, ite1 < emp1 );
-  CPPUNIT_IMPLY( ite1 < eps1 && eps1 < sym1, ite1 < sym1 );
-  
-  CPPUNIT_IMPLY( ite1 < sym1 && sym1 < alt1, ite1 < alt1 );
-  CPPUNIT_IMPLY( ite1 < sym1 && sym1 < con1, ite1 < con1 );
-  CPPUNIT_IMPLY( ite1 < sym1 && sym1 < emp1, ite1 < emp1 );
-  CPPUNIT_IMPLY( ite1 < sym1 && sym1 < eps1, ite1 < eps1 );
-  
-  
-  
-  CPPUNIT_IMPLY( emp1 < alt1 && alt1 < con1, emp1 < con1 );
-  CPPUNIT_IMPLY( emp1 < alt1 && alt1 < ite1, emp1 < ite1 );
-  CPPUNIT_IMPLY( emp1 < alt1 && alt1 < eps1, emp1 < eps1 );
-  CPPUNIT_IMPLY( emp1 < alt1 && alt1 < sym1, emp1 < sym1 );
-  
-  CPPUNIT_IMPLY( emp1 < con1 && con1 < alt1, emp1 < alt1 );
-  CPPUNIT_IMPLY( emp1 < con1 && con1 < ite1, emp1 < ite1 );
-  CPPUNIT_IMPLY( emp1 < con1 && con1 < eps1, emp1 < eps1 );
-  CPPUNIT_IMPLY( emp1 < con1 && con1 < sym1, emp1 < sym1 );
-  
-  CPPUNIT_IMPLY( emp1 < ite1 && ite1 < alt1, emp1 < alt1 );
-  CPPUNIT_IMPLY( emp1 < ite1 && ite1 < con1, emp1 < con1 );
-  CPPUNIT_IMPLY( emp1 < ite1 && ite1 < eps1, emp1 < eps1 );
-  CPPUNIT_IMPLY( emp1 < ite1 && ite1 < sym1, emp1 < sym1 );
-  
-  CPPUNIT_IMPLY( emp1 < eps1 && eps1 < alt1, emp1 < alt1 );
-  CPPUNIT_IMPLY( emp1 < eps1 && eps1 < con1, emp1 < con1 );
-  CPPUNIT_IMPLY( emp1 < eps1 && eps1 < ite1, emp1 < ite1 );
-  CPPUNIT_IMPLY( emp1 < eps1 && eps1 < sym1, emp1 < sym1 );
-  
-  CPPUNIT_IMPLY( emp1 < sym1 && sym1 < alt1, emp1 < alt1 );
-  CPPUNIT_IMPLY( emp1 < sym1 && sym1 < con1, emp1 < con1 );
-  CPPUNIT_IMPLY( emp1 < sym1 && sym1 < ite1, emp1 < ite1 );
-  CPPUNIT_IMPLY( emp1 < sym1 && sym1 < eps1, emp1 < eps1 );
-  
-  
-    
-  CPPUNIT_IMPLY( eps1 < alt1 && alt1 < con1, eps1 < con1 );
-  CPPUNIT_IMPLY( eps1 < alt1 && alt1 < ite1, eps1 < ite1 );
-  CPPUNIT_IMPLY( eps1 < alt1 && alt1 < emp1, eps1 < emp1 );
-  CPPUNIT_IMPLY( eps1 < alt1 && alt1 < sym1, eps1 < sym1 );
-  
-  CPPUNIT_IMPLY( eps1 < con1 && con1 < alt1, eps1 < alt1 );
-  CPPUNIT_IMPLY( eps1 < con1 && con1 < ite1, eps1 < ite1 );
-  CPPUNIT_IMPLY( eps1 < con1 && con1 < emp1, eps1 < emp1 );
-  CPPUNIT_IMPLY( eps1 < con1 && con1 < sym1, eps1 < sym1 );
-  
-  CPPUNIT_IMPLY( eps1 < ite1 && ite1 < alt1, eps1 < alt1 );
-  CPPUNIT_IMPLY( eps1 < ite1 && ite1 < con1, eps1 < con1 );
-  CPPUNIT_IMPLY( eps1 < ite1 && ite1 < emp1, eps1 < emp1 );
-  CPPUNIT_IMPLY( eps1 < ite1 && ite1 < sym1, eps1 < sym1 );
-  
-  CPPUNIT_IMPLY( eps1 < emp1 && emp1 < alt1, eps1 < alt1 );
-  CPPUNIT_IMPLY( eps1 < emp1 && emp1 < con1, eps1 < con1 );
-  CPPUNIT_IMPLY( eps1 < emp1 && emp1 < ite1, eps1 < ite1 );
-  CPPUNIT_IMPLY( eps1 < emp1 && emp1 < sym1, eps1 < sym1 );
-  
-  CPPUNIT_IMPLY( eps1 < sym1 && sym1 < alt1, eps1 < alt1 );
-  CPPUNIT_IMPLY( eps1 < sym1 && sym1 < con1, eps1 < con1 );
-  CPPUNIT_IMPLY( eps1 < sym1 && sym1 < ite1, eps1 < ite1 );
-  CPPUNIT_IMPLY( eps1 < sym1 && sym1 < emp1, eps1 < emp1 );
-  
-  
-      
-  CPPUNIT_IMPLY( sym1 < alt1 && alt1 < con1, sym1 < con1 );
-  CPPUNIT_IMPLY( sym1 < alt1 && alt1 < ite1, sym1 < ite1 );
-  CPPUNIT_IMPLY( sym1 < alt1 && alt1 < emp1, sym1 < emp1 );
-  CPPUNIT_IMPLY( sym1 < alt1 && alt1 < eps1, sym1 < eps1 );
-  
-  CPPUNIT_IMPLY( sym1 < con1 && con1 < alt1, sym1 < alt1 );
-  CPPUNIT_IMPLY( sym1 < con1 && con1 < ite1, sym1 < ite1 );
-  CPPUNIT_IMPLY( sym1 < con1 && con1 < emp1, sym1 < emp1 );
-  CPPUNIT_IMPLY( sym1 < con1 && con1 < eps1, sym1 < eps1 );
-  
-  CPPUNIT_IMPLY( sym1 < ite1 && ite1 < alt1, sym1 < alt1 );
-  CPPUNIT_IMPLY( sym1 < ite1 && ite1 < con1, sym1 < con1 );
-  CPPUNIT_IMPLY( sym1 < ite1 && ite1 < emp1, sym1 < emp1 );
-  CPPUNIT_IMPLY( sym1 < ite1 && ite1 < eps1, sym1 < eps1 );
-  
-  CPPUNIT_IMPLY( sym1 < emp1 && emp1 < alt1, sym1 < alt1 );
-  CPPUNIT_IMPLY( sym1 < emp1 && emp1 < con1, sym1 < con1 );
-  CPPUNIT_IMPLY( sym1 < emp1 && emp1 < ite1, sym1 < ite1 );
-  CPPUNIT_IMPLY( sym1 < emp1 && emp1 < eps1, sym1 < eps1 );
-  
-  CPPUNIT_IMPLY( sym1 < eps1 && eps1 < alt1, sym1 < alt1 );
-  CPPUNIT_IMPLY( sym1 < eps1 && eps1 < con1, sym1 < con1 );
-  CPPUNIT_IMPLY( sym1 < eps1 && eps1 < ite1, sym1 < ite1 );
-  CPPUNIT_IMPLY( sym1 < eps1 && eps1 < emp1, sym1 < emp1 );*/
-}
-
-void SymbolTest::testOrder2() {
-/*  string::StringSymbol s1(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("1")))));
-  string::StringSymbol s2(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("2")))));
-  string::StringSymbol s3(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("3")))));
-  
-  string::StringEmpty e1;
-  string::StringEpsilon e2;
-  
-  string::Iteration i1(s1);
-  string::Iteration i2(s2);
-  string::Iteration i3(s3);
-
-  string::String alt1(string::Alternation(s1, s1));
-  string::String alt2(string::Alternation(s1, s2));
-  string::String alt3(string::Alternation(s1, s3));
-  string::String alt4(string::Alternation(s2, s1));
-  string::String alt5(string::Alternation(s2, s2));
-  string::String alt6(string::Alternation(s2, s3));
-  string::String alt7(string::Alternation(s3, s1));
-  string::String alt8(string::Alternation(s3, s2));
-  string::String alt9(string::Alternation(s3, s3));
-  
-  string::String con1(string::Concatenation (s1, s1));
-  string::String con2(string::Concatenation (s1, s2));
-  string::String con3(string::Concatenation (s1, s3));
-  string::String con4(string::Concatenation (s2, s1));
-  string::String con5(string::Concatenation (s2, s2));
-  string::String con6(string::Concatenation (s2, s3));
-  string::String con7(string::Concatenation (s3, s1));
-  string::String con8(string::Concatenation (s3, s2));
-  string::String con9(string::Concatenation (s3, s3));
-  
-  string::String ite1(i1);
-  string::String ite2(i2);
-  string::String ite3(i3);
-  
-  string::String emp1(e1);
-  string::String eps1(e2);
-  
-  string::String sym1(s1);
-  string::String sym2(s2);
-  string::String sym3(s3);
-  
-
-  
-  CPPUNIT_ASSERT(alt1 == alt1);
-  CPPUNIT_ASSERT(alt1 < alt2);
-  CPPUNIT_ASSERT(alt1 < alt3);
-  CPPUNIT_ASSERT(alt1 < alt4);
-  CPPUNIT_ASSERT(alt1 < alt5);
-  CPPUNIT_ASSERT(alt1 < alt6);
-  CPPUNIT_ASSERT(alt1 < alt7);
-  CPPUNIT_ASSERT(alt1 < alt8);
-  CPPUNIT_ASSERT(alt1 < alt9);
-  
-  CPPUNIT_ASSERT(alt2 > alt1);
-  CPPUNIT_ASSERT(alt2 == alt2);
-  CPPUNIT_ASSERT(alt2 < alt3);
-  CPPUNIT_ASSERT(alt2 < alt4);
-  CPPUNIT_ASSERT(alt2 < alt5);
-  CPPUNIT_ASSERT(alt2 < alt6);
-  CPPUNIT_ASSERT(alt2 < alt7);
-  CPPUNIT_ASSERT(alt2 < alt8);
-  CPPUNIT_ASSERT(alt2 < alt9);
-  
-  CPPUNIT_ASSERT(alt3 > alt1);
-  CPPUNIT_ASSERT(alt3 > alt2);
-  CPPUNIT_ASSERT(alt3 == alt3);
-  CPPUNIT_ASSERT(alt3 < alt4);
-  CPPUNIT_ASSERT(alt3 < alt5);
-  CPPUNIT_ASSERT(alt3 < alt6);
-  CPPUNIT_ASSERT(alt3 < alt7);
-  CPPUNIT_ASSERT(alt3 < alt8);
-  CPPUNIT_ASSERT(alt3 < alt9);
-  
-  CPPUNIT_ASSERT(alt4 > alt1);
-  CPPUNIT_ASSERT(alt4 > alt2);
-  CPPUNIT_ASSERT(alt4 > alt3);
-  CPPUNIT_ASSERT(alt4 == alt4);
-  CPPUNIT_ASSERT(alt4 < alt5);
-  CPPUNIT_ASSERT(alt4 < alt6);
-  CPPUNIT_ASSERT(alt4 < alt7);
-  CPPUNIT_ASSERT(alt4 < alt8);
-  CPPUNIT_ASSERT(alt4 < alt9);
-  
-  CPPUNIT_ASSERT(alt5 > alt1);
-  CPPUNIT_ASSERT(alt5 > alt2);
-  CPPUNIT_ASSERT(alt5 > alt3);
-  CPPUNIT_ASSERT(alt5 > alt4);
-  CPPUNIT_ASSERT(alt5 == alt5);
-  CPPUNIT_ASSERT(alt5 < alt6);
-  CPPUNIT_ASSERT(alt5 < alt7);
-  CPPUNIT_ASSERT(alt5 < alt8);
-  CPPUNIT_ASSERT(alt5 < alt9);
-  
-  CPPUNIT_ASSERT(alt6 > alt1);
-  CPPUNIT_ASSERT(alt6 > alt2);
-  CPPUNIT_ASSERT(alt6 > alt3);
-  CPPUNIT_ASSERT(alt6 > alt4);
-  CPPUNIT_ASSERT(alt6 > alt5);
-  CPPUNIT_ASSERT(alt6 == alt6);
-  CPPUNIT_ASSERT(alt6 < alt7);
-  CPPUNIT_ASSERT(alt6 < alt8);
-  CPPUNIT_ASSERT(alt6 < alt9);
-  
-  CPPUNIT_ASSERT(alt7 > alt1);
-  CPPUNIT_ASSERT(alt7 > alt2);
-  CPPUNIT_ASSERT(alt7 > alt3);
-  CPPUNIT_ASSERT(alt7 > alt4);
-  CPPUNIT_ASSERT(alt7 > alt5);
-  CPPUNIT_ASSERT(alt7 > alt6);
-  CPPUNIT_ASSERT(alt7 == alt7);
-  CPPUNIT_ASSERT(alt7 < alt8);
-  CPPUNIT_ASSERT(alt7 < alt9);
-  
-  CPPUNIT_ASSERT(alt8 > alt1);
-  CPPUNIT_ASSERT(alt8 > alt2);
-  CPPUNIT_ASSERT(alt8 > alt3);
-  CPPUNIT_ASSERT(alt8 > alt4);
-  CPPUNIT_ASSERT(alt8 > alt5);
-  CPPUNIT_ASSERT(alt8 > alt6);
-  CPPUNIT_ASSERT(alt8 > alt7);
-  CPPUNIT_ASSERT(alt8 == alt8);
-  CPPUNIT_ASSERT(alt8 < alt9);
-  
-  CPPUNIT_ASSERT(alt9 > alt1);
-  CPPUNIT_ASSERT(alt9 > alt2);
-  CPPUNIT_ASSERT(alt9 > alt3);
-  CPPUNIT_ASSERT(alt9 > alt4);
-  CPPUNIT_ASSERT(alt9 > alt5);
-  CPPUNIT_ASSERT(alt9 > alt6);
-  CPPUNIT_ASSERT(alt9 > alt7);
-  CPPUNIT_ASSERT(alt9 > alt8);
-  CPPUNIT_ASSERT(alt9 == alt9);
-  
-  
-  
-  CPPUNIT_ASSERT(con1 == con1);
-  CPPUNIT_ASSERT(con1 < con2);
-  CPPUNIT_ASSERT(con1 < con3);
-  CPPUNIT_ASSERT(con1 < con4);
-  CPPUNIT_ASSERT(con1 < con5);
-  CPPUNIT_ASSERT(con1 < con6);
-  CPPUNIT_ASSERT(con1 < con7);
-  CPPUNIT_ASSERT(con1 < con8);
-  CPPUNIT_ASSERT(con1 < con9);
-  
-  CPPUNIT_ASSERT(con2 > con1);
-  CPPUNIT_ASSERT(con2 == con2);
-  CPPUNIT_ASSERT(con2 < con3);
-  CPPUNIT_ASSERT(con2 < con4);
-  CPPUNIT_ASSERT(con2 < con5);
-  CPPUNIT_ASSERT(con2 < con6);
-  CPPUNIT_ASSERT(con2 < con7);
-  CPPUNIT_ASSERT(con2 < con8);
-  CPPUNIT_ASSERT(con2 < con9);
-  
-  CPPUNIT_ASSERT(con3 > con1);
-  CPPUNIT_ASSERT(con3 > con2);
-  CPPUNIT_ASSERT(con3 == con3);
-  CPPUNIT_ASSERT(con3 < con4);
-  CPPUNIT_ASSERT(con3 < con5);
-  CPPUNIT_ASSERT(con3 < con6);
-  CPPUNIT_ASSERT(con3 < con7);
-  CPPUNIT_ASSERT(con3 < con8);
-  CPPUNIT_ASSERT(con3 < con9);
-  
-  CPPUNIT_ASSERT(con4 > con1);
-  CPPUNIT_ASSERT(con4 > con2);
-  CPPUNIT_ASSERT(con4 > con3);
-  CPPUNIT_ASSERT(con4 == con4);
-  CPPUNIT_ASSERT(con4 < con5);
-  CPPUNIT_ASSERT(con4 < con6);
-  CPPUNIT_ASSERT(con4 < con7);
-  CPPUNIT_ASSERT(con4 < con8);
-  CPPUNIT_ASSERT(con4 < con9);
-  
-  CPPUNIT_ASSERT(con5 > con1);
-  CPPUNIT_ASSERT(con5 > con2);
-  CPPUNIT_ASSERT(con5 > con3);
-  CPPUNIT_ASSERT(con5 > con4);
-  CPPUNIT_ASSERT(con5 == con5);
-  CPPUNIT_ASSERT(con5 < con6);
-  CPPUNIT_ASSERT(con5 < con7);
-  CPPUNIT_ASSERT(con5 < con8);
-  CPPUNIT_ASSERT(con5 < con9);
-  
-  CPPUNIT_ASSERT(con6 > con1);
-  CPPUNIT_ASSERT(con6 > con2);
-  CPPUNIT_ASSERT(con6 > con3);
-  CPPUNIT_ASSERT(con6 > con4);
-  CPPUNIT_ASSERT(con6 > con5);
-  CPPUNIT_ASSERT(con6 == con6);
-  CPPUNIT_ASSERT(con6 < con7);
-  CPPUNIT_ASSERT(con6 < con8);
-  CPPUNIT_ASSERT(con6 < con9);
-  
-  CPPUNIT_ASSERT(con7 > con1);
-  CPPUNIT_ASSERT(con7 > con2);
-  CPPUNIT_ASSERT(con7 > con3);
-  CPPUNIT_ASSERT(con7 > con4);
-  CPPUNIT_ASSERT(con7 > con5);
-  CPPUNIT_ASSERT(con7 > con6);
-  CPPUNIT_ASSERT(con7 == con7);
-  CPPUNIT_ASSERT(con7 < con8);
-  CPPUNIT_ASSERT(con7 < con9);
-  
-  CPPUNIT_ASSERT(con8 > con1);
-  CPPUNIT_ASSERT(con8 > con2);
-  CPPUNIT_ASSERT(con8 > con3);
-  CPPUNIT_ASSERT(con8 > con4);
-  CPPUNIT_ASSERT(con8 > con5);
-  CPPUNIT_ASSERT(con8 > con6);
-  CPPUNIT_ASSERT(con8 > con7);
-  CPPUNIT_ASSERT(con8 == con8);
-  CPPUNIT_ASSERT(con8 < con9);
-  
-  CPPUNIT_ASSERT(con9 > con1);
-  CPPUNIT_ASSERT(con9 > con2);
-  CPPUNIT_ASSERT(con9 > con3);
-  CPPUNIT_ASSERT(con9 > con4);
-  CPPUNIT_ASSERT(con9 > con5);
-  CPPUNIT_ASSERT(con9 > con6);
-  CPPUNIT_ASSERT(con9 > con7);
-  CPPUNIT_ASSERT(con9 > con8);
-  CPPUNIT_ASSERT(con9 == con9);
-  
-  
-  CPPUNIT_ASSERT(ite1 == ite1);
-  CPPUNIT_ASSERT(ite1 < ite2);
-  CPPUNIT_ASSERT(ite1 < ite3);
-  
-  CPPUNIT_ASSERT(ite2 > ite1);
-  CPPUNIT_ASSERT(ite2 == ite2);
-  CPPUNIT_ASSERT(ite2 < ite3);
-  
-  CPPUNIT_ASSERT(ite3 > ite1);
-  CPPUNIT_ASSERT(ite3 > ite2);
-  CPPUNIT_ASSERT(ite3 == ite3);
-  
-
-
-  CPPUNIT_ASSERT(emp1 == emp1);
-  
-  
-  
-  CPPUNIT_ASSERT(eps1 == eps1);
-
-
-
-  CPPUNIT_ASSERT(sym1 == sym1);
-  CPPUNIT_ASSERT(sym1 < sym2);
-  CPPUNIT_ASSERT(sym1 < sym3);
-  
-  CPPUNIT_ASSERT(sym2 > sym1);
-  CPPUNIT_ASSERT(sym2 == sym2);
-  CPPUNIT_ASSERT(sym2 < sym3);
+  alphabet::LabeledSymbol ls(alphabet::LabeledSymbol(label::Label(label::StringLabel("a"))));
+  alphabet::BlankSymbol bs;
   
-  CPPUNIT_ASSERT(sym3 > sym1);
-  CPPUNIT_ASSERT(sym3 > sym2);
-  CPPUNIT_ASSERT(sym3 == sym3);*/
+  CPPUNIT_EXCLUSIVE_OR( bs < ls, ls < bs);
 }
 
diff --git a/alib2/test-src/alphabet/SymbolTest.h b/alib2/test-src/alphabet/SymbolTest.h
index b7c7ef5f73..ac84956d72 100644
--- a/alib2/test-src/alphabet/SymbolTest.h
+++ b/alib2/test-src/alphabet/SymbolTest.h
@@ -9,7 +9,6 @@ class SymbolTest : public CppUnit::TestFixture
   CPPUNIT_TEST( testEqual );
   CPPUNIT_TEST( testXMLParser );
   CPPUNIT_TEST( testOrder );
-  CPPUNIT_TEST( testOrder2 );
   CPPUNIT_TEST_SUITE_END();
 
 public:
@@ -20,7 +19,6 @@ public:
   void testEqual();
   void testXMLParser();
   void testOrder();
-  void testOrder2();
 };
 
 #endif  // SYMBOL_TEST_H_
diff --git a/alib2/test-src/label/LabelTest.cpp b/alib2/test-src/label/LabelTest.cpp
index 911b80b3fe..87df63b5f6 100644
--- a/alib2/test-src/label/LabelTest.cpp
+++ b/alib2/test-src/label/LabelTest.cpp
@@ -7,6 +7,7 @@
 #include "label/Label.h"
 #include "label/StringLabel.h"
 #include "label/IntegerLabel.h"
+#include "label/CharacterLabel.h"
 #include "label/LabelFromStringParser.h"
 #include "label/LabelToStringComposer.h"
 #include "label/LabelFromXMLParser.h"
@@ -42,7 +43,7 @@ void LabelTest::testEqual() {
     std::stringstream inputs(input);
 
     label::LabelFromStringParser parser(inputs);
-    label::Label label = parser.parseLabel();
+    label::Label label = parser.parseValue();
 
     label::LabelToStringComposer composer;
     std::string output = composer.compose(label);
@@ -51,7 +52,7 @@ void LabelTest::testEqual() {
     CPPUNIT_ASSERT( input == output );
 
     label::LabelFromStringParser parser2(outputs);
-    label::Label label2 = parser2.parseLabel();
+    label::Label label2 = parser2.parseValue();
 
     CPPUNIT_ASSERT( label == label2 );
   }
@@ -60,7 +61,7 @@ void LabelTest::testEqual() {
     std::stringstream inputs(input);
 
     label::LabelFromStringParser parser(inputs);
-    label::Label label = parser.parseLabel();
+    label::Label label = parser.parseValue();
 
     label::LabelToStringComposer composer;
     std::string output = composer.compose(label);
@@ -69,7 +70,7 @@ void LabelTest::testEqual() {
     CPPUNIT_ASSERT( input == output );
 
     label::LabelFromStringParser parser2(outputs);
-    label::Label label2 = parser2.parseLabel();
+    label::Label label2 = parser2.parseValue();
 
     CPPUNIT_ASSERT( label == label2 );
   }
@@ -88,7 +89,7 @@ void LabelTest::testXMLParser() {
 	std::list<sax::Token> tokens2;
 	sax::SaxParseInterface::parseMemory(tmp, tokens2);
 	label::LabelFromXMLParser parser;
-	label::Label label2 = parser.parse(tokens2);
+	label::Label label2 = parser.parseValue(tokens2);
   
 	CPPUNIT_ASSERT( label == label2 );
   }
@@ -102,8 +103,11 @@ void LabelTest::testXMLParser() {
 
 void LabelTest::testOrder() {
   label::StringLabel s1("1");
+  label::CharacterLabel c1('1');
   label::IntegerLabel i1(1);
   
   CPPUNIT_EXCLUSIVE_OR( s1 < i1, i1 < s1);
+  CPPUNIT_EXCLUSIVE_OR( c1 < i1, i1 < c1);
+  CPPUNIT_EXCLUSIVE_OR( s1 < c1, c1 < s1);
 }
 
diff --git a/alib2/test-src/regexp/RegExpTest.cpp b/alib2/test-src/regexp/RegExpTest.cpp
index 5743976036..ce104afd65 100644
--- a/alib2/test-src/regexp/RegExpTest.cpp
+++ b/alib2/test-src/regexp/RegExpTest.cpp
@@ -54,7 +54,7 @@ void RegExpTest::testEqual() {
     std::stringstream inputs(input);
   
     regexp::RegExpFromStringParser parser(inputs);
-    regexp::RegExp regexp = parser.parseRegexp();
+    regexp::RegExp regexp = parser.parseValue();
 
     regexp::RegExpToStringComposer composer;
     std::string output = composer.compose(regexp);
@@ -63,7 +63,7 @@ void RegExpTest::testEqual() {
     CPPUNIT_ASSERT( input == output );
   
     regexp::RegExpFromStringParser parser2(outputs);
-    regexp::RegExp regexp2 = parser2.parseRegexp();
+    regexp::RegExp regexp2 = parser2.parseValue();
   
     CPPUNIT_ASSERT( regexp == regexp2 );
   }
@@ -72,7 +72,7 @@ void RegExpTest::testEqual() {
     std::stringstream inputs(input);
   
     regexp::RegExpFromStringParser parser(inputs);
-    regexp::RegExp regexp = parser.parseRegexp();
+    regexp::RegExp regexp = parser.parseValue();
 
     regexp::RegExpToStringComposer composer;
     std::string output = composer.compose(regexp);
@@ -81,7 +81,7 @@ void RegExpTest::testEqual() {
     CPPUNIT_ASSERT( input == output );
   
     regexp::RegExpFromStringParser parser2(outputs);
-    regexp::RegExp regexp2 = parser2.parseRegexp();
+    regexp::RegExp regexp2 = parser2.parseValue();
   
     CPPUNIT_ASSERT( regexp == regexp2 );
   }
@@ -90,7 +90,7 @@ void RegExpTest::testEqual() {
     std::stringstream inputs(input);
   
     regexp::RegExpFromStringParser parser(inputs);
-    regexp::RegExp regexp = parser.parseRegexp();
+    regexp::RegExp regexp = parser.parseValue();
 
     regexp::RegExpToStringComposer composer;
     std::string output = composer.compose(regexp);
@@ -99,7 +99,7 @@ void RegExpTest::testEqual() {
     CPPUNIT_ASSERT( input == output );
   
     regexp::RegExpFromStringParser parser2(outputs);
-    regexp::RegExp regexp2 = parser2.parseRegexp();
+    regexp::RegExp regexp2 = parser2.parseValue();
   
     CPPUNIT_ASSERT( regexp == regexp2 );
   }
@@ -129,7 +129,7 @@ void RegExpTest::testXMLParser() {
 	std::list<sax::Token> tokens2;
 	sax::SaxParseInterface::parseMemory(tmp, tokens2);
 	regexp::RegExpFromXMLParser parser;
-	regexp::RegExp regexp2 = parser.parse(tokens2);
+	regexp::RegExp regexp2 = parser.parseValue(tokens2);
   
 	CPPUNIT_ASSERT( regexp == regexp2 );
   }
diff --git a/alib2/test-src/string/StringTest.cpp b/alib2/test-src/string/StringTest.cpp
index 04258fcb9c..e328ce51e6 100644
--- a/alib2/test-src/string/StringTest.cpp
+++ b/alib2/test-src/string/StringTest.cpp
@@ -53,7 +53,7 @@ void StringTest::testEqual() {
     std::stringstream inputs(input);
 
     string::StringFromStringParser parser(inputs);
-    string::String string = parser.parseString();
+    string::String string = parser.parseValue();
 
     string::StringToStringComposer composer;
     std::string output = composer.compose(string);
@@ -62,7 +62,7 @@ void StringTest::testEqual() {
     CPPUNIT_ASSERT( input == output );
 
     string::StringFromStringParser parser2(outputs);
-    string::String string2 = parser2.parseString();
+    string::String string2 = parser2.parseValue();
 
     CPPUNIT_ASSERT( string == string2 );
   }
@@ -71,7 +71,7 @@ void StringTest::testEqual() {
     std::stringstream inputs(input);
 
     string::StringFromStringParser parser(inputs);
-    string::String string = parser.parseString();
+    string::String string = parser.parseValue();
 
     string::StringToStringComposer composer;
     std::string output = composer.compose(string);
@@ -80,7 +80,7 @@ void StringTest::testEqual() {
     CPPUNIT_ASSERT( input == output );
 
     string::StringFromStringParser parser2(outputs);
-    string::String string2 = parser2.parseString();
+    string::String string2 = parser2.parseValue();
 
     CPPUNIT_ASSERT( string == string2 );
   }
@@ -89,7 +89,7 @@ void StringTest::testEqual() {
     std::stringstream inputs(input);
 
     string::StringFromStringParser parser(inputs);
-    string::String string = parser.parseString();
+    string::String string = parser.parseValue();
 
     string::StringToStringComposer composer;
     std::string output = composer.compose(string);
@@ -98,26 +98,21 @@ void StringTest::testEqual() {
     CPPUNIT_ASSERT( input == output );
 
     string::StringFromStringParser parser2(outputs);
-    string::String string2 = parser2.parseString();
+    string::String string2 = parser2.parseValue();
 
     CPPUNIT_ASSERT( string == string2 );
   }
 }
 
 void StringTest::testXMLParser() {
-/*
+
   string::String string;
   string.setAlphabet({alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("1")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("2")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("3"))))});
-  string.setString(string::Alternation(
-		string::Concatenation(
-			string::StringSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("1"))))),
-			string::StringSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("2")))))
-				     ),
-		string::Iteration(
-			string::StringSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("1")))))
-				 )
-			   )
-		       );
+  string.setString(string::LinearString({alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("1")))),
+					alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("2")))),
+					alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("1"))))}
+		  )
+		);
 
   {
 	string::StringToXMLComposer composer;
@@ -128,7 +123,7 @@ void StringTest::testXMLParser() {
 	std::list<sax::Token> tokens2;
 	sax::SaxParseInterface::parseMemory(tmp, tokens2);
 	string::StringFromXMLParser parser;
-	string::String string2 = parser.parse(tokens2);
+	string::String string2 = parser.parseValue(tokens2);
   
 	CPPUNIT_ASSERT( string == string2 );
   }
@@ -137,443 +132,6 @@ void StringTest::testXMLParser() {
 	string::String string2 = string::StringFactory::fromString(tmp);
   
 	CPPUNIT_ASSERT( string == string2 );
-  }*/
-}
-
-void StringTest::testOrder() {
-/*  string::StringSymbol s1(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("1")))));
-  string::StringEmpty e1;
-  string::StringEpsilon e2;
-  string::Iteration i1(s1);
-
-  string::String alt1(string::Alternation(s1, s1));
-  string::String con1(string::Concatenation (s1, s1));
-  string::String ite1(i1);
-  string::String emp1(e1);
-  string::String eps1(e2);
-  string::String sym1(s1);
-  
-  CPPUNIT_IMPLY( alt1 < con1 && con1 < ite1, alt1 < ite1 );
-  CPPUNIT_IMPLY( alt1 < con1 && con1 < emp1, alt1 < emp1 );
-  CPPUNIT_IMPLY( alt1 < con1 && con1 < eps1, alt1 < eps1 );
-  CPPUNIT_IMPLY( alt1 < con1 && con1 < sym1, alt1 < sym1 );
-  
-  CPPUNIT_IMPLY( alt1 < ite1 && ite1 < con1, alt1 < con1 );
-  CPPUNIT_IMPLY( alt1 < ite1 && ite1 < emp1, alt1 < emp1 );
-  CPPUNIT_IMPLY( alt1 < ite1 && ite1 < eps1, alt1 < eps1 );
-  CPPUNIT_IMPLY( alt1 < ite1 && ite1 < sym1, alt1 < sym1 );
- 
-  CPPUNIT_IMPLY( alt1 < emp1 && emp1 < con1, alt1 < con1 );
-  CPPUNIT_IMPLY( alt1 < emp1 && emp1 < ite1, alt1 < ite1 );
-  CPPUNIT_IMPLY( alt1 < emp1 && emp1 < eps1, alt1 < eps1 );
-  CPPUNIT_IMPLY( alt1 < emp1 && emp1 < sym1, alt1 < sym1 );
-  
-  CPPUNIT_IMPLY( alt1 < eps1 && eps1 < con1, alt1 < con1 );
-  CPPUNIT_IMPLY( alt1 < eps1 && eps1 < ite1, alt1 < ite1 );
-  CPPUNIT_IMPLY( alt1 < eps1 && eps1 < emp1, alt1 < emp1 );
-  CPPUNIT_IMPLY( alt1 < eps1 && eps1 < sym1, alt1 < sym1 );
-  
-  CPPUNIT_IMPLY( alt1 < sym1 && sym1 < con1, alt1 < con1 );
-  CPPUNIT_IMPLY( alt1 < sym1 && sym1 < ite1, alt1 < ite1 );
-  CPPUNIT_IMPLY( alt1 < sym1 && sym1 < emp1, alt1 < emp1 );
-  CPPUNIT_IMPLY( alt1 < sym1 && sym1 < eps1, alt1 < eps1 );
-  
-  
-  
-  CPPUNIT_IMPLY( con1 < alt1 && alt1 < ite1, con1 < ite1 );
-  CPPUNIT_IMPLY( con1 < alt1 && alt1 < emp1, con1 < emp1 );
-  CPPUNIT_IMPLY( con1 < alt1 && alt1 < eps1, con1 < eps1 );
-  CPPUNIT_IMPLY( con1 < alt1 && alt1 < sym1, con1 < sym1 );
-  
-  CPPUNIT_IMPLY( con1 < ite1 && ite1 < alt1, con1 < alt1 );
-  CPPUNIT_IMPLY( con1 < ite1 && ite1 < emp1, con1 < emp1 );
-  CPPUNIT_IMPLY( con1 < ite1 && ite1 < eps1, con1 < eps1 );
-  CPPUNIT_IMPLY( con1 < ite1 && ite1 < sym1, con1 < sym1 );
-  
-  CPPUNIT_IMPLY( con1 < emp1 && emp1 < alt1, con1 < alt1 );
-  CPPUNIT_IMPLY( con1 < emp1 && emp1 < ite1, con1 < ite1 );
-  CPPUNIT_IMPLY( con1 < emp1 && emp1 < eps1, con1 < eps1 );
-  CPPUNIT_IMPLY( con1 < emp1 && emp1 < sym1, con1 < sym1 );
-  
-  CPPUNIT_IMPLY( con1 < eps1 && eps1 < alt1, con1 < alt1 );
-  CPPUNIT_IMPLY( con1 < eps1 && eps1 < ite1, con1 < ite1 );
-  CPPUNIT_IMPLY( con1 < eps1 && eps1 < emp1, con1 < emp1 );
-  CPPUNIT_IMPLY( con1 < eps1 && eps1 < sym1, con1 < sym1 );
-  
-  CPPUNIT_IMPLY( con1 < sym1 && sym1 < alt1, con1 < alt1 );
-  CPPUNIT_IMPLY( con1 < sym1 && sym1 < ite1, con1 < ite1 );
-  CPPUNIT_IMPLY( con1 < sym1 && sym1 < emp1, con1 < emp1 );
-  CPPUNIT_IMPLY( con1 < sym1 && sym1 < eps1, con1 < eps1 );
-  
-
-  
-  CPPUNIT_IMPLY( ite1 < alt1 && alt1 < con1, ite1 < con1 );
-  CPPUNIT_IMPLY( ite1 < alt1 && alt1 < emp1, ite1 < emp1 );
-  CPPUNIT_IMPLY( ite1 < alt1 && alt1 < eps1, ite1 < eps1 );
-  CPPUNIT_IMPLY( ite1 < alt1 && alt1 < sym1, ite1 < sym1 );
-  
-  CPPUNIT_IMPLY( ite1 < con1 && con1 < alt1, ite1 < alt1 );
-  CPPUNIT_IMPLY( ite1 < con1 && con1 < emp1, ite1 < emp1 );
-  CPPUNIT_IMPLY( ite1 < con1 && con1 < eps1, ite1 < eps1 );
-  CPPUNIT_IMPLY( ite1 < con1 && con1 < sym1, ite1 < sym1 );
-  
-  CPPUNIT_IMPLY( ite1 < emp1 && emp1 < alt1, ite1 < alt1 );
-  CPPUNIT_IMPLY( ite1 < emp1 && emp1 < con1, ite1 < con1 );
-  CPPUNIT_IMPLY( ite1 < emp1 && emp1 < eps1, ite1 < eps1 );
-  CPPUNIT_IMPLY( ite1 < emp1 && emp1 < sym1, ite1 < sym1 );
-  
-  CPPUNIT_IMPLY( ite1 < eps1 && eps1 < alt1, ite1 < alt1 );
-  CPPUNIT_IMPLY( ite1 < eps1 && eps1 < con1, ite1 < con1 );
-  CPPUNIT_IMPLY( ite1 < eps1 && eps1 < emp1, ite1 < emp1 );
-  CPPUNIT_IMPLY( ite1 < eps1 && eps1 < sym1, ite1 < sym1 );
-  
-  CPPUNIT_IMPLY( ite1 < sym1 && sym1 < alt1, ite1 < alt1 );
-  CPPUNIT_IMPLY( ite1 < sym1 && sym1 < con1, ite1 < con1 );
-  CPPUNIT_IMPLY( ite1 < sym1 && sym1 < emp1, ite1 < emp1 );
-  CPPUNIT_IMPLY( ite1 < sym1 && sym1 < eps1, ite1 < eps1 );
-  
-  
-  
-  CPPUNIT_IMPLY( emp1 < alt1 && alt1 < con1, emp1 < con1 );
-  CPPUNIT_IMPLY( emp1 < alt1 && alt1 < ite1, emp1 < ite1 );
-  CPPUNIT_IMPLY( emp1 < alt1 && alt1 < eps1, emp1 < eps1 );
-  CPPUNIT_IMPLY( emp1 < alt1 && alt1 < sym1, emp1 < sym1 );
-  
-  CPPUNIT_IMPLY( emp1 < con1 && con1 < alt1, emp1 < alt1 );
-  CPPUNIT_IMPLY( emp1 < con1 && con1 < ite1, emp1 < ite1 );
-  CPPUNIT_IMPLY( emp1 < con1 && con1 < eps1, emp1 < eps1 );
-  CPPUNIT_IMPLY( emp1 < con1 && con1 < sym1, emp1 < sym1 );
-  
-  CPPUNIT_IMPLY( emp1 < ite1 && ite1 < alt1, emp1 < alt1 );
-  CPPUNIT_IMPLY( emp1 < ite1 && ite1 < con1, emp1 < con1 );
-  CPPUNIT_IMPLY( emp1 < ite1 && ite1 < eps1, emp1 < eps1 );
-  CPPUNIT_IMPLY( emp1 < ite1 && ite1 < sym1, emp1 < sym1 );
-  
-  CPPUNIT_IMPLY( emp1 < eps1 && eps1 < alt1, emp1 < alt1 );
-  CPPUNIT_IMPLY( emp1 < eps1 && eps1 < con1, emp1 < con1 );
-  CPPUNIT_IMPLY( emp1 < eps1 && eps1 < ite1, emp1 < ite1 );
-  CPPUNIT_IMPLY( emp1 < eps1 && eps1 < sym1, emp1 < sym1 );
-  
-  CPPUNIT_IMPLY( emp1 < sym1 && sym1 < alt1, emp1 < alt1 );
-  CPPUNIT_IMPLY( emp1 < sym1 && sym1 < con1, emp1 < con1 );
-  CPPUNIT_IMPLY( emp1 < sym1 && sym1 < ite1, emp1 < ite1 );
-  CPPUNIT_IMPLY( emp1 < sym1 && sym1 < eps1, emp1 < eps1 );
-  
-  
-    
-  CPPUNIT_IMPLY( eps1 < alt1 && alt1 < con1, eps1 < con1 );
-  CPPUNIT_IMPLY( eps1 < alt1 && alt1 < ite1, eps1 < ite1 );
-  CPPUNIT_IMPLY( eps1 < alt1 && alt1 < emp1, eps1 < emp1 );
-  CPPUNIT_IMPLY( eps1 < alt1 && alt1 < sym1, eps1 < sym1 );
-  
-  CPPUNIT_IMPLY( eps1 < con1 && con1 < alt1, eps1 < alt1 );
-  CPPUNIT_IMPLY( eps1 < con1 && con1 < ite1, eps1 < ite1 );
-  CPPUNIT_IMPLY( eps1 < con1 && con1 < emp1, eps1 < emp1 );
-  CPPUNIT_IMPLY( eps1 < con1 && con1 < sym1, eps1 < sym1 );
-  
-  CPPUNIT_IMPLY( eps1 < ite1 && ite1 < alt1, eps1 < alt1 );
-  CPPUNIT_IMPLY( eps1 < ite1 && ite1 < con1, eps1 < con1 );
-  CPPUNIT_IMPLY( eps1 < ite1 && ite1 < emp1, eps1 < emp1 );
-  CPPUNIT_IMPLY( eps1 < ite1 && ite1 < sym1, eps1 < sym1 );
-  
-  CPPUNIT_IMPLY( eps1 < emp1 && emp1 < alt1, eps1 < alt1 );
-  CPPUNIT_IMPLY( eps1 < emp1 && emp1 < con1, eps1 < con1 );
-  CPPUNIT_IMPLY( eps1 < emp1 && emp1 < ite1, eps1 < ite1 );
-  CPPUNIT_IMPLY( eps1 < emp1 && emp1 < sym1, eps1 < sym1 );
-  
-  CPPUNIT_IMPLY( eps1 < sym1 && sym1 < alt1, eps1 < alt1 );
-  CPPUNIT_IMPLY( eps1 < sym1 && sym1 < con1, eps1 < con1 );
-  CPPUNIT_IMPLY( eps1 < sym1 && sym1 < ite1, eps1 < ite1 );
-  CPPUNIT_IMPLY( eps1 < sym1 && sym1 < emp1, eps1 < emp1 );
-  
-  
-      
-  CPPUNIT_IMPLY( sym1 < alt1 && alt1 < con1, sym1 < con1 );
-  CPPUNIT_IMPLY( sym1 < alt1 && alt1 < ite1, sym1 < ite1 );
-  CPPUNIT_IMPLY( sym1 < alt1 && alt1 < emp1, sym1 < emp1 );
-  CPPUNIT_IMPLY( sym1 < alt1 && alt1 < eps1, sym1 < eps1 );
-  
-  CPPUNIT_IMPLY( sym1 < con1 && con1 < alt1, sym1 < alt1 );
-  CPPUNIT_IMPLY( sym1 < con1 && con1 < ite1, sym1 < ite1 );
-  CPPUNIT_IMPLY( sym1 < con1 && con1 < emp1, sym1 < emp1 );
-  CPPUNIT_IMPLY( sym1 < con1 && con1 < eps1, sym1 < eps1 );
-  
-  CPPUNIT_IMPLY( sym1 < ite1 && ite1 < alt1, sym1 < alt1 );
-  CPPUNIT_IMPLY( sym1 < ite1 && ite1 < con1, sym1 < con1 );
-  CPPUNIT_IMPLY( sym1 < ite1 && ite1 < emp1, sym1 < emp1 );
-  CPPUNIT_IMPLY( sym1 < ite1 && ite1 < eps1, sym1 < eps1 );
-  
-  CPPUNIT_IMPLY( sym1 < emp1 && emp1 < alt1, sym1 < alt1 );
-  CPPUNIT_IMPLY( sym1 < emp1 && emp1 < con1, sym1 < con1 );
-  CPPUNIT_IMPLY( sym1 < emp1 && emp1 < ite1, sym1 < ite1 );
-  CPPUNIT_IMPLY( sym1 < emp1 && emp1 < eps1, sym1 < eps1 );
-  
-  CPPUNIT_IMPLY( sym1 < eps1 && eps1 < alt1, sym1 < alt1 );
-  CPPUNIT_IMPLY( sym1 < eps1 && eps1 < con1, sym1 < con1 );
-  CPPUNIT_IMPLY( sym1 < eps1 && eps1 < ite1, sym1 < ite1 );
-  CPPUNIT_IMPLY( sym1 < eps1 && eps1 < emp1, sym1 < emp1 );*/
-}
-
-void StringTest::testOrder2() {
-/*  string::StringSymbol s1(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("1")))));
-  string::StringSymbol s2(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("2")))));
-  string::StringSymbol s3(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("3")))));
-  
-  string::StringEmpty e1;
-  string::StringEpsilon e2;
-  
-  string::Iteration i1(s1);
-  string::Iteration i2(s2);
-  string::Iteration i3(s3);
-
-  string::String alt1(string::Alternation(s1, s1));
-  string::String alt2(string::Alternation(s1, s2));
-  string::String alt3(string::Alternation(s1, s3));
-  string::String alt4(string::Alternation(s2, s1));
-  string::String alt5(string::Alternation(s2, s2));
-  string::String alt6(string::Alternation(s2, s3));
-  string::String alt7(string::Alternation(s3, s1));
-  string::String alt8(string::Alternation(s3, s2));
-  string::String alt9(string::Alternation(s3, s3));
-  
-  string::String con1(string::Concatenation (s1, s1));
-  string::String con2(string::Concatenation (s1, s2));
-  string::String con3(string::Concatenation (s1, s3));
-  string::String con4(string::Concatenation (s2, s1));
-  string::String con5(string::Concatenation (s2, s2));
-  string::String con6(string::Concatenation (s2, s3));
-  string::String con7(string::Concatenation (s3, s1));
-  string::String con8(string::Concatenation (s3, s2));
-  string::String con9(string::Concatenation (s3, s3));
-  
-  string::String ite1(i1);
-  string::String ite2(i2);
-  string::String ite3(i3);
-  
-  string::String emp1(e1);
-  string::String eps1(e2);
-  
-  string::String sym1(s1);
-  string::String sym2(s2);
-  string::String sym3(s3);
-  
-
-  
-  CPPUNIT_ASSERT(alt1 == alt1);
-  CPPUNIT_ASSERT(alt1 < alt2);
-  CPPUNIT_ASSERT(alt1 < alt3);
-  CPPUNIT_ASSERT(alt1 < alt4);
-  CPPUNIT_ASSERT(alt1 < alt5);
-  CPPUNIT_ASSERT(alt1 < alt6);
-  CPPUNIT_ASSERT(alt1 < alt7);
-  CPPUNIT_ASSERT(alt1 < alt8);
-  CPPUNIT_ASSERT(alt1 < alt9);
-  
-  CPPUNIT_ASSERT(alt2 > alt1);
-  CPPUNIT_ASSERT(alt2 == alt2);
-  CPPUNIT_ASSERT(alt2 < alt3);
-  CPPUNIT_ASSERT(alt2 < alt4);
-  CPPUNIT_ASSERT(alt2 < alt5);
-  CPPUNIT_ASSERT(alt2 < alt6);
-  CPPUNIT_ASSERT(alt2 < alt7);
-  CPPUNIT_ASSERT(alt2 < alt8);
-  CPPUNIT_ASSERT(alt2 < alt9);
-  
-  CPPUNIT_ASSERT(alt3 > alt1);
-  CPPUNIT_ASSERT(alt3 > alt2);
-  CPPUNIT_ASSERT(alt3 == alt3);
-  CPPUNIT_ASSERT(alt3 < alt4);
-  CPPUNIT_ASSERT(alt3 < alt5);
-  CPPUNIT_ASSERT(alt3 < alt6);
-  CPPUNIT_ASSERT(alt3 < alt7);
-  CPPUNIT_ASSERT(alt3 < alt8);
-  CPPUNIT_ASSERT(alt3 < alt9);
-  
-  CPPUNIT_ASSERT(alt4 > alt1);
-  CPPUNIT_ASSERT(alt4 > alt2);
-  CPPUNIT_ASSERT(alt4 > alt3);
-  CPPUNIT_ASSERT(alt4 == alt4);
-  CPPUNIT_ASSERT(alt4 < alt5);
-  CPPUNIT_ASSERT(alt4 < alt6);
-  CPPUNIT_ASSERT(alt4 < alt7);
-  CPPUNIT_ASSERT(alt4 < alt8);
-  CPPUNIT_ASSERT(alt4 < alt9);
-  
-  CPPUNIT_ASSERT(alt5 > alt1);
-  CPPUNIT_ASSERT(alt5 > alt2);
-  CPPUNIT_ASSERT(alt5 > alt3);
-  CPPUNIT_ASSERT(alt5 > alt4);
-  CPPUNIT_ASSERT(alt5 == alt5);
-  CPPUNIT_ASSERT(alt5 < alt6);
-  CPPUNIT_ASSERT(alt5 < alt7);
-  CPPUNIT_ASSERT(alt5 < alt8);
-  CPPUNIT_ASSERT(alt5 < alt9);
-  
-  CPPUNIT_ASSERT(alt6 > alt1);
-  CPPUNIT_ASSERT(alt6 > alt2);
-  CPPUNIT_ASSERT(alt6 > alt3);
-  CPPUNIT_ASSERT(alt6 > alt4);
-  CPPUNIT_ASSERT(alt6 > alt5);
-  CPPUNIT_ASSERT(alt6 == alt6);
-  CPPUNIT_ASSERT(alt6 < alt7);
-  CPPUNIT_ASSERT(alt6 < alt8);
-  CPPUNIT_ASSERT(alt6 < alt9);
-  
-  CPPUNIT_ASSERT(alt7 > alt1);
-  CPPUNIT_ASSERT(alt7 > alt2);
-  CPPUNIT_ASSERT(alt7 > alt3);
-  CPPUNIT_ASSERT(alt7 > alt4);
-  CPPUNIT_ASSERT(alt7 > alt5);
-  CPPUNIT_ASSERT(alt7 > alt6);
-  CPPUNIT_ASSERT(alt7 == alt7);
-  CPPUNIT_ASSERT(alt7 < alt8);
-  CPPUNIT_ASSERT(alt7 < alt9);
-  
-  CPPUNIT_ASSERT(alt8 > alt1);
-  CPPUNIT_ASSERT(alt8 > alt2);
-  CPPUNIT_ASSERT(alt8 > alt3);
-  CPPUNIT_ASSERT(alt8 > alt4);
-  CPPUNIT_ASSERT(alt8 > alt5);
-  CPPUNIT_ASSERT(alt8 > alt6);
-  CPPUNIT_ASSERT(alt8 > alt7);
-  CPPUNIT_ASSERT(alt8 == alt8);
-  CPPUNIT_ASSERT(alt8 < alt9);
-  
-  CPPUNIT_ASSERT(alt9 > alt1);
-  CPPUNIT_ASSERT(alt9 > alt2);
-  CPPUNIT_ASSERT(alt9 > alt3);
-  CPPUNIT_ASSERT(alt9 > alt4);
-  CPPUNIT_ASSERT(alt9 > alt5);
-  CPPUNIT_ASSERT(alt9 > alt6);
-  CPPUNIT_ASSERT(alt9 > alt7);
-  CPPUNIT_ASSERT(alt9 > alt8);
-  CPPUNIT_ASSERT(alt9 == alt9);
-  
-  
-  
-  CPPUNIT_ASSERT(con1 == con1);
-  CPPUNIT_ASSERT(con1 < con2);
-  CPPUNIT_ASSERT(con1 < con3);
-  CPPUNIT_ASSERT(con1 < con4);
-  CPPUNIT_ASSERT(con1 < con5);
-  CPPUNIT_ASSERT(con1 < con6);
-  CPPUNIT_ASSERT(con1 < con7);
-  CPPUNIT_ASSERT(con1 < con8);
-  CPPUNIT_ASSERT(con1 < con9);
-  
-  CPPUNIT_ASSERT(con2 > con1);
-  CPPUNIT_ASSERT(con2 == con2);
-  CPPUNIT_ASSERT(con2 < con3);
-  CPPUNIT_ASSERT(con2 < con4);
-  CPPUNIT_ASSERT(con2 < con5);
-  CPPUNIT_ASSERT(con2 < con6);
-  CPPUNIT_ASSERT(con2 < con7);
-  CPPUNIT_ASSERT(con2 < con8);
-  CPPUNIT_ASSERT(con2 < con9);
-  
-  CPPUNIT_ASSERT(con3 > con1);
-  CPPUNIT_ASSERT(con3 > con2);
-  CPPUNIT_ASSERT(con3 == con3);
-  CPPUNIT_ASSERT(con3 < con4);
-  CPPUNIT_ASSERT(con3 < con5);
-  CPPUNIT_ASSERT(con3 < con6);
-  CPPUNIT_ASSERT(con3 < con7);
-  CPPUNIT_ASSERT(con3 < con8);
-  CPPUNIT_ASSERT(con3 < con9);
-  
-  CPPUNIT_ASSERT(con4 > con1);
-  CPPUNIT_ASSERT(con4 > con2);
-  CPPUNIT_ASSERT(con4 > con3);
-  CPPUNIT_ASSERT(con4 == con4);
-  CPPUNIT_ASSERT(con4 < con5);
-  CPPUNIT_ASSERT(con4 < con6);
-  CPPUNIT_ASSERT(con4 < con7);
-  CPPUNIT_ASSERT(con4 < con8);
-  CPPUNIT_ASSERT(con4 < con9);
-  
-  CPPUNIT_ASSERT(con5 > con1);
-  CPPUNIT_ASSERT(con5 > con2);
-  CPPUNIT_ASSERT(con5 > con3);
-  CPPUNIT_ASSERT(con5 > con4);
-  CPPUNIT_ASSERT(con5 == con5);
-  CPPUNIT_ASSERT(con5 < con6);
-  CPPUNIT_ASSERT(con5 < con7);
-  CPPUNIT_ASSERT(con5 < con8);
-  CPPUNIT_ASSERT(con5 < con9);
-  
-  CPPUNIT_ASSERT(con6 > con1);
-  CPPUNIT_ASSERT(con6 > con2);
-  CPPUNIT_ASSERT(con6 > con3);
-  CPPUNIT_ASSERT(con6 > con4);
-  CPPUNIT_ASSERT(con6 > con5);
-  CPPUNIT_ASSERT(con6 == con6);
-  CPPUNIT_ASSERT(con6 < con7);
-  CPPUNIT_ASSERT(con6 < con8);
-  CPPUNIT_ASSERT(con6 < con9);
-  
-  CPPUNIT_ASSERT(con7 > con1);
-  CPPUNIT_ASSERT(con7 > con2);
-  CPPUNIT_ASSERT(con7 > con3);
-  CPPUNIT_ASSERT(con7 > con4);
-  CPPUNIT_ASSERT(con7 > con5);
-  CPPUNIT_ASSERT(con7 > con6);
-  CPPUNIT_ASSERT(con7 == con7);
-  CPPUNIT_ASSERT(con7 < con8);
-  CPPUNIT_ASSERT(con7 < con9);
-  
-  CPPUNIT_ASSERT(con8 > con1);
-  CPPUNIT_ASSERT(con8 > con2);
-  CPPUNIT_ASSERT(con8 > con3);
-  CPPUNIT_ASSERT(con8 > con4);
-  CPPUNIT_ASSERT(con8 > con5);
-  CPPUNIT_ASSERT(con8 > con6);
-  CPPUNIT_ASSERT(con8 > con7);
-  CPPUNIT_ASSERT(con8 == con8);
-  CPPUNIT_ASSERT(con8 < con9);
-  
-  CPPUNIT_ASSERT(con9 > con1);
-  CPPUNIT_ASSERT(con9 > con2);
-  CPPUNIT_ASSERT(con9 > con3);
-  CPPUNIT_ASSERT(con9 > con4);
-  CPPUNIT_ASSERT(con9 > con5);
-  CPPUNIT_ASSERT(con9 > con6);
-  CPPUNIT_ASSERT(con9 > con7);
-  CPPUNIT_ASSERT(con9 > con8);
-  CPPUNIT_ASSERT(con9 == con9);
-  
-  
-  CPPUNIT_ASSERT(ite1 == ite1);
-  CPPUNIT_ASSERT(ite1 < ite2);
-  CPPUNIT_ASSERT(ite1 < ite3);
-  
-  CPPUNIT_ASSERT(ite2 > ite1);
-  CPPUNIT_ASSERT(ite2 == ite2);
-  CPPUNIT_ASSERT(ite2 < ite3);
-  
-  CPPUNIT_ASSERT(ite3 > ite1);
-  CPPUNIT_ASSERT(ite3 > ite2);
-  CPPUNIT_ASSERT(ite3 == ite3);
-  
-
-
-  CPPUNIT_ASSERT(emp1 == emp1);
-  
-  
-  
-  CPPUNIT_ASSERT(eps1 == eps1);
-
-
-
-  CPPUNIT_ASSERT(sym1 == sym1);
-  CPPUNIT_ASSERT(sym1 < sym2);
-  CPPUNIT_ASSERT(sym1 < sym3);
-  
-  CPPUNIT_ASSERT(sym2 > sym1);
-  CPPUNIT_ASSERT(sym2 == sym2);
-  CPPUNIT_ASSERT(sym2 < sym3);
-  
-  CPPUNIT_ASSERT(sym3 > sym1);
-  CPPUNIT_ASSERT(sym3 > sym2);
-  CPPUNIT_ASSERT(sym3 == sym3);*/
+  }
 }
 
diff --git a/alib2/test-src/string/StringTest.h b/alib2/test-src/string/StringTest.h
index 5396b45b92..6f38709161 100644
--- a/alib2/test-src/string/StringTest.h
+++ b/alib2/test-src/string/StringTest.h
@@ -8,8 +8,6 @@ class StringTest : public CppUnit::TestFixture
   CPPUNIT_TEST_SUITE( StringTest );
   CPPUNIT_TEST( testEqual );
   CPPUNIT_TEST( testXMLParser );
-  CPPUNIT_TEST( testOrder );
-  CPPUNIT_TEST( testOrder2 );
   CPPUNIT_TEST_SUITE_END();
 
 public:
@@ -19,8 +17,6 @@ public:
   void testCopyConstruct();
   void testEqual();
   void testXMLParser();
-  void testOrder();
-  void testOrder2();
 };
 
 #endif  // STRING_TEST_H_
-- 
GitLab