From d84c2e3ba83f2da9a094313213b0ccfc2e9249d4 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Fri, 15 Aug 2014 21:32:15 +0200
Subject: [PATCH] Parsers and composers of base data object

---
 acat2/src/acat.cpp                            |  28 +--
 alib2data/src/Api.cpp                         | 202 +++++++++++++++++-
 alib2data/src/Api.hpp                         |  22 +-
 alib2data/src/alphabet/SymbolBase.h           |   2 +-
 .../src/alphabet/SymbolFromXMLParser.cpp      |   8 +
 alib2data/src/alphabet/SymbolFromXMLParser.h  |   9 +
 alib2data/src/automaton/AutomatonBase.h       |   2 +-
 alib2data/src/automaton/AutomatonFeatures.h   |   4 +-
 .../src/automaton/AutomatonFromXMLParser.cpp  |  25 ++-
 .../src/automaton/AutomatonFromXMLParser.h    |   2 +
 alib2data/src/exception/AlibException.cpp     |  36 ++++
 alib2data/src/exception/AlibException.h       |  24 ++-
 .../src/exception/ExceptionFromXMLParser.h    |   8 +
 alib2data/src/grammar/GrammarBase.h           |   2 +-
 .../src/grammar/GrammarFromXMLParser.cpp      |   8 +
 alib2data/src/grammar/GrammarFromXMLParser.h  |   2 +
 alib2data/src/label/LabelBase.h               |   2 +-
 alib2data/src/label/LabelFromXMLParser.cpp    |   8 +
 alib2data/src/label/LabelFromXMLParser.h      |   2 +
 alib2data/src/{ => object}/Object.h           |   4 +-
 alib2data/src/{ => object}/ObjectBase.h       |  12 +-
 alib2data/src/object/ObjectFromXMLParser.cpp  |  38 ++++
 alib2data/src/object/ObjectFromXMLParser.h    |  39 ++++
 alib2data/src/object/ObjectToXMLComposer.cpp  |  26 +++
 alib2data/src/object/ObjectToXMLComposer.h    |  40 ++++
 alib2data/src/regexp/RegExpBase.h             |   2 +-
 alib2data/src/regexp/RegExpFromXMLParser.cpp  |   8 +
 alib2data/src/regexp/RegExpFromXMLParser.h    |   2 +
 alib2data/src/sax/Token.h                     |   5 +
 alib2data/src/string/StringBase.h             |   2 +-
 alib2data/src/string/StringFromXMLParser.cpp  |   8 +
 alib2data/src/string/StringFromXMLParser.h    |   2 +
 alib2data/test-src/alphabet/SymbolTest.cpp    |   4 +-
 .../test-src/automaton/AutomatonTest.cpp      |   4 +-
 alib2data/test-src/grammar/GrammarTest.cpp    |  41 ++--
 alib2data/test-src/grammar/GrammarTest.h      |   8 +-
 alib2data/test-src/label/LabelTest.cpp        |   4 +-
 alib2data/test-src/regexp/RegExpTest.cpp      |   4 +-
 alib2data/test-src/string/StringTest.cpp      |   4 +-
 39 files changed, 568 insertions(+), 85 deletions(-)
 rename alib2data/src/{ => object}/Object.h (85%)
 rename alib2data/src/{ => object}/ObjectBase.h (94%)
 create mode 100644 alib2data/src/object/ObjectFromXMLParser.cpp
 create mode 100644 alib2data/src/object/ObjectFromXMLParser.h
 create mode 100644 alib2data/src/object/ObjectToXMLComposer.cpp
 create mode 100644 alib2data/src/object/ObjectToXMLComposer.h

diff --git a/acat2/src/acat.cpp b/acat2/src/acat.cpp
index b436bbed84..4eb63f914e 100644
--- a/acat2/src/acat.cpp
+++ b/acat2/src/acat.cpp
@@ -10,13 +10,11 @@
 #include <unistd.h>
 #include <exception>
 #include <exception/AlibException.h>
-#include <factory/AutomatonFactory.h>
-#include <factory/RegExpFactory.h>
-#include <factory/StringFactory.h>
-#include <factory/ExceptionFactory.h>
+#include <factory/DataFactory.hpp>
 #include <sax/SaxParseInterface.h>
-#include <FromXMLParsers.h>
 #include <sax/ParserException.h>
+#include <object/Object.h>
+#include <std/list.hpp>
 
 
 #define VERSION "0.0.1"
@@ -49,23 +47,11 @@ int main(int argc, char** argv) {
 			sax::SaxParseInterface::parseFile(argv[optind],tokens);
 		}
 
-		if (alib::FromXMLParsers::automatonParser.first(tokens)) {
-			automaton::Automaton automaton = automaton::AutomatonFactory::fromTokens(tokens);
-			automaton::AutomatonFactory::toStdout(automaton);
-		} else if (alib::FromXMLParsers::regexpParser.first(tokens)) {
-			regexp::RegExp regexp = regexp::RegExpFactory::fromTokens(tokens);
-			regexp::RegExpFactory::toStdout(regexp);
-		} else if (alib::FromXMLParsers::stringParser.first(tokens)) {
-			string::String string = string::StringFactory::fromTokens(tokens);
-			string::StringFactory::StringFactory::toStdout(string);
-		} else if (alib::FromXMLParsers::exceptionParser.first(tokens)) {
-			exception::AlibException exception = exception::ExceptionFactory::fromTokens(tokens);
-			exception::ExceptionFactory::toStdout(exception);
-		} else {
-			throw exception::AlibException( "Expected root tag automaton, grammar, regexp, string or exception. Read: " + tokens.front().getData());
-		}
+		alib::Object object = alib::DataFactory::fromTokens<alib::Object>(tokens);
+		alib::DataFactory::toStdout(object);
+
 	} catch(const exception::AlibException& exception) {
-		exception::ExceptionFactory::toStdout(exception);
+		alib::DataFactory::toStdout(exception);
 		return 1;
 	} catch(...) {
 		return 127;
diff --git a/alib2data/src/Api.cpp b/alib2data/src/Api.cpp
index e1bddb7299..32660945af 100644
--- a/alib2data/src/Api.cpp
+++ b/alib2data/src/Api.cpp
@@ -16,186 +16,372 @@ const string::StringFromXMLParser FromXMLParsers::stringParser;
 const automaton::AutomatonFromXMLParser FromXMLParsers::automatonParser;
 const grammar::GrammarFromXMLParser FromXMLParsers::grammarParser;
 const exception::ExceptionFromXMLParser FromXMLParsers::exceptionParser;
+const alib::ObjectFromXMLParser FromXMLParsers::objectParser;
 const container::ContainerFromXMLParser FromXMLParsers::containerParser;
 
+const label::LabelToXMLComposer ToXMLComposers::labelComposer;
+const alphabet::SymbolToXMLComposer ToXMLComposers::symbolComposer;
+const regexp::RegExpToXMLComposer ToXMLComposers::regexpComposer;
+const string::StringToXMLComposer ToXMLComposers::stringComposer;
+const automaton::AutomatonToXMLComposer ToXMLComposers::automatonComposer;
+const grammar::GrammarToXMLComposer ToXMLComposers::grammarComposer;
+const alib::ObjectToXMLComposer ToXMLComposers::objectComposer;
+const exception::ExceptionToXMLComposer ToXMLComposers::exceptionComposer;
+
+const ToXMLComposers ToXMLComposers::toXMLComposers;
+
+alib::Object api<alib::Object>::parse(std::list<sax::Token>& input) {
+	return FromXMLParsers::objectParser.parseObject(input);
+}
+
+std::list<sax::Token> api<alib::Object>::compose(const alib::Object& data) {
+	return ToXMLComposers::objectComposer.compose(data);
+}
+
+exception::AlibException api<exception::AlibException>::parse(std::list<sax::Token>& input) {
+	return FromXMLParsers::exceptionParser.parseException(input);
+}
+
+std::list<sax::Token> api<exception::AlibException>::compose(const exception::AlibException& data) {
+	return ToXMLComposers::exceptionComposer.compose(data);
+}
+
 alphabet::Symbol api<alphabet::Symbol>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::symbolParser.parseSymbol(input);
 }
 
+std::list<sax::Token> api<alphabet::Symbol>::compose(const alphabet::Symbol& data) {
+	return ToXMLComposers::symbolComposer.compose(data);
+}
+
 alphabet::LabeledSymbol api<alphabet::LabeledSymbol>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::symbolParser.parseLabeledSymbol(input);
 }
 
+std::list<sax::Token> api<alphabet::LabeledSymbol>::compose(const alphabet::LabeledSymbol& data) {
+	return ToXMLComposers::symbolComposer.compose(data);
+}
+
 alphabet::BlankSymbol api<alphabet::BlankSymbol>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::symbolParser.parseBlankSymbol(input);
 }
 
+std::list<sax::Token> api<alphabet::BlankSymbol>::compose(const alphabet::BlankSymbol& data) {
+	return ToXMLComposers::symbolComposer.compose(data);
+}
+
 alphabet::BottomOfTheStackSymbol api<alphabet::BottomOfTheStackSymbol>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::symbolParser.parseBottomOfTheStackSymbol(input);
 }
 
+std::list<sax::Token> api<alphabet::BottomOfTheStackSymbol>::compose(const alphabet::BottomOfTheStackSymbol& data) {
+	return ToXMLComposers::symbolComposer.compose(data);
+}
+
 alphabet::EndSymbol api<alphabet::EndSymbol>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::symbolParser.parseEndSymbol(input);
 }
 
+std::list<sax::Token> api<alphabet::EndSymbol>::compose(const alphabet::EndSymbol& data) {
+	return ToXMLComposers::symbolComposer.compose(data);
+}
+
 
 automaton::Automaton api<automaton::Automaton>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::automatonParser.parseAutomaton(input);
 }
 
+std::list<sax::Token> api<automaton::Automaton>::compose(const automaton::Automaton& data) {
+	return ToXMLComposers::automatonComposer.compose(data);
+}
+
 automaton::UnknownAutomaton api<automaton::UnknownAutomaton>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::automatonParser.parseUnknownAutomaton(input);
 }
 
+std::list<sax::Token> api<automaton::UnknownAutomaton>::compose(const automaton::UnknownAutomaton& data) {
+	return ToXMLComposers::automatonComposer.compose(data);
+}
+
 automaton::EpsilonNFA api<automaton::EpsilonNFA>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::automatonParser.parseEpsilonNFA(input);
 }
 
+std::list<sax::Token> api<automaton::EpsilonNFA>::compose(const automaton::EpsilonNFA& data) {
+	return ToXMLComposers::automatonComposer.compose(data);
+}
+
 automaton::NFA api<automaton::NFA>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::automatonParser.parseNFA(input);
 }
 
+std::list<sax::Token> api<automaton::NFA>::compose(const automaton::NFA& data) {
+	return ToXMLComposers::automatonComposer.compose(data);
+}
+
 automaton::DFA api<automaton::DFA>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::automatonParser.parseDFA(input);
 }
 
+std::list<sax::Token> api<automaton::DFA>::compose(const automaton::DFA& data) {
+	return ToXMLComposers::automatonComposer.compose(data);
+}
+
 automaton::ExtendedNFA api<automaton::ExtendedNFA>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::automatonParser.parseExtendedNFA(input);
 }
 
+std::list<sax::Token> api<automaton::ExtendedNFA>::compose(const automaton::ExtendedNFA& data) {
+	return ToXMLComposers::automatonComposer.compose(data);
+}
+
 automaton::CompactNFA api<automaton::CompactNFA>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::automatonParser.parseCompactNFA(input);
 }
 
+std::list<sax::Token> api<automaton::CompactNFA>::compose(const automaton::CompactNFA& data) {
+	return ToXMLComposers::automatonComposer.compose(data);
+}
+
 automaton::NPDA api<automaton::NPDA>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::automatonParser.parseNPDA(input);
 }
 
+std::list<sax::Token> api<automaton::NPDA>::compose(const automaton::NPDA& data) {
+	return ToXMLComposers::automatonComposer.compose(data);
+}
+
 automaton::SinglePopNPDA api<automaton::SinglePopNPDA>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::automatonParser.parseSinglePopNPDA(input);
 }
 
+std::list<sax::Token> api<automaton::SinglePopNPDA>::compose(const automaton::SinglePopNPDA& data) {
+	return ToXMLComposers::automatonComposer.compose(data);
+}
+
 automaton::OneTapeDTM api<automaton::OneTapeDTM>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::automatonParser.parseOneTapeDTM(input);
 }
 
+std::list<sax::Token> api<automaton::OneTapeDTM>::compose(const automaton::OneTapeDTM& data) {
+	return ToXMLComposers::automatonComposer.compose(data);
+}
+
 
 grammar::Grammar api<grammar::Grammar>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::grammarParser.parseGrammar(input);
 }
 
+std::list<sax::Token> api<grammar::Grammar>::compose(const grammar::Grammar& data) {
+	return ToXMLComposers::grammarComposer.compose(data);
+}
+
 grammar::UnknownGrammar api<grammar::UnknownGrammar>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::grammarParser.parseUnknownGrammar(input);
 }
 
+std::list<sax::Token> api<grammar::UnknownGrammar>::compose(const grammar::UnknownGrammar& data) {
+	return ToXMLComposers::grammarComposer.compose(data);
+}
+
 grammar::LeftLG api<grammar::LeftLG>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::grammarParser.parseLeftLG(input);
 }
 
+std::list<sax::Token> api<grammar::LeftLG>::compose(const grammar::LeftLG& data) {
+	return ToXMLComposers::grammarComposer.compose(data);
+}
+
 grammar::LeftRG api<grammar::LeftRG>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::grammarParser.parseLeftRG(input);
 }
 
+std::list<sax::Token> api<grammar::LeftRG>::compose(const grammar::LeftRG& data) {
+	return ToXMLComposers::grammarComposer.compose(data);
+}
+
 grammar::RightLG api<grammar::RightLG>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::grammarParser.parseRightLG(input);
 }
 
+std::list<sax::Token> api<grammar::RightLG>::compose(const grammar::RightLG& data) {
+	return ToXMLComposers::grammarComposer.compose(data);
+}
+
 grammar::RightRG api<grammar::RightRG>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::grammarParser.parseRightRG(input);
 }
 
+std::list<sax::Token> api<grammar::RightRG>::compose(const grammar::RightRG& data) {
+	return ToXMLComposers::grammarComposer.compose(data);
+}
+
 grammar::LG api<grammar::LG>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::grammarParser.parseLG(input);
 }
 
+std::list<sax::Token> api<grammar::LG>::compose(const grammar::LG& data) {
+	return ToXMLComposers::grammarComposer.compose(data);
+}
+
 grammar::CFG api<grammar::CFG>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::grammarParser.parseCFG(input);
 }
 
+std::list<sax::Token> api<grammar::CFG>::compose(const grammar::CFG& data) {
+	return ToXMLComposers::grammarComposer.compose(data);
+}
+
 grammar::EpsilonFreeCFG api<grammar::EpsilonFreeCFG>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::grammarParser.parseEpsilonFreeCFG(input);
 }
 
+std::list<sax::Token> api<grammar::EpsilonFreeCFG>::compose(const grammar::EpsilonFreeCFG& data) {
+	return ToXMLComposers::grammarComposer.compose(data);
+}
+
 grammar::CNF api<grammar::CNF>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::grammarParser.parseCNF(input);
 }
 
+std::list<sax::Token> api<grammar::CNF>::compose(const grammar::CNF& data) {
+	return ToXMLComposers::grammarComposer.compose(data);
+}
+
 grammar::GNF api<grammar::GNF>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::grammarParser.parseGNF(input);
 }
 
+std::list<sax::Token> api<grammar::GNF>::compose(const grammar::GNF& data) {
+	return ToXMLComposers::grammarComposer.compose(data);
+}
+
 grammar::CSG api<grammar::CSG>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::grammarParser.parseCSG(input);
 }
 
+std::list<sax::Token> api<grammar::CSG>::compose(const grammar::CSG& data) {
+	return ToXMLComposers::grammarComposer.compose(data);
+}
+
 grammar::NonContractingGrammar api<grammar::NonContractingGrammar>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::grammarParser.parseNonContractingGrammar(input);
 }
 
+std::list<sax::Token> api<grammar::NonContractingGrammar>::compose(const grammar::NonContractingGrammar& data) {
+	return ToXMLComposers::grammarComposer.compose(data);
+}
+
 grammar::ContextPreservingUnrestrictedGrammar api<grammar::ContextPreservingUnrestrictedGrammar>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::grammarParser.parseContextPreservingUnrestrictedGrammar(input);
 }
 
+std::list<sax::Token> api<grammar::ContextPreservingUnrestrictedGrammar>::compose(const grammar::ContextPreservingUnrestrictedGrammar& data) {
+	return ToXMLComposers::grammarComposer.compose(data);
+}
+
 grammar::UnrestrictedGrammar api<grammar::UnrestrictedGrammar>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::grammarParser.parseUnrestrictedGrammar(input);
 }
 
+std::list<sax::Token> api<grammar::UnrestrictedGrammar>::compose(const grammar::UnrestrictedGrammar& data) {
+	return ToXMLComposers::grammarComposer.compose(data);
+}
+
 
 label::Label api<label::Label>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::labelParser.parseLabel(input);
 }
 
+std::list<sax::Token> api<label::Label>::compose(const label::Label& data) {
+	return ToXMLComposers::labelComposer.compose(data);
+}
+
 label::StringLabel api<label::StringLabel>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::labelParser.parseStringLabel(input);
 }
 
+std::list<sax::Token> api<label::StringLabel>::compose(const label::StringLabel& data) {
+	return ToXMLComposers::labelComposer.compose(data);
+}
+
 label::IntegerLabel api<label::IntegerLabel>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::labelParser.parseIntegerLabel(input);
 }
 
+std::list<sax::Token> api<label::IntegerLabel>::compose(const label::IntegerLabel& data) {
+	return ToXMLComposers::labelComposer.compose(data);
+}
+
 label::CharacterLabel api<label::CharacterLabel>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::labelParser.parseCharacterLabel(input);
 }
 
+std::list<sax::Token> api<label::CharacterLabel>::compose(const label::CharacterLabel& data) {
+	return ToXMLComposers::labelComposer.compose(data);
+}
+
 
 regexp::RegExp api<regexp::RegExp>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::regexpParser.parseRegExp(input);
 }
 
+std::list<sax::Token> api<regexp::RegExp>::compose(const regexp::RegExp& data) {
+	return ToXMLComposers::regexpComposer.compose(data);
+}
+
 regexp::UnboundedRegExp api<regexp::UnboundedRegExp>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::regexpParser.parseUnboundedRegExp(input);
 }
 
+std::list<sax::Token> api<regexp::UnboundedRegExp>::compose(const regexp::UnboundedRegExp& data) {
+	return ToXMLComposers::regexpComposer.compose(data);
+}
+
 regexp::FormalRegExp api<regexp::FormalRegExp>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::regexpParser.parseFormalRegExp(input);
 }
 
+std::list<sax::Token> api<regexp::FormalRegExp>::compose(const regexp::FormalRegExp& data) {
+	return ToXMLComposers::regexpComposer.compose(data);
+}
+
 
 string::String api<string::String>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::stringParser.parseString(input);
 }
 
+std::list<sax::Token> api<string::String>::compose(const string::String& data) {
+	return ToXMLComposers::stringComposer.compose(data);
+}
+
 string::LinearString api<string::LinearString>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::stringParser.parseLinearString(input);
 }
 
+std::list<sax::Token> api<string::LinearString>::compose(const string::LinearString& data) {
+	return ToXMLComposers::stringComposer.compose(data);
+}
+
 string::CyclicString api<string::CyclicString>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::stringParser.parseCyclicString(input);
 }
 
+std::list<sax::Token> api<string::CyclicString>::compose(const string::CyclicString& data) {
+	return ToXMLComposers::stringComposer.compose(data);
+}
+
 string::Epsilon api<string::Epsilon>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::stringParser.parseEpsilon(input);
 }
 
-const label::LabelToXMLComposer ToXMLComposers::labelComposer;
-const alphabet::SymbolToXMLComposer ToXMLComposers::symbolComposer;
-const regexp::RegExpToXMLComposer ToXMLComposers::regexpComposer;
-const string::StringToXMLComposer ToXMLComposers::stringComposer;
-const automaton::AutomatonToXMLComposer ToXMLComposers::automatonComposer;
-const grammar::GrammarToXMLComposer ToXMLComposers::grammarComposer;
-const exception::ExceptionToXMLComposer ToXMLComposers::exceptionComposer;
+std::list<sax::Token> api<string::Epsilon>::compose(const string::Epsilon& data) {
+	return ToXMLComposers::stringComposer.compose(data);
+}
 
-const ToXMLComposers ToXMLComposers::toXMLComposers;
+void ToXMLComposers::Visit(void* data, const exception::AlibException& symbol) const {
+	*((std::list<sax::Token>*) data) = std::move(ToXMLComposers::exceptionComposer.compose(symbol));
+}
 
 void ToXMLComposers::Visit(void* data, const alphabet::BlankSymbol& symbol) const {
 	*((std::list<sax::Token>*) data) = std::move(ToXMLComposers::symbolComposer.compose(symbol));
diff --git a/alib2data/src/Api.hpp b/alib2data/src/Api.hpp
index 93e8bea8bf..62d7caf187 100644
--- a/alib2data/src/Api.hpp
+++ b/alib2data/src/Api.hpp
@@ -14,6 +14,7 @@
 #include "string/StringFromXMLParser.h"
 #include "automaton/AutomatonFromXMLParser.h"
 #include "grammar/GrammarFromXMLParser.h"
+#include "object/ObjectFromXMLParser.h"
 #include "exception/ExceptionFromXMLParser.h"
 
 #include "label/LabelToXMLComposer.h"
@@ -22,9 +23,10 @@
 #include "string/StringToXMLComposer.h"
 #include "automaton/AutomatonToXMLComposer.h"
 #include "grammar/GrammarToXMLComposer.h"
+#include "object/ObjectToXMLComposer.h"
 #include "exception/ExceptionToXMLComposer.h"
 
-#include "ObjectBase.h"
+#include "object/ObjectBase.h"
 
 namespace alib {
 
@@ -41,6 +43,20 @@ struct api<std::set<T>> {
 };
 
 
+template<>
+struct api<alib::Object> {
+	static alib::Object parse(std::list<sax::Token>& input);
+	static std::list<sax::Token> compose(const alib::Object& data);
+};
+
+
+template<>
+struct api<exception::AlibException> {
+	static exception::AlibException parse(std::list<sax::Token>& input);
+	static std::list<sax::Token> compose(const exception::AlibException& data);
+};
+
+
 template<>
 struct api<alphabet::Symbol> {
 	static alphabet::Symbol parse(std::list<sax::Token>& input);
@@ -313,11 +329,14 @@ public:
 	static const automaton::AutomatonFromXMLParser automatonParser;
 	static const grammar::GrammarFromXMLParser grammarParser;
 	static const exception::ExceptionFromXMLParser exceptionParser;
+	static const alib::ObjectFromXMLParser objectParser;
 	static const container::ContainerFromXMLParser containerParser;
 
 };
 
 class ToXMLComposers : public ObjectBase::const_visitor_type {
+	void Visit(void*, const exception::AlibException& symbol) const;
+
 	void Visit(void*, const alphabet::LabeledSymbol& symbol) const;
 	void Visit(void*, const alphabet::BlankSymbol& symbol) const;
 	void Visit(void*, const alphabet::BottomOfTheStackSymbol& symbol) const;
@@ -367,6 +386,7 @@ public:
 	static const automaton::AutomatonToXMLComposer automatonComposer;
 	static const grammar::GrammarToXMLComposer grammarComposer;
 	static const exception::ExceptionToXMLComposer exceptionComposer;
+	static const alib::ObjectToXMLComposer objectComposer;
 	static const container::ContainerToXMLComposer containerComposer;
 
 	static const ToXMLComposers toXMLComposers;
diff --git a/alib2data/src/alphabet/SymbolBase.h b/alib2data/src/alphabet/SymbolBase.h
index d02fa37079..6e3fd5987d 100644
--- a/alib2data/src/alphabet/SymbolBase.h
+++ b/alib2data/src/alphabet/SymbolBase.h
@@ -9,7 +9,7 @@
 #define SYMBOL_BASE_H_
 
 #include "../common/base.hpp"
-#include "../ObjectBase.h"
+#include "../object/ObjectBase.h"
 
 namespace alphabet {
 
diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.cpp b/alib2data/src/alphabet/SymbolFromXMLParser.cpp
index f7818b4def..7a52c7f076 100644
--- a/alib2data/src/alphabet/SymbolFromXMLParser.cpp
+++ b/alib2data/src/alphabet/SymbolFromXMLParser.cpp
@@ -36,6 +36,14 @@ Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std:
 	}
 }
 
+bool SymbolFromXMLParser::first(std::list<sax::Token>& input) const {
+	if(isToken(input, sax::Token::TokenType::START_ELEMENT, "LabeledSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "BlankSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "BottomOfTheStackSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "EndSymbol")) {
+		return true;
+	} else {
+		return false;
+	}
+}
+
 LabeledSymbol SymbolFromXMLParser::parseLabeledSymbol(std::list<sax::Token>& input) const {
 	popToken(input, sax::Token::TokenType::START_ELEMENT, "LabeledSymbol");
 	label::Label data = alib::FromXMLParsers::labelParser.parseLabel(input);
diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.h b/alib2data/src/alphabet/SymbolFromXMLParser.h
index e737392965..3d337b147a 100644
--- a/alib2data/src/alphabet/SymbolFromXMLParser.h
+++ b/alib2data/src/alphabet/SymbolFromXMLParser.h
@@ -52,6 +52,12 @@ class GrammarFromXMLParser;
 
 } /* namespace grammar */
 
+namespace alib {
+
+class ObjectFromXMLParser;
+
+} /* namespace grammar */
+
 namespace alphabet {
 
 /**
@@ -70,8 +76,11 @@ class SymbolFromXMLParser : public sax::FromXMLParserHelper {
 	friend class regexp::RegExpFromXMLParser;
 	friend class automaton::AutomatonFromXMLParser;
 	friend class grammar::GrammarFromXMLParser;
+	friend class alib::ObjectFromXMLParser;
 
 	template<typename T> friend class alib::api;
+public:
+	bool first(std::list<sax::Token>& input) const;
 };
 
 } /* namespace alphabet */
diff --git a/alib2data/src/automaton/AutomatonBase.h b/alib2data/src/automaton/AutomatonBase.h
index a971cf3ebc..813a874ce5 100644
--- a/alib2data/src/automaton/AutomatonBase.h
+++ b/alib2data/src/automaton/AutomatonBase.h
@@ -9,7 +9,7 @@
 #define AUTOMATON_BASE_H_
 
 #include "../common/base.hpp"
-#include "../ObjectBase.h"
+#include "../object/ObjectBase.h"
 
 namespace automaton {
 
diff --git a/alib2data/src/automaton/AutomatonFeatures.h b/alib2data/src/automaton/AutomatonFeatures.h
index 9d2b9f8751..cc71a8a1a5 100644
--- a/alib2data/src/automaton/AutomatonFeatures.h
+++ b/alib2data/src/automaton/AutomatonFeatures.h
@@ -18,8 +18,8 @@ enum class FEATURES {
 	COMPACT_NFA,
 	EXTENDED_NFA,
 	NPDA,
-	SINGLE_POP_NDPA,
-	ONE_TAPE_TM
+	SINGLE_POP_NPDA,
+	ONE_TAPE_DTM
 };
 
 } /* namespace automaton */
diff --git a/alib2data/src/automaton/AutomatonFromXMLParser.cpp b/alib2data/src/automaton/AutomatonFromXMLParser.cpp
index 7a4291604b..44441c3784 100644
--- a/alib2data/src/automaton/AutomatonFromXMLParser.cpp
+++ b/alib2data/src/automaton/AutomatonFromXMLParser.cpp
@@ -18,7 +18,7 @@
 namespace automaton {
 
 Automaton AutomatonFromXMLParser::parseAutomaton(std::list<sax::Token> &input) const {
-	return parseAutomaton(input, std::set<FEATURES>({FEATURES::AUTOMATON, FEATURES::EPSILON_NFA, FEATURES::NFA, FEATURES::DFA, FEATURES::COMPACT_NFA, FEATURES::EXTENDED_NFA, FEATURES::NPDA, FEATURES::SINGLE_POP_NDPA, FEATURES::ONE_TAPE_TM}));
+	return parseAutomaton(input, std::set<FEATURES>({FEATURES::AUTOMATON, FEATURES::EPSILON_NFA, FEATURES::NFA, FEATURES::DFA, FEATURES::COMPACT_NFA, FEATURES::EXTENDED_NFA, FEATURES::NPDA, FEATURES::SINGLE_POP_NPDA, FEATURES::ONE_TAPE_DTM}));
 }
 
 Automaton AutomatonFromXMLParser::parseAutomaton(std::list<sax::Token>& input, const std::set<FEATURES>& features) const {
@@ -34,10 +34,33 @@ Automaton AutomatonFromXMLParser::parseAutomaton(std::list<sax::Token>& input, c
 	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "DFA")) {
 		if(!features.count(FEATURES::DFA)) throw exception::AlibException();
 		return Automaton(parseDFA(input));
+	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "CompactNFA")) {
+		if(!features.count(FEATURES::COMPACT_NFA)) throw exception::AlibException();
+		return Automaton(parseCompactNFA(input));
+	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "ExtendedNFA")) {
+		if(!features.count(FEATURES::EXTENDED_NFA)) throw exception::AlibException();
+		return Automaton(parseExtendedNFA(input));
+	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "NPDA")) {
+		if(!features.count(FEATURES::NPDA)) throw exception::AlibException();
+		return Automaton(parseNPDA(input));
+	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "SinglePopNPDA")) {
+		if(!features.count(FEATURES::SINGLE_POP_NPDA)) throw exception::AlibException();
+		return Automaton(parseSinglePopNPDA(input));
+	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "OneTapeDTM")) {
+		if(!features.count(FEATURES::ONE_TAPE_DTM)) throw exception::AlibException();
+		return Automaton(parseOneTapeDTM(input));
 	} else
 		throw sax::ParserException(sax::Token("Automaton / EpsilonNFA / NFA / DFA", sax::Token::TokenType::START_ELEMENT), input.front());
 }
 
+bool AutomatonFromXMLParser::first(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 true;
+	} else {
+		return false;
+	}
+}
+
 UnknownAutomaton AutomatonFromXMLParser::parseUnknownAutomaton(std::list<sax::Token> &input) const {
 	UnknownAutomaton automaton;
 
diff --git a/alib2data/src/automaton/AutomatonFromXMLParser.h b/alib2data/src/automaton/AutomatonFromXMLParser.h
index 12faa322a5..58416fefb5 100644
--- a/alib2data/src/automaton/AutomatonFromXMLParser.h
+++ b/alib2data/src/automaton/AutomatonFromXMLParser.h
@@ -96,6 +96,8 @@ class AutomatonFromXMLParser : public sax::FromXMLParserHelper {
 	OneTapeDTM parseOneTapeDTM(std::list<sax::Token>& input) const;
 
 	template<typename T> friend class alib::api;
+public:
+	bool first(std::list<sax::Token>& input) const;
 };
 
 } /* namespace automaton */
diff --git a/alib2data/src/exception/AlibException.cpp b/alib2data/src/exception/AlibException.cpp
index cd127dc59a..c2106dd6dc 100644
--- a/alib2data/src/exception/AlibException.cpp
+++ b/alib2data/src/exception/AlibException.cpp
@@ -33,6 +33,14 @@ AlibException::~AlibException ( ) noexcept {
 
 }
 
+alib::ObjectBase* AlibException::clone() const {
+	return new AlibException(*this);
+}
+
+alib::ObjectBase* AlibException::plunder() && {
+	return new AlibException(std::move(*this));
+}
+
 const char * AlibException::what ( ) const noexcept {
 	return whatMessage.c_str ( );
 }
@@ -45,4 +53,32 @@ const std::string & AlibException::getBacktrace ( ) const {
 	return backtrace;
 }
 
+bool AlibException::operator==(const ObjectBase& other) const {
+	return other == *this;
+}
+
+bool AlibException::operator<(const ObjectBase& other) const {
+	return other > *this;
+}
+
+bool AlibException::operator>(const ObjectBase& other) const {
+	return other < *this;
+}
+
+bool AlibException::operator==(const AlibException& other) const {
+	return this->whatMessage == other.whatMessage;
+}
+
+bool AlibException::operator<(const AlibException& other) const {
+	return this->whatMessage < other.whatMessage;
+}
+
+void AlibException::operator>>(std::ostream& os) const {
+	os << this->whatMessage;
+}
+
+AlibException::operator std::string() const {
+	return this->whatMessage;
+}
+
 } /* namespace exception */
diff --git a/alib2data/src/exception/AlibException.h b/alib2data/src/exception/AlibException.h
index 919f889c92..99c8aacee3 100644
--- a/alib2data/src/exception/AlibException.h
+++ b/alib2data/src/exception/AlibException.h
@@ -11,13 +11,15 @@
 #include <exception>
 #include <string>
 
+#include "../object/ObjectBase.h"
+
 namespace exception {
 
 /**
  * Basic exception from which are derived all other exceptions.
  * Contains reason why the exception occured.
  */
-class AlibException : public std::exception {
+class AlibException : public std::exception, public std::element<AlibException, alib::ObjectBase> {
 protected:
 
 	std::string cause;
@@ -29,6 +31,10 @@ public:
 	explicit AlibException ( const std::string & cause );
 	virtual ~AlibException ( ) noexcept;
 
+	virtual alib::ObjectBase* clone() const;
+	
+	virtual alib::ObjectBase* plunder() &&;
+
 	/**
 	 * @return reason why the exception occured
 	 */
@@ -43,7 +49,21 @@ public:
 	 * @return reason why the exception occured
 	 */
 	const std::string & getBacktrace ( ) const;
-	
+
+	virtual bool operator>(const ObjectBase& other) const;
+	virtual bool operator==(const ObjectBase& other) const;
+	virtual bool operator<(const ObjectBase& other) const;
+
+	virtual bool operator==(const AlibException& other) const;
+	virtual bool operator<(const AlibException& other) const;
+
+	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string() const;
+
+	virtual int selfTypeId() const {
+		return typeId(*this);
+	}
 };
 
 } /* namespace exception */
diff --git a/alib2data/src/exception/ExceptionFromXMLParser.h b/alib2data/src/exception/ExceptionFromXMLParser.h
index ee94c2a235..ce3eb59114 100644
--- a/alib2data/src/exception/ExceptionFromXMLParser.h
+++ b/alib2data/src/exception/ExceptionFromXMLParser.h
@@ -21,6 +21,12 @@ struct api;
 
 } /* namespace alib */
 
+namespace alib {
+
+class ObjectFromXMLParser;
+
+}
+
 namespace exception {
 
 /**
@@ -33,6 +39,8 @@ class ExceptionFromXMLParser : public sax::FromXMLParserHelper {
 public:
 	bool first(std::list<sax::Token>& input) const;
 
+	friend class alib::ObjectFromXMLParser;
+
 	template<typename T> friend class alib::api;
 };
 
diff --git a/alib2data/src/grammar/GrammarBase.h b/alib2data/src/grammar/GrammarBase.h
index 05c981afd3..89e0d590ad 100644
--- a/alib2data/src/grammar/GrammarBase.h
+++ b/alib2data/src/grammar/GrammarBase.h
@@ -9,7 +9,7 @@
 #define GRAMMAR_BASE_H_
 
 #include "../common/base.hpp"
-#include "../ObjectBase.h"
+#include "../object/ObjectBase.h"
 
 namespace grammar {
 
diff --git a/alib2data/src/grammar/GrammarFromXMLParser.cpp b/alib2data/src/grammar/GrammarFromXMLParser.cpp
index 67c88b1626..55685e9d1c 100644
--- a/alib2data/src/grammar/GrammarFromXMLParser.cpp
+++ b/alib2data/src/grammar/GrammarFromXMLParser.cpp
@@ -65,6 +65,14 @@ Grammar GrammarFromXMLParser::parseGrammar(std::list<sax::Token>& input, const s
 		throw sax::ParserException(sax::Token("Grammar / UnrestrictedGrammar", sax::Token::TokenType::START_ELEMENT), input.front());
 }
 
+bool GrammarFromXMLParser::first(std::list<sax::Token>& input) const {
+	if(isToken(input, sax::Token::TokenType::START_ELEMENT, "grammar") || isToken(input, sax::Token::TokenType::START_ELEMENT, "UnrestrictedGrammar") || isToken(input, sax::Token::TokenType::START_ELEMENT, "ContextPreservingUnrestrictedGrammar") || isToken(input, sax::Token::TokenType::START_ELEMENT, "NonContractingGrammar") || isToken(input, sax::Token::TokenType::START_ELEMENT, "CSG") || isToken(input, sax::Token::TokenType::START_ELEMENT, "GNF") || isToken(input, sax::Token::TokenType::START_ELEMENT, "CNF") || isToken(input, sax::Token::TokenType::START_ELEMENT, "EpsilonFreeCFG") || isToken(input, sax::Token::TokenType::START_ELEMENT, "CFG") || isToken(input, sax::Token::TokenType::START_ELEMENT, "LG") || isToken(input, sax::Token::TokenType::START_ELEMENT, "RightRG") || isToken(input, sax::Token::TokenType::START_ELEMENT, "RightLG") || isToken(input, sax::Token::TokenType::START_ELEMENT, "LeftLG") || isToken(input, sax::Token::TokenType::START_ELEMENT, "LeftLG")) {
+		return true;
+	} else {
+		return false;
+	}
+}
+
 UnknownGrammar GrammarFromXMLParser::parseUnknownGrammar(std::list<sax::Token> &input) const {
 	UnknownGrammar grammar;
 
diff --git a/alib2data/src/grammar/GrammarFromXMLParser.h b/alib2data/src/grammar/GrammarFromXMLParser.h
index 97d5423ef5..b0d63f7ad9 100644
--- a/alib2data/src/grammar/GrammarFromXMLParser.h
+++ b/alib2data/src/grammar/GrammarFromXMLParser.h
@@ -94,6 +94,8 @@ class GrammarFromXMLParser : public sax::FromXMLParserHelper {
 	LeftLG parseLeftLG(std::list<sax::Token>& input) const;
 
 	template<typename T> friend class alib::api;
+public:
+	bool first(std::list<sax::Token>& input) const;
 };
 
 } /* namespace grammar */
diff --git a/alib2data/src/label/LabelBase.h b/alib2data/src/label/LabelBase.h
index 30a9edc1b7..6e152e5bb0 100644
--- a/alib2data/src/label/LabelBase.h
+++ b/alib2data/src/label/LabelBase.h
@@ -9,7 +9,7 @@
 #define LABEL_BASE_H_
 
 #include "../common/base.hpp"
-#include "../ObjectBase.h"
+#include "../object/ObjectBase.h"
 
 namespace label {
 
diff --git a/alib2data/src/label/LabelFromXMLParser.cpp b/alib2data/src/label/LabelFromXMLParser.cpp
index 6934026a81..dd185a4a12 100644
--- a/alib2data/src/label/LabelFromXMLParser.cpp
+++ b/alib2data/src/label/LabelFromXMLParser.cpp
@@ -30,6 +30,14 @@ Label LabelFromXMLParser::parseLabel(std::list<sax::Token>& input, const std::se
 	}
 }
 
+bool LabelFromXMLParser::first(std::list<sax::Token>& input) const {
+	if(isToken(input, sax::Token::TokenType::START_ELEMENT, "IntegerLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "StringLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "CharacterLabel")) {
+		return true;
+	} else {
+		return false;
+	}
+}
+
 IntegerLabel LabelFromXMLParser::parseIntegerLabel(std::list<sax::Token>& input) const {
 	popToken(input, sax::Token::TokenType::START_ELEMENT, "IntegerLabel");
 	IntegerLabel data(std::stoi(popTokenData(input, sax::Token::TokenType::CHARACTER)));
diff --git a/alib2data/src/label/LabelFromXMLParser.h b/alib2data/src/label/LabelFromXMLParser.h
index 87eb3e64cb..8f3f27c3d8 100644
--- a/alib2data/src/label/LabelFromXMLParser.h
+++ b/alib2data/src/label/LabelFromXMLParser.h
@@ -56,6 +56,8 @@ class LabelFromXMLParser : public sax::FromXMLParserHelper {
 	friend class automaton::AutomatonFromXMLParser;
 
 	template<typename T> friend class alib::api;
+public:
+	bool first(std::list<sax::Token>& input) const;
 };
 
 } /* namespace label */
diff --git a/alib2data/src/Object.h b/alib2data/src/object/Object.h
similarity index 85%
rename from alib2data/src/Object.h
rename to alib2data/src/object/Object.h
index f3259651bc..a41fa5c3f9 100644
--- a/alib2data/src/Object.h
+++ b/alib2data/src/object/Object.h
@@ -11,14 +11,14 @@
 #include "ObjectBase.h"
 #include "../common/wrapper.hpp"
 
-namespace grammar {
+namespace alib {
 
 /**
  * Wrapper around object.
  */
 typedef alib::wrapper<ObjectBase> Object;
 
-} /* namespace grammar */
+} /* namespace alib */
 
 #endif /* OBJECT_H_ */
 
diff --git a/alib2data/src/ObjectBase.h b/alib2data/src/object/ObjectBase.h
similarity index 94%
rename from alib2data/src/ObjectBase.h
rename to alib2data/src/object/ObjectBase.h
index e07509fe71..62015e9d53 100644
--- a/alib2data/src/ObjectBase.h
+++ b/alib2data/src/object/ObjectBase.h
@@ -8,8 +8,14 @@
 #ifndef OBJECT_BASE_H_
 #define OBJECT_BASE_H_
 
-#include "std/visitor.hpp"
-#include "common/base.hpp"
+#include "../std/visitor.hpp"
+#include "../common/base.hpp"
+
+namespace exception {
+
+class AlibException;
+
+}
 
 namespace automaton {
 
@@ -81,6 +87,7 @@ namespace alib {
 class ObjectBase :
 	public alib::base<
 			ObjectBase,
+			exception::AlibException,
 			automaton::UnknownAutomaton, automaton::DFA, automaton::NFA, automaton::EpsilonNFA, automaton::CompactNFA, automaton::ExtendedNFA, automaton::NPDA, automaton::SinglePopNPDA, automaton::OneTapeDTM,
 			grammar::UnknownGrammar, grammar::LeftLG, grammar::LeftRG, grammar::RightLG, grammar::RightRG, grammar::LG, grammar::CFG, grammar::EpsilonFreeCFG, grammar::CNF, grammar::GNF, grammar::CSG, grammar::NonContractingGrammar, grammar::ContextPreservingUnrestrictedGrammar, grammar::UnrestrictedGrammar,
 			label::StringLabel, label::IntegerLabel, label::CharacterLabel,
@@ -89,6 +96,7 @@ class ObjectBase :
 			alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol
 	>,
 	public std::elementBase<
+			exception::AlibException,
 			automaton::UnknownAutomaton, automaton::DFA, automaton::NFA, automaton::EpsilonNFA, automaton::CompactNFA, automaton::ExtendedNFA, automaton::NPDA, automaton::SinglePopNPDA, automaton::OneTapeDTM,
 			grammar::UnknownGrammar, grammar::LeftLG, grammar::LeftRG, grammar::RightLG, grammar::RightRG, grammar::LG, grammar::CFG, grammar::EpsilonFreeCFG, grammar::CNF, grammar::GNF, grammar::CSG, grammar::NonContractingGrammar, grammar::ContextPreservingUnrestrictedGrammar, grammar::UnrestrictedGrammar,
 			label::StringLabel, label::IntegerLabel, label::CharacterLabel,
diff --git a/alib2data/src/object/ObjectFromXMLParser.cpp b/alib2data/src/object/ObjectFromXMLParser.cpp
new file mode 100644
index 0000000000..07e5dab739
--- /dev/null
+++ b/alib2data/src/object/ObjectFromXMLParser.cpp
@@ -0,0 +1,38 @@
+/*
+ * ObjectFromXMLParser.cpp
+ *
+ *  Created on: Nov 23, 2013
+ *      Author: Jan Travnicek
+ */
+
+#include "ObjectFromXMLParser.h"
+
+#include "../sax/ParserException.h"
+
+#include "../Api.hpp"
+#include <iostream>
+
+namespace alib {
+
+Object ObjectFromXMLParser::parseObject(std::list<sax::Token>& input) const {
+	ObjectBase* tmp;
+
+	if(alib::FromXMLParsers::symbolParser.first(input)) {
+		alphabet::Symbol symbol = alib::FromXMLParsers::symbolParser.parseSymbol(input);
+		tmp = std::move(symbol.getData()).plunder();
+	} else if(alib::FromXMLParsers::exceptionParser.first(input)) {
+		exception::AlibException exception = alib::FromXMLParsers::exceptionParser.parseException(input);
+		tmp = std::move(exception).plunder();
+	} else {
+		throw exception::AlibException("Unknown element in xml");
+	}
+	Object res {std::move(*tmp)};
+	delete tmp;
+	return res;
+}
+
+bool ObjectFromXMLParser::first(std::list<sax::Token>& input) {
+	return alib::FromXMLParsers::symbolParser.first(input) || alib::FromXMLParsers::exceptionParser.first(input);
+}
+
+} /* namespace alib */
diff --git a/alib2data/src/object/ObjectFromXMLParser.h b/alib2data/src/object/ObjectFromXMLParser.h
new file mode 100644
index 0000000000..6946756c2a
--- /dev/null
+++ b/alib2data/src/object/ObjectFromXMLParser.h
@@ -0,0 +1,39 @@
+/*
+ * ObjectFromXMLParser.h
+ *
+ *  Created on: Nov 23, 2013
+ *      Author: Jan Travnicek
+ */
+
+#ifndef OBJECT_FROM_XML_PARSER_H_
+#define OBJECT_FROM_XML_PARSER_H_
+
+#include "../sax/FromXMLParserHelper.h"
+#include <set>
+#include "Object.h"
+#include "../sax/Token.h"
+#include "../label/Label.h"
+
+namespace alib {
+
+template<typename T>
+struct api;
+
+} /* namespace alib */
+
+namespace alib {
+
+/**
+ * Parser used to get String from XML parsed into list of tokens.
+ */
+class ObjectFromXMLParser : public sax::FromXMLParserHelper {
+	Object parseObject(std::list<sax::Token>& input) const;
+
+	template<typename T> friend class alib::api;
+public:
+	static bool first(std::list<sax::Token>& input);
+};
+
+} /* namespace alib */
+
+#endif /* OBJECT_FROM_XML_PARSER_H_ */
diff --git a/alib2data/src/object/ObjectToXMLComposer.cpp b/alib2data/src/object/ObjectToXMLComposer.cpp
new file mode 100644
index 0000000000..97bedbf9af
--- /dev/null
+++ b/alib2data/src/object/ObjectToXMLComposer.cpp
@@ -0,0 +1,26 @@
+/*
+ * ObjectToXMLComposer.cpp
+ *
+ *  Created on: Nov 23, 2013
+ *      Author: Jan Travnicek
+ */
+
+#include "ObjectToXMLComposer.h"
+
+#include "../Api.hpp"
+
+namespace alib {
+
+std::list<sax::Token> ObjectToXMLComposer::compose(const Object& object) const {
+	std::list<sax::Token> out;
+	object.getData().Accept((void*) &out, alib::ToXMLComposers::toXMLComposers);
+	return out;
+}
+
+std::list<sax::Token> ObjectToXMLComposer::compose(const ObjectBase& object) const {
+	std::list<sax::Token> out;
+	object.Accept((void*) &out, alib::ToXMLComposers::toXMLComposers);
+	return out;
+}
+
+} /* namespace alib */
diff --git a/alib2data/src/object/ObjectToXMLComposer.h b/alib2data/src/object/ObjectToXMLComposer.h
new file mode 100644
index 0000000000..19716a87e5
--- /dev/null
+++ b/alib2data/src/object/ObjectToXMLComposer.h
@@ -0,0 +1,40 @@
+/*
+ * ObjectToXMLComposer.h
+ *
+ *  Created on: Nov 23, 2013
+ *      Author: Jan Travnciek
+ */
+
+#ifndef OBJECT_TO_XML_COMPOSER_H_
+#define OBJECT_TO_XML_COMPOSER_H_
+
+#include <list>
+#include "Object.h"
+#include "../sax/Token.h"
+#include "../label/Label.h"
+
+namespace alib {
+
+/**
+ * This class contains methods to print XML representation of string to the output stream.
+ */
+class ObjectToXMLComposer {
+public:
+	/**
+	 * Prints XML representation of UnknownAutomaton to the output stream.
+	 * @param automaton automaton to print
+	 * @return list of xml tokens representing the automaton
+	 */
+	std::list<sax::Token> compose(const ObjectBase& object) const;
+
+	/**
+	 * Prints XML representation of String to the output stream.
+	 * @param string String to print
+	 * @param out output stream to which print the String
+	 */
+	std::list<sax::Token> compose(const Object& object) const;
+};
+
+} /* namespace alib */
+
+#endif /* OBJECT_TO_XML_COMPOSER_H_ */
diff --git a/alib2data/src/regexp/RegExpBase.h b/alib2data/src/regexp/RegExpBase.h
index e6838c07f0..27579143a1 100644
--- a/alib2data/src/regexp/RegExpBase.h
+++ b/alib2data/src/regexp/RegExpBase.h
@@ -9,7 +9,7 @@
 #define REG_EXP_BASE_H_
 
 #include "../common/base.hpp"
-#include "../ObjectBase.h"
+#include "../object/ObjectBase.h"
 
 namespace regexp {
 
diff --git a/alib2data/src/regexp/RegExpFromXMLParser.cpp b/alib2data/src/regexp/RegExpFromXMLParser.cpp
index 93aa149743..c795da2147 100644
--- a/alib2data/src/regexp/RegExpFromXMLParser.cpp
+++ b/alib2data/src/regexp/RegExpFromXMLParser.cpp
@@ -28,6 +28,14 @@ RegExp RegExpFromXMLParser::parseRegExp(std::list<sax::Token>& input, const std:
 	throw exception::AlibException();
 }
 
+bool RegExpFromXMLParser::first(std::list<sax::Token>& input) const {
+	if(isToken(input, sax::Token::TokenType::START_ELEMENT, "unboundedRegexp") || isToken(input, sax::Token::TokenType::START_ELEMENT, "formalRegexp")) {
+		return true;
+	} else {
+		return false;
+	}
+}
+
 UnboundedRegExp RegExpFromXMLParser::parseUnboundedRegExp(std::list<sax::Token>& input) const {
 	popToken(input, sax::Token::TokenType::START_ELEMENT, "unboundedRegexp");
 
diff --git a/alib2data/src/regexp/RegExpFromXMLParser.h b/alib2data/src/regexp/RegExpFromXMLParser.h
index c57f4c5569..90779c709c 100644
--- a/alib2data/src/regexp/RegExpFromXMLParser.h
+++ b/alib2data/src/regexp/RegExpFromXMLParser.h
@@ -63,6 +63,8 @@ class RegExpFromXMLParser : public sax::FromXMLParserHelper {
 	friend class automaton::AutomatonFromXMLParser;
 
 	template<typename T> friend class alib::api;
+public:
+	bool first(std::list<sax::Token>& input) const;
 };
 
 } /* namespace regexp */
diff --git a/alib2data/src/sax/Token.h b/alib2data/src/sax/Token.h
index b0a88aed07..6987699f7f 100644
--- a/alib2data/src/sax/Token.h
+++ b/alib2data/src/sax/Token.h
@@ -43,6 +43,11 @@ public:
 	TokenType getType() const;
 
 	bool operator==(const Token& other) const;
+
+	friend std::ostream& operator<<(std::ostream& os, const Token& token) {
+		os << token.data; //TODO
+		return os;
+	}
 };
 
 } /* namespace sax */
diff --git a/alib2data/src/string/StringBase.h b/alib2data/src/string/StringBase.h
index 0847a7cb05..f257a8f7e1 100644
--- a/alib2data/src/string/StringBase.h
+++ b/alib2data/src/string/StringBase.h
@@ -9,7 +9,7 @@
 #define STRING_BASE_H_
 
 #include "../std/visitor.hpp"
-#include "../ObjectBase.h"
+#include "../object/ObjectBase.h"
 
 namespace string {
 
diff --git a/alib2data/src/string/StringFromXMLParser.cpp b/alib2data/src/string/StringFromXMLParser.cpp
index 4f8fc8e267..6db03f225f 100644
--- a/alib2data/src/string/StringFromXMLParser.cpp
+++ b/alib2data/src/string/StringFromXMLParser.cpp
@@ -31,6 +31,14 @@ String StringFromXMLParser::parseString(std::list<sax::Token>& input, const std:
 	}
 }
 
+bool StringFromXMLParser::first(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 true;
+	} else {
+		return false;
+	}
+}
+
 LinearString StringFromXMLParser::parseLinearString(std::list<sax::Token>& input) const {
 	popToken(input, sax::Token::TokenType::START_ELEMENT, "LinearString");
 
diff --git a/alib2data/src/string/StringFromXMLParser.h b/alib2data/src/string/StringFromXMLParser.h
index c8b814d66d..9ccf9dbfbe 100644
--- a/alib2data/src/string/StringFromXMLParser.h
+++ b/alib2data/src/string/StringFromXMLParser.h
@@ -51,6 +51,8 @@ class StringFromXMLParser : public sax::FromXMLParserHelper {
 	friend class automaton::AutomatonFromXMLParser;
 
 	template<typename T> friend class alib::api;
+public:
+	bool first(std::list<sax::Token>& input) const;
 };
 
 } /* namespace string */
diff --git a/alib2data/test-src/alphabet/SymbolTest.cpp b/alib2data/test-src/alphabet/SymbolTest.cpp
index e9032d9c4f..72453b6fc5 100644
--- a/alib2data/test-src/alphabet/SymbolTest.cpp
+++ b/alib2data/test-src/alphabet/SymbolTest.cpp
@@ -113,12 +113,12 @@ void SymbolTest::testXMLParser() {
   
 	CPPUNIT_ASSERT( symbol == symbol2 );
   }
-/*  {
+  {
 	std::string tmp = alib::DataFactory::toString(symbol);
 	alphabet::Symbol symbol2 = alib::DataFactory::fromString<alphabet::Symbol>(tmp);
   
 	CPPUNIT_ASSERT( symbol == symbol2 );
-  }*/
+  }
 }
 
 void SymbolTest::testOrder() {
diff --git a/alib2data/test-src/automaton/AutomatonTest.cpp b/alib2data/test-src/automaton/AutomatonTest.cpp
index 5c538988be..59661c2160 100644
--- a/alib2data/test-src/automaton/AutomatonTest.cpp
+++ b/alib2data/test-src/automaton/AutomatonTest.cpp
@@ -49,12 +49,12 @@ void AutomatonTest::testXMLParser() {
 
 	CPPUNIT_ASSERT( automaton == automaton2 );
   }
-/*  {
+  {
 	std::string tmp = alib::DataFactory::toString(automaton);
 	automaton::Automaton automaton2 = alib::DataFactory::fromString<automaton::Automaton>(tmp);
 
 	CPPUNIT_ASSERT( automaton == automaton2.getData() );
-  }*/
+  }
 }
 
 void AutomatonTest::testDFAParser() {
diff --git a/alib2data/test-src/grammar/GrammarTest.cpp b/alib2data/test-src/grammar/GrammarTest.cpp
index ffa3a22c18..784c7b2afa 100644
--- a/alib2data/test-src/grammar/GrammarTest.cpp
+++ b/alib2data/test-src/grammar/GrammarTest.cpp
@@ -46,14 +46,14 @@ void GrammarTest::testXMLParser() {
 
 	CPPUNIT_ASSERT( grammar == grammar2 );
   }
-/*  {
+  {
 	std::string tmp = alib::DataFactory::toString(grammar);
 	grammar::Grammar grammar2 = alib::DataFactory::fromString<grammar::Grammar>(tmp);
 
 	CPPUNIT_ASSERT( grammar == grammar2.getData() );
-  }*/
+  }
 }
-/* TODO uncomment
+
 void GrammarTest::testUnrestrictedParser() {
   grammar::UnrestrictedGrammar grammar(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1)))));
 
@@ -80,8 +80,7 @@ void GrammarTest::testUnrestrictedParser() {
 
 	std::list<sax::Token> tokens2;
 	sax::SaxParseInterface::parseMemory(tmp, tokens2);
-	grammar::GrammarFromXMLParser parser;
-	grammar::UnrestrictedGrammar grammar2 = parser.parseUnrestrictedGrammar(tokens2);
+	grammar::UnrestrictedGrammar grammar2 = alib::DataFactory::fromTokens<grammar::UnrestrictedGrammar>(tokens2);
 
 	CPPUNIT_ASSERT( grammar == grammar2 );
   }
@@ -108,8 +107,7 @@ void GrammarTest::testUnrestrictedParser() {
 
 	std::list<sax::Token> tokens2;
 	sax::SaxParseInterface::parseMemory(tmp, tokens2);
-	grammar::GrammarFromXMLParser parser;
-	grammar::ContextPreservingUnrestrictedGrammar grammar2 = parser.parseContextPreservingUnrestrictedGrammar(tokens2);
+	grammar::ContextPreservingUnrestrictedGrammar grammar2 = alib::DataFactory::fromTokens<grammar::ContextPreservingUnrestrictedGrammar>(tokens2);
 
 	CPPUNIT_ASSERT( grammar == grammar2 );
     }
@@ -138,8 +136,7 @@ void GrammarTest::testRegularParser() {
 
 	std::list<sax::Token> tokens2;
 	sax::SaxParseInterface::parseMemory(tmp, tokens2);
-	grammar::GrammarFromXMLParser parser;
-	grammar::RightRG grammar2 = parser.parseRightRG(tokens2);
+	grammar::RightRG grammar2 = alib::DataFactory::fromTokens<grammar::RightRG>(tokens2);
 
 	CPPUNIT_ASSERT( grammar == grammar2 );
     }
@@ -168,8 +165,7 @@ void GrammarTest::testRegularParser() {
 
 	std::list<sax::Token> tokens2;
 	sax::SaxParseInterface::parseMemory(tmp, tokens2);
-	grammar::GrammarFromXMLParser parser;
-	grammar::RightLG grammar2 = parser.parseRightLG(tokens2);
+	grammar::RightLG grammar2 = alib::DataFactory::fromTokens<grammar::RightLG>(tokens2);
 
 	CPPUNIT_ASSERT( grammar == grammar2 );
     }
@@ -200,8 +196,7 @@ void GrammarTest::testContextFreeParser() {
 
 	std::list<sax::Token> tokens2;
 	sax::SaxParseInterface::parseMemory(tmp, tokens2);
-	grammar::GrammarFromXMLParser parser;
-	grammar::LG grammar2 = parser.parseLG(tokens2);
+	grammar::LG grammar2 = alib::DataFactory::fromTokens<grammar::LG>(tokens2);
 
 	CPPUNIT_ASSERT( grammar == grammar2 );
     }
@@ -230,8 +225,7 @@ void GrammarTest::testContextFreeParser() {
 
 	std::list<sax::Token> tokens2;
 	sax::SaxParseInterface::parseMemory(tmp, tokens2);
-	grammar::GrammarFromXMLParser parser;
-	grammar::EpsilonFreeCFG grammar2 = parser.parseEpsilonFreeCFG(tokens2);
+	grammar::EpsilonFreeCFG grammar2 = alib::DataFactory::fromTokens<grammar::EpsilonFreeCFG>(tokens2);
 
 	CPPUNIT_ASSERT( grammar == grammar2 );
     }
@@ -260,8 +254,7 @@ void GrammarTest::testContextFreeParser() {
 
 	std::list<sax::Token> tokens2;
 	sax::SaxParseInterface::parseMemory(tmp, tokens2);
-	grammar::GrammarFromXMLParser parser;
-	grammar::CFG grammar2 = parser.parseCFG(tokens2);
+	grammar::CFG grammar2 = alib::DataFactory::fromTokens<grammar::CFG>(tokens2);
 
 	CPPUNIT_ASSERT( grammar == grammar2 );
     }
@@ -290,8 +283,7 @@ void GrammarTest::testContextFreeParser() {
 
 	std::list<sax::Token> tokens2;
 	sax::SaxParseInterface::parseMemory(tmp, tokens2);
-	grammar::GrammarFromXMLParser parser;
-	grammar::CNF grammar2 = parser.parseCNF(tokens2);
+	grammar::CNF grammar2 = alib::DataFactory::fromTokens<grammar::CNF>(tokens2);
 
 	CPPUNIT_ASSERT( grammar == grammar2 );
     }
@@ -320,8 +312,7 @@ void GrammarTest::testContextFreeParser() {
 
 	std::list<sax::Token> tokens2;
 	sax::SaxParseInterface::parseMemory(tmp, tokens2);
-	grammar::GrammarFromXMLParser parser;
-	grammar::GNF grammar2 = parser.parseGNF(tokens2);
+	grammar::GNF grammar2 = alib::DataFactory::fromTokens<grammar::GNF>(tokens2);
 
 	CPPUNIT_ASSERT( grammar == grammar2 );
     }
@@ -352,8 +343,7 @@ void GrammarTest::testContextSensitiveParser() {
 
 	std::list<sax::Token> tokens2;
 	sax::SaxParseInterface::parseMemory(tmp, tokens2);
-	grammar::GrammarFromXMLParser parser;
-	grammar::CSG grammar2 = parser.parseCSG(tokens2);
+	grammar::CSG grammar2 = alib::DataFactory::fromTokens<grammar::CSG>(tokens2);
 
 	CPPUNIT_ASSERT( grammar == grammar2 );
     }
@@ -381,10 +371,9 @@ void GrammarTest::testContextSensitiveParser() {
 
 	std::list<sax::Token> tokens2;
 	sax::SaxParseInterface::parseMemory(tmp, tokens2);
-	grammar::GrammarFromXMLParser parser;
-	grammar::NonContractingGrammar grammar2 = parser.parseNonContractingGrammar(tokens2);
+	grammar::NonContractingGrammar grammar2 = alib::DataFactory::fromTokens<grammar::NonContractingGrammar>(tokens2);
 
 	CPPUNIT_ASSERT( grammar == grammar2 );
     }
   }
-} */
+}
diff --git a/alib2data/test-src/grammar/GrammarTest.h b/alib2data/test-src/grammar/GrammarTest.h
index 588ed8b057..6dcea84220 100644
--- a/alib2data/test-src/grammar/GrammarTest.h
+++ b/alib2data/test-src/grammar/GrammarTest.h
@@ -7,10 +7,10 @@ class GrammarTest : public CppUnit::TestFixture
 {
   CPPUNIT_TEST_SUITE( GrammarTest );
   CPPUNIT_TEST( testXMLParser );
-/*  CPPUNIT_TEST( testUnrestrictedParser );
+  CPPUNIT_TEST( testUnrestrictedParser );
   CPPUNIT_TEST( testContextSensitiveParser );
   CPPUNIT_TEST( testContextFreeParser );
-  CPPUNIT_TEST( testRegularParser );*/
+  CPPUNIT_TEST( testRegularParser );
   CPPUNIT_TEST_SUITE_END();
 
 public:
@@ -18,10 +18,10 @@ public:
   void tearDown();
 
   void testXMLParser();
-/*  void testUnrestrictedParser();
+  void testUnrestrictedParser();
   void testContextSensitiveParser();
   void testContextFreeParser();
-  void testRegularParser();*/
+  void testRegularParser();
 };
 
 #endif  // GRAMMAR_TEST_H_
diff --git a/alib2data/test-src/label/LabelTest.cpp b/alib2data/test-src/label/LabelTest.cpp
index b5a6f52177..cc28609daa 100644
--- a/alib2data/test-src/label/LabelTest.cpp
+++ b/alib2data/test-src/label/LabelTest.cpp
@@ -92,12 +92,12 @@ void LabelTest::testXMLParser() {
   
 	CPPUNIT_ASSERT( label == label2 );
   }
-/*  {
+  {
 	std::string tmp = alib::DataFactory::toString(label);
 	label::Label label2 = alib::DataFactory::fromString<label::Label>(tmp);
   
 	CPPUNIT_ASSERT( label == label2 );
-  }*/
+  }
 }
 
 void LabelTest::testOrder() {
diff --git a/alib2data/test-src/regexp/RegExpTest.cpp b/alib2data/test-src/regexp/RegExpTest.cpp
index 22452efe8d..eff762cff8 100644
--- a/alib2data/test-src/regexp/RegExpTest.cpp
+++ b/alib2data/test-src/regexp/RegExpTest.cpp
@@ -143,12 +143,12 @@ void RegExpTest::testXMLParser() {
   
 	CPPUNIT_ASSERT( regexp == regexp2 );
   }
-/*  {
+  {
 	std::string tmp = alib::DataFactory::toString(regexp);
 	regexp::RegExp regexp2 = alib::DataFactory::fromString<regexp::RegExp>(tmp);
   
 	CPPUNIT_ASSERT( regexp == regexp2 );
-  }*/
+  }
 }
 
 void RegExpTest::testOrder() {
diff --git a/alib2data/test-src/string/StringTest.cpp b/alib2data/test-src/string/StringTest.cpp
index d277af2dee..ecb97ed6fd 100644
--- a/alib2data/test-src/string/StringTest.cpp
+++ b/alib2data/test-src/string/StringTest.cpp
@@ -129,12 +129,12 @@ void StringTest::testXMLParser() {
 
 	CPPUNIT_ASSERT( string == string2 );
   }
-/*  {
+  {
 	std::string tmp = alib::DataFactory::toString(string);
 	string::String string2 = alib::DataFactory::fromString<string::String>(tmp);
 
 	CPPUNIT_ASSERT( string == string2 );
-  }*/
+  }
 }
 
 void StringTest::testCompare() {
-- 
GitLab