From 04084a033ca1c77a3006a16a35af53a2543bb898 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Wed, 22 Jul 2015 09:42:45 +0200
Subject: [PATCH] continue with trees

---
 alib2data/src/XmlApi.cpp                      | 110 ---------
 alib2data/src/XmlApi.hpp                      |  67 -----
 alib2data/src/XmlTagNames.cpp                 |   8 -
 alib2data/src/XmlTagNames.h                   |   8 -
 alib2data/src/tree/TreeBase.h                 |   3 +
 alib2data/src/tree/TreeFromXMLParser.cpp      | 229 ------------------
 alib2data/src/tree/TreeFromXMLParser.h        |  63 -----
 alib2data/src/tree/TreeToXMLComposer.cpp      | 174 -------------
 alib2data/src/tree/TreeToXMLComposer.h        |  63 -----
 .../src/tree/common/TreeFromXMLParser.cpp     | 100 ++++++++
 alib2data/src/tree/common/TreeFromXMLParser.h |  43 ++++
 .../src/tree/common/TreeToXMLComposer.cpp     |  90 +++++++
 alib2data/src/tree/common/TreeToXMLComposer.h |  45 ++++
 .../tree/ranked/PrefixRankedBarPattern.cpp    |  34 +++
 .../src/tree/ranked/PrefixRankedBarPattern.h  |   6 +
 .../src/tree/ranked/PrefixRankedBarTree.cpp   |  30 +++
 .../src/tree/ranked/PrefixRankedBarTree.h     |   6 +
 .../src/tree/ranked/PrefixRankedPattern.cpp   |  30 +++
 .../src/tree/ranked/PrefixRankedPattern.h     |   6 +
 .../src/tree/ranked/PrefixRankedTree.cpp      |  28 +++
 alib2data/src/tree/ranked/PrefixRankedTree.h  |   6 +
 alib2data/src/tree/ranked/RankedPattern.cpp   |  33 +++
 alib2data/src/tree/ranked/RankedPattern.h     |   6 +
 alib2data/src/tree/ranked/RankedTree.cpp      |  31 +++
 alib2data/src/tree/ranked/RankedTree.h        |   6 +
 .../src/tree/unranked/UnrankedPattern.cpp     |  33 +++
 alib2data/src/tree/unranked/UnrankedPattern.h |   6 +
 alib2data/src/tree/unranked/UnrankedTree.cpp  |  31 +++
 alib2data/src/tree/unranked/UnrankedTree.h    |   6 +
 29 files changed, 579 insertions(+), 722 deletions(-)
 delete mode 100644 alib2data/src/tree/TreeFromXMLParser.cpp
 delete mode 100644 alib2data/src/tree/TreeFromXMLParser.h
 delete mode 100644 alib2data/src/tree/TreeToXMLComposer.cpp
 delete mode 100644 alib2data/src/tree/TreeToXMLComposer.h
 create mode 100644 alib2data/src/tree/common/TreeFromXMLParser.cpp
 create mode 100644 alib2data/src/tree/common/TreeFromXMLParser.h
 create mode 100644 alib2data/src/tree/common/TreeToXMLComposer.cpp
 create mode 100644 alib2data/src/tree/common/TreeToXMLComposer.h

diff --git a/alib2data/src/XmlApi.cpp b/alib2data/src/XmlApi.cpp
index 9361e51eac..21612e75a4 100644
--- a/alib2data/src/XmlApi.cpp
+++ b/alib2data/src/XmlApi.cpp
@@ -38,7 +38,6 @@ const grammar::GrammarFromXMLParser FromXMLParsers::grammarParser;
 const graph::GraphFromXMLParser FromXMLParsers::graphParser;
 const alib::ObjectFromXMLParser FromXMLParsers::objectParser;
 const container::ContainerFromXMLParser FromXMLParsers::containerParser;
-const tree::TreeFromXMLParser FromXMLParsers::treeParser;
 
 const regexp::RegExpToXMLComposer ToXMLComposers::regexpComposer;
 const automaton::AutomatonToXMLComposer ToXMLComposers::automatonComposer;
@@ -46,7 +45,6 @@ const grammar::GrammarToXMLComposer ToXMLComposers::grammarComposer;
 const graph::GraphToXMLComposer ToXMLComposers::graphComposer;
 const alib::ObjectToXMLComposer ToXMLComposers::objectComposer;
 const container::ContainerToXMLComposer ToXMLComposers::containerComposer;
-const tree::TreeToXMLComposer ToXMLComposers::treeComposer;
 
 const ToXMLComposers ToXMLComposers::toXMLComposers;
 
@@ -631,114 +629,6 @@ void xmlApi<regexp::FormalRegExp>::compose(std::deque<sax::Token>& output, const
 }
 
 
-tree::Tree xmlApi<tree::Tree>::parse(std::deque<sax::Token>::iterator& input) {
-	return FromXMLParsers::treeParser.parseTree(input);
-}
-
-bool xmlApi<tree::Tree>::first(const std::deque<sax::Token>::const_iterator& input) {
-	return FromXMLParsers::treeParser.first(input);
-}
-
-void xmlApi<tree::Tree>::compose(std::deque<sax::Token>& output, const tree::Tree& data) {
-	ToXMLComposers::treeComposer.compose(output, data);
-}
-
-tree::PrefixRankedTree xmlApi<tree::PrefixRankedTree>::parse(std::deque<sax::Token>::iterator& input) {
-	return FromXMLParsers::treeParser.parsePrefixRankedTree(input);
-}
-
-bool xmlApi<tree::PrefixRankedTree>::first(const std::deque<sax::Token>::const_iterator& input) {
-	return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::TREE_PREFIX_RANKED_TREE);
-}
-
-void xmlApi<tree::PrefixRankedTree>::compose(std::deque<sax::Token>& output, const tree::PrefixRankedTree& data) {
-	ToXMLComposers::treeComposer.compose(output, data);
-}
-
-tree::PrefixRankedBarTree xmlApi<tree::PrefixRankedBarTree>::parse(std::deque<sax::Token>::iterator& input) {
-	return FromXMLParsers::treeParser.parsePrefixRankedBarTree(input);
-}
-
-bool xmlApi<tree::PrefixRankedBarTree>::first(const std::deque<sax::Token>::const_iterator& input) {
-	return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::TREE_PREFIX_RANKED_BAR_TREE);
-}
-
-void xmlApi<tree::PrefixRankedBarTree>::compose(std::deque<sax::Token>& output, const tree::PrefixRankedBarTree& data) {
-	ToXMLComposers::treeComposer.compose(output, data);
-}
-
-tree::PrefixRankedPattern xmlApi<tree::PrefixRankedPattern>::parse(std::deque<sax::Token>::iterator& input) {
-	return FromXMLParsers::treeParser.parsePrefixRankedPattern(input);
-}
-
-bool xmlApi<tree::PrefixRankedPattern>::first(const std::deque<sax::Token>::const_iterator& input) {
-	return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::TREE_PREFIX_RANKED_PATTERN);
-}
-
-void xmlApi<tree::PrefixRankedPattern>::compose(std::deque<sax::Token>& output, const tree::PrefixRankedPattern& data) {
-	ToXMLComposers::treeComposer.compose(output, data);
-}
-
-tree::PrefixRankedBarPattern xmlApi<tree::PrefixRankedBarPattern>::parse(std::deque<sax::Token>::iterator& input) {
-	return FromXMLParsers::treeParser.parsePrefixRankedBarPattern(input);
-}
-
-bool xmlApi<tree::PrefixRankedBarPattern>::first(const std::deque<sax::Token>::const_iterator& input) {
-	return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::TREE_PREFIX_RANKED_BAR_PATTERN);
-}
-
-void xmlApi<tree::PrefixRankedBarPattern>::compose(std::deque<sax::Token>& output, const tree::PrefixRankedBarPattern& data) {
-	ToXMLComposers::treeComposer.compose(output, data);
-}
-
-tree::RankedTree xmlApi<tree::RankedTree>::parse(std::deque<sax::Token>::iterator& input) {
-	return FromXMLParsers::treeParser.parseRankedTree(input);
-}
-
-bool xmlApi<tree::RankedTree>::first(const std::deque<sax::Token>::const_iterator& input) {
-	return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::TREE_RANKED_TREE);
-}
-
-void xmlApi<tree::RankedTree>::compose(std::deque<sax::Token>& output, const tree::RankedTree& data) {
-	ToXMLComposers::treeComposer.compose(output, data);
-}
-
-tree::RankedPattern xmlApi<tree::RankedPattern>::parse(std::deque<sax::Token>::iterator& input) {
-	return FromXMLParsers::treeParser.parseRankedPattern(input);
-}
-
-bool xmlApi<tree::RankedPattern>::first(const std::deque<sax::Token>::const_iterator& input) {
-	return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::TREE_RANKED_PATTERN);
-}
-
-void xmlApi<tree::RankedPattern>::compose(std::deque<sax::Token>& output, const tree::RankedPattern& data) {
-	ToXMLComposers::treeComposer.compose(output, data);
-}
-
-tree::UnrankedTree xmlApi<tree::UnrankedTree>::parse(std::deque<sax::Token>::iterator& input) {
-	return FromXMLParsers::treeParser.parseUnrankedTree(input);
-}
-
-bool xmlApi<tree::UnrankedTree>::first(const std::deque<sax::Token>::const_iterator& input) {
-	return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::TREE_UNRANKED_TREE);
-}
-
-void xmlApi<tree::UnrankedTree>::compose(std::deque<sax::Token>& output, const tree::UnrankedTree& data) {
-	ToXMLComposers::treeComposer.compose(output, data);
-}
-
-tree::UnrankedPattern xmlApi<tree::UnrankedPattern>::parse(std::deque<sax::Token>::iterator& input) {
-	return FromXMLParsers::treeParser.parseUnrankedPattern(input);
-}
-
-bool xmlApi<tree::UnrankedPattern>::first(const std::deque<sax::Token>::const_iterator& input) {
-	return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::TREE_UNRANKED_PATTERN);
-}
-
-void xmlApi<tree::UnrankedPattern>::compose(std::deque<sax::Token>& output, const tree::UnrankedPattern& data) {
-	ToXMLComposers::treeComposer.compose(output, data);
-}
-
 void ToXMLComposers::Visit(void* data, const Void& voidObject) const {
 	xmlApi<Void>::compose(*((std::deque<sax::Token>*) data), voidObject);
 }
diff --git a/alib2data/src/XmlApi.hpp b/alib2data/src/XmlApi.hpp
index c2ef883133..c34e5764e1 100644
--- a/alib2data/src/XmlApi.hpp
+++ b/alib2data/src/XmlApi.hpp
@@ -24,7 +24,6 @@
 #include "grammar/GrammarFromXMLParser.h"
 #include "graph/GraphFromXMLParser.h"
 #include "object/ObjectFromXMLParser.h"
-#include "tree/TreeFromXMLParser.h"
 #include "container/ContainerFromXMLParser.hpp"
 
 #include "regexp/RegExpToXMLComposer.h"
@@ -32,7 +31,6 @@
 #include "grammar/GrammarToXMLComposer.h"
 #include "graph/GraphToXMLComposer.h"
 #include "object/ObjectToXMLComposer.h"
-#include "tree/TreeToXMLComposer.h"
 #include "container/ContainerToXMLComposer.hpp"
 
 #include "object/ObjectBase.h"
@@ -480,69 +478,6 @@ struct xmlApi<regexp::FormalRegExp> {
 };
 
 
-template<>
-struct xmlApi<tree::Tree> {
-	static tree::Tree parse(std::deque<sax::Token>::iterator& input);
-	static bool first(const std::deque<sax::Token>::const_iterator& input);
-	static void compose(std::deque<sax::Token>& output, const tree::Tree& data);
-};
-
-template<>
-struct xmlApi<tree::RankedTree> {
-	static tree::RankedTree parse(std::deque<sax::Token>::iterator& input);
-	static bool first(const std::deque<sax::Token>::const_iterator& input);
-	static void compose(std::deque<sax::Token>& output, const tree::RankedTree& data);
-};
-
-template<>
-struct xmlApi<tree::RankedPattern> {
-	static tree::RankedPattern parse(std::deque<sax::Token>::iterator& input);
-	static bool first(const std::deque<sax::Token>::const_iterator& input);
-	static void compose(std::deque<sax::Token>& output, const tree::RankedPattern& data);
-};
-
-template<>
-struct xmlApi<tree::PrefixRankedTree> {
-	static tree::PrefixRankedTree parse(std::deque<sax::Token>::iterator& input);
-	static bool first(const std::deque<sax::Token>::const_iterator& input);
-	static void compose(std::deque<sax::Token>& output, const tree::PrefixRankedTree& data);
-};
-
-template<>
-struct xmlApi<tree::PrefixRankedBarTree> {
-	static tree::PrefixRankedBarTree parse(std::deque<sax::Token>::iterator& input);
-	static bool first(const std::deque<sax::Token>::const_iterator& input);
-	static void compose(std::deque<sax::Token>& output, const tree::PrefixRankedBarTree& data);
-};
-
-template<>
-struct xmlApi<tree::PrefixRankedPattern> {
-	static tree::PrefixRankedPattern parse(std::deque<sax::Token>::iterator& input);
-	static bool first(const std::deque<sax::Token>::const_iterator& input);
-	static void compose(std::deque<sax::Token>& output, const tree::PrefixRankedPattern& data);
-};
-
-template<>
-struct xmlApi<tree::PrefixRankedBarPattern> {
-	static tree::PrefixRankedBarPattern parse(std::deque<sax::Token>::iterator& input);
-	static bool first(const std::deque<sax::Token>::const_iterator& input);
-	static void compose(std::deque<sax::Token>& output, const tree::PrefixRankedBarPattern& data);
-};
-
-template<>
-struct xmlApi<tree::UnrankedTree> {
-	static tree::UnrankedTree parse(std::deque<sax::Token>::iterator& input);
-	static bool first(const std::deque<sax::Token>::const_iterator& input);
-	static void compose(std::deque<sax::Token>& output, const tree::UnrankedTree& data);
-};
-
-template<>
-struct xmlApi<tree::UnrankedPattern> {
-	static tree::UnrankedPattern parse(std::deque<sax::Token>::iterator& input);
-	static bool first(const std::deque<sax::Token>::const_iterator& input);
-	static void compose(std::deque<sax::Token>& output, const tree::UnrankedPattern& data);
-};
-
 template<>
 struct xmlApi<container::Container> {
 	static container::Container parse(std::deque<sax::Token>::iterator& input);
@@ -558,7 +493,6 @@ public:
 	static const graph::GraphFromXMLParser graphParser;
 	static const ObjectFromXMLParser objectParser;
 	static const container::ContainerFromXMLParser containerParser;
-	static const tree::TreeFromXMLParser treeParser;
 
 };
 
@@ -662,7 +596,6 @@ public:
 	static const graph::GraphToXMLComposer graphComposer;
 	static const ObjectToXMLComposer objectComposer;
 	static const container::ContainerToXMLComposer containerComposer;
-	static const tree::TreeToXMLComposer treeComposer;
 
 	static const ToXMLComposers toXMLComposers;
 };
diff --git a/alib2data/src/XmlTagNames.cpp b/alib2data/src/XmlTagNames.cpp
index 27d602fe49..9a90210b76 100644
--- a/alib2data/src/XmlTagNames.cpp
+++ b/alib2data/src/XmlTagNames.cpp
@@ -56,14 +56,6 @@ const std::string Names::LABEL_LABEL_PAIR_LABEL = "LabelPairLabel";
 const std::string Names::LABEL_UNIQUE_LABEL = "UniqueLabel";
 const std::string Names::REGEXP_UNBOUNDED_REGEXP = "UnboundedRegExp";
 const std::string Names::REGEXP_FORMAL_REGEXP = "FormalRegExp";
-const std::string Names::TREE_RANKED_TREE = "RankedTree";
-const std::string Names::TREE_RANKED_PATTERN = "RankedPattern";
-const std::string Names::TREE_PREFIX_RANKED_TREE = "PrefixRankedTree";
-const std::string Names::TREE_PREFIX_RANKED_BAR_TREE = "PrefixRankedBarTree";
-const std::string Names::TREE_PREFIX_RANKED_PATTERN = "PrefixRankedPattern";
-const std::string Names::TREE_PREFIX_RANKED_BAR_PATTERN = "PrefixRankedBarPattern";
-const std::string Names::TREE_UNRANKED_TREE = "UnrankedTree";
-const std::string Names::TREE_UNRANKED_PATTERN = "UnrankedPattern";
 
 }
 
diff --git a/alib2data/src/XmlTagNames.h b/alib2data/src/XmlTagNames.h
index e96480def2..fd23b50fa6 100644
--- a/alib2data/src/XmlTagNames.h
+++ b/alib2data/src/XmlTagNames.h
@@ -61,14 +61,6 @@ struct Names {
 	const static std::string LABEL_UNIQUE_LABEL;
 	const static std::string REGEXP_UNBOUNDED_REGEXP;
 	const static std::string REGEXP_FORMAL_REGEXP;
-	const static std::string TREE_RANKED_TREE;
-	const static std::string TREE_RANKED_PATTERN;
-	const static std::string TREE_PREFIX_RANKED_TREE;
-	const static std::string TREE_PREFIX_RANKED_BAR_TREE;
-	const static std::string TREE_PREFIX_RANKED_PATTERN;
-	const static std::string TREE_PREFIX_RANKED_BAR_PATTERN;
-	const static std::string TREE_UNRANKED_TREE;
-	const static std::string TREE_UNRANKED_PATTERN;
 
 };
 
diff --git a/alib2data/src/tree/TreeBase.h b/alib2data/src/tree/TreeBase.h
index 5f85a2a53a..9d716d4a69 100644
--- a/alib2data/src/tree/TreeBase.h
+++ b/alib2data/src/tree/TreeBase.h
@@ -9,6 +9,8 @@
 #define TREE_BASE_H_
 
 #include "../object/ObjectBase.h"
+#include <deque>
+#include "../sax/Token.h"
 
 namespace tree {
 
@@ -42,6 +44,7 @@ public:
 	virtual TreeBase* clone() const = 0;
 	virtual TreeBase* plunder() && = 0;
 
+	virtual void compose(std::deque<sax::Token>& out) const = 0;
 };
 
 } /* namespace tree */
diff --git a/alib2data/src/tree/TreeFromXMLParser.cpp b/alib2data/src/tree/TreeFromXMLParser.cpp
deleted file mode 100644
index a5e67f91ba..0000000000
--- a/alib2data/src/tree/TreeFromXMLParser.cpp
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * TreeFromXMLParser.cpp
- *
- *  Created on: Nov 16, 2014
- *      Author: Stepan Plachy
- */
-
-#include "TreeFromXMLParser.h"
-#include "../sax/ParserException.h"
-#include "../XmlApi.hpp"
-
-#include "Tree.h"
-#include "TreeClasses.h"
-
-namespace tree {
-
-Tree TreeFromXMLParser::parseTree(std::deque<sax::Token>::iterator& input) const {
-	return parseTree(input, std::set<FEATURES>({FEATURES::RANKED_TREE, FEATURES::RANKED_PATTERN, FEATURES::UNRANKED_TREE, FEATURES::UNRANKED_PATTERN, FEATURES::PREFIX_RANKED_TREE, FEATURES::PREFIX_RANKED_PATTERN, FEATURES::PREFIX_RANKED_BAR_PATTERN}));
-}
-
-Tree TreeFromXMLParser::parseTree(std::deque<sax::Token>::iterator& input, const std::set<FEATURES>& features) const {
-	if(alib::xmlApi<RankedTree>::first(input)) {
-		if(!features.count(FEATURES::RANKED_TREE)) throw exception::AlibException();
-		return Tree(parseRankedTree(input));
-	} else if(alib::xmlApi<RankedPattern>::first(input)) {
-		if(!features.count(FEATURES::RANKED_PATTERN)) throw exception::AlibException();
-		return Tree(parseRankedPattern(input));
-	} else if(alib::xmlApi<UnrankedTree>::first(input)) {
-		if(!features.count(FEATURES::UNRANKED_TREE)) throw exception::AlibException();
-		return Tree(parseUnrankedTree(input));
-	} else if(alib::xmlApi<UnrankedPattern>::first(input)) {
-		if(!features.count(FEATURES::UNRANKED_PATTERN)) throw exception::AlibException();
-		return Tree(parseUnrankedPattern(input));
-	} else if(alib::xmlApi<PrefixRankedTree>::first(input)) {
-		if(!features.count(FEATURES::PREFIX_RANKED_TREE)) throw exception::AlibException();
-		return Tree(parsePrefixRankedTree(input));
-	} else if(alib::xmlApi<PrefixRankedPattern>::first(input)) {
-		if(!features.count(FEATURES::PREFIX_RANKED_PATTERN)) throw exception::AlibException();
-		return Tree(parsePrefixRankedPattern(input));
-	} else if(alib::xmlApi<PrefixRankedBarPattern>::first(input)) {
-		if(!features.count(FEATURES::PREFIX_RANKED_BAR_PATTERN)) throw exception::AlibException();
-		return Tree(parsePrefixRankedBarPattern(input));
-	} else
-		throw sax::ParserException(sax::Token("Tree / RankedTree / RankedPattern / PrefixRankedTree / PrefixRankedPattern / PrefixRankedBarPattern / UnrankedTree / UnrankedPattern", sax::Token::TokenType::START_ELEMENT), *input);
-}
-
-RankedPattern TreeFromXMLParser::parseRankedPattern(std::deque<sax::Token>::iterator& input) const {
-	popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::TREE_RANKED_PATTERN);
-
-	alphabet::RankedSymbol subtreeWildcard = parseSubtreeWildcard<alphabet::RankedSymbol>(input);
-	std::set<alphabet::RankedSymbol> rankedAlphabet = parseRankedAlphabet(input);
-	RankedNode * root = parseRankedNode(input);
-	RankedPattern tree(subtreeWildcard, std::move(rankedAlphabet), std::move(*root));
-	delete root;
-	popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::TREE_RANKED_PATTERN);
-	return tree;
-}
-
-RankedTree TreeFromXMLParser::parseRankedTree(std::deque<sax::Token>::iterator& input) const {
-	popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::TREE_RANKED_TREE);
-
-	std::set<alphabet::RankedSymbol> rankedAlphabet = parseRankedAlphabet(input);
-	RankedNode * root = parseRankedNode(input);
-	RankedTree tree(std::move(rankedAlphabet), std::move(*root));
-	delete root;
-	popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::TREE_RANKED_TREE);
-	return tree;
-}
-
-PrefixRankedTree TreeFromXMLParser::parsePrefixRankedTree(std::deque<sax::Token>::iterator& input) const {
-	popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::TREE_PREFIX_RANKED_TREE);
-
-	std::set<alphabet::RankedSymbol> rankedAlphabet = parseRankedAlphabet(input);
-	std::vector<alphabet::RankedSymbol> data = parseContentData(input);
-	PrefixRankedTree tree(std::move(rankedAlphabet), std::move(data));
-
-	popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::TREE_PREFIX_RANKED_TREE);
-	return tree;
-}
-
-PrefixRankedBarTree TreeFromXMLParser::parsePrefixRankedBarTree(std::deque<sax::Token>::iterator& input) const {
-	popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::TREE_PREFIX_RANKED_BAR_TREE);
-
-	alphabet::Symbol bar = parseBar(input);
-	std::set<alphabet::RankedSymbol> rankedAlphabet = parseRankedAlphabet(input);
-	std::vector<alphabet::RankedSymbol> data = parseContentData(input);
-	PrefixRankedBarTree tree(std::move(bar), std::move(rankedAlphabet), std::move(data));
-
-	popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::TREE_PREFIX_RANKED_BAR_TREE);
-	return tree;
-}
-
-PrefixRankedPattern TreeFromXMLParser::parsePrefixRankedPattern(std::deque<sax::Token>::iterator& input) const {
-	popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::TREE_PREFIX_RANKED_PATTERN);
-
-	alphabet::RankedSymbol subtreeWildcard = parseSubtreeWildcard<alphabet::RankedSymbol>(input);
-	std::set<alphabet::RankedSymbol> rankedAlphabet = parseRankedAlphabet(input);
-	std::vector<alphabet::RankedSymbol> data = parseContentData(input);
-	PrefixRankedPattern tree(std::move(subtreeWildcard), std::move(rankedAlphabet), std::move(data));
-
-	popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::TREE_PREFIX_RANKED_PATTERN);
-	return tree;
-}
-
-PrefixRankedBarPattern TreeFromXMLParser::parsePrefixRankedBarPattern(std::deque<sax::Token>::iterator& input) const {
-	popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::TREE_PREFIX_RANKED_BAR_PATTERN);
-
-	alphabet::Symbol bar = parseBar(input);
-	alphabet::Symbol variablesBar = parseVariablesBar(input);
-	alphabet::RankedSymbol subtreeWildcard = parseSubtreeWildcard<alphabet::RankedSymbol>(input);
-	std::set<alphabet::RankedSymbol> rankedAlphabet = parseRankedAlphabet(input);
-	std::vector<alphabet::RankedSymbol> data = parseContentData(input);
-	PrefixRankedBarPattern tree(std::move(bar), std::move(variablesBar), std::move(subtreeWildcard), std::move(rankedAlphabet), std::move(data));
-
-	popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::TREE_PREFIX_RANKED_BAR_PATTERN);
-	return tree;
-}
-
-UnrankedPattern TreeFromXMLParser::parseUnrankedPattern(std::deque<sax::Token>::iterator& input) const {
-	popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::TREE_UNRANKED_PATTERN);
-
-	alphabet::Symbol subtreeWildcard = parseSubtreeWildcard<alphabet::Symbol>(input);
-	std::set<alphabet::Symbol> alphabet = parseAlphabet(input);
-	UnrankedNode * root = parseUnrankedNode(input);
-	UnrankedPattern tree(std::move(subtreeWildcard), std::move(alphabet), std::move(*root));
-	delete root;
-	popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::TREE_UNRANKED_PATTERN);
-	return tree;
-}
-
-UnrankedTree TreeFromXMLParser::parseUnrankedTree(std::deque<sax::Token>::iterator& input) const {
-	popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::TREE_UNRANKED_TREE);
-
-	std::set<alphabet::Symbol> alphabet = parseAlphabet(input);
-	UnrankedNode * root = parseUnrankedNode(input);
-	UnrankedTree tree(std::move(alphabet), std::move(*root));
-	delete root;
-	popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::TREE_UNRANKED_TREE);
-	return tree;
-}
-
-alphabet::Symbol TreeFromXMLParser::parseBar(std::deque<sax::Token>::iterator& input) const {
-	popToken(input, sax::Token::TokenType::START_ELEMENT, "bar");
-	alphabet::Symbol bar(alib::xmlApi<alphabet::Symbol>::parse(input));
-	popToken(input, sax::Token::TokenType::END_ELEMENT, "bar");
-	return bar;
-}
-
-alphabet::Symbol TreeFromXMLParser::parseVariablesBar(std::deque<sax::Token>::iterator& input) const {
-	popToken(input, sax::Token::TokenType::START_ELEMENT, "variablesBar");
-	alphabet::Symbol variablesBar(alib::xmlApi<alphabet::Symbol>::parse(input));
-	popToken(input, sax::Token::TokenType::END_ELEMENT, "variablesBar");
-	return variablesBar;
-}
-
-template<class T>
-T TreeFromXMLParser::parseSubtreeWildcard(std::deque<sax::Token>::iterator& input) const {
-	popToken(input, sax::Token::TokenType::START_ELEMENT, "subtreeWildcard");
-	T subtreeWildcard(alib::xmlApi<T>::parse(input));
-	popToken(input, sax::Token::TokenType::END_ELEMENT, "subtreeWildcard");
-	return subtreeWildcard;
-}
-
-std::set<alphabet::RankedSymbol> TreeFromXMLParser::parseRankedAlphabet(std::deque<sax::Token>::iterator& input) const {
-	std::set<alphabet::RankedSymbol> rankedSymbols;
-	popToken(input, sax::Token::TokenType::START_ELEMENT, "rankedAlphabet");
-	while (isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
-		rankedSymbols.insert(alib::xmlApi<alphabet::RankedSymbol>::parse(input));
-	}
-	popToken(input, sax::Token::TokenType::END_ELEMENT, "rankedAlphabet");
-	return rankedSymbols;
-}
-
-std::set<alphabet::Symbol> TreeFromXMLParser::parseAlphabet(std::deque<sax::Token>::iterator& input) const {
-	std::set<alphabet::Symbol> symbols;
-	popToken(input, sax::Token::TokenType::START_ELEMENT, "alphabet");
-	while (isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
-		symbols.insert(alib::xmlApi<alphabet::Symbol>::parse(input));
-	}
-	popToken(input, sax::Token::TokenType::END_ELEMENT, "alphabet");
-	return symbols;
-}
-
-std::vector<alphabet::RankedSymbol> TreeFromXMLParser::parseContentData(std::deque<sax::Token>::iterator& input) const {
-	std::vector<alphabet::RankedSymbol> data;
-	popToken(input, sax::Token::TokenType::START_ELEMENT, "content");
-	while (isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
-		data.push_back(alib::xmlApi<alphabet::RankedSymbol>::parse(input));
-	}
-	popToken(input, sax::Token::TokenType::END_ELEMENT, "content");
-	return data;
-}
-
-RankedNode * TreeFromXMLParser::parseRankedNode(std::deque<sax::Token>::iterator& input) const {
-	popToken(input, sax::Token::TokenType::START_ELEMENT, "rankedNode");
-	alphabet::RankedSymbol symbol = alib::xmlApi<alphabet::RankedSymbol>::parse(input);
-	int rank = symbol.getRank().getData();
-	std::vector<RankedNode *> children;
-	children.reserve(rank);
-	while (isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
-		children.push_back(parseRankedNode(input));
-	}
-	popToken(input, sax::Token::TokenType::END_ELEMENT, "rankedNode");
-
-	return new RankedNode(symbol, children);
-}
-
-UnrankedNode * TreeFromXMLParser::parseUnrankedNode(std::deque<sax::Token>::iterator& input) const {
-	popToken(input, sax::Token::TokenType::START_ELEMENT, "unrankedNode");
-	alphabet::Symbol symbol = alib::xmlApi<alphabet::Symbol>::parse(input);
-	std::vector<UnrankedNode *> children;
-	while (isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
-		children.push_back(parseUnrankedNode(input));
-	}
-	popToken(input, sax::Token::TokenType::END_ELEMENT, "unrankedNode");
-
-	return new UnrankedNode(symbol, children);
-}
-
-bool TreeFromXMLParser::first(const std::deque<sax::Token>::const_iterator& input) const {
-	if (alib::xmlApi<RankedTree>::first(input) || alib::xmlApi<RankedPattern>::first(input) || alib::xmlApi<PrefixRankedTree>::first(input)  || alib::xmlApi<PrefixRankedPattern>::first(input) || alib::xmlApi<UnrankedTree>::first(input) || alib::xmlApi<UnrankedPattern>::first(input)) {
-		return true;
-	} else {
-		return false;
-	}
-}
-
-} /* namespace tree */
-
diff --git a/alib2data/src/tree/TreeFromXMLParser.h b/alib2data/src/tree/TreeFromXMLParser.h
deleted file mode 100644
index 63a30e44ae..0000000000
--- a/alib2data/src/tree/TreeFromXMLParser.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * TreeFromXMLParser.h
- *
- *  Created on: Nov 16, 2014
- *      Author: Stepan Plachy
- */
-
-#ifndef TREE_FROM_XML_PARSER_H_
-#define TREE_FROM_XML_PARSER_H_
-
-#include "../sax/FromXMLParserHelper.h"
-#include "TreeFeatures.h"
-
-#include <set>
-#include <variant>
-#include <vector>
-
-#include "../alphabet/SymbolFeatures.h"
-#include "../XmlApiBase.h"
-
-namespace tree {
-
-/**
- * Parser used to get tree from XML parsed into list of Tokens.
- */
-class TreeFromXMLParser : public sax::FromXMLParserHelper {
-public:
-	TreeFromXMLParser() {}
-
-private:
-	RankedNode * parseRankedNode(std::deque<sax::Token>::iterator& input) const;
-	std::vector<alphabet::RankedSymbol> parseContentData(std::deque<sax::Token>::iterator& input) const;
-	UnrankedNode * parseUnrankedNode(std::deque<sax::Token>::iterator& input) const;
-	std::set<alphabet::RankedSymbol> parseRankedAlphabet(std::deque<sax::Token>::iterator& input) const;
-	std::set<alphabet::Symbol> parseAlphabet(std::deque<sax::Token>::iterator& input) const;
-
-	alphabet::Symbol parseBar(std::deque<sax::Token>::iterator& input) const;
-	alphabet::Symbol parseVariablesBar(std::deque<sax::Token>::iterator& input) const;
-
-	template<class T>
-	T parseSubtreeWildcard(std::deque<sax::Token>::iterator& input) const;
-
-	Tree parseTree(std::deque<sax::Token>::iterator& input) const;
-	Tree parseTree(std::deque<sax::Token>::iterator& input, const std::set<FEATURES>& features) const;
-
-	RankedTree parseRankedTree(std::deque<sax::Token>::iterator& input) const;
-	RankedPattern parseRankedPattern(std::deque<sax::Token>::iterator& input) const;
-	PrefixRankedTree parsePrefixRankedTree(std::deque<sax::Token>::iterator& input) const;
-	PrefixRankedBarTree parsePrefixRankedBarTree(std::deque<sax::Token>::iterator& input) const;
-	PrefixRankedPattern parsePrefixRankedPattern(std::deque<sax::Token>::iterator& input) const;
-	PrefixRankedBarPattern parsePrefixRankedBarPattern(std::deque<sax::Token>::iterator& input) const;
-	UnrankedTree parseUnrankedTree(std::deque<sax::Token>::iterator& input) const;
-	UnrankedPattern parseUnrankedPattern(std::deque<sax::Token>::iterator& input) const;
-
-	template<typename T, typename Enable> friend struct alib::xmlApi;
-public:
-	bool first(const std::deque<sax::Token>::const_iterator& input) const;
-};
-
-} /* namespace tree */
-
-#endif /* TREE_FROM_XML_PARSER_H_ */
-
diff --git a/alib2data/src/tree/TreeToXMLComposer.cpp b/alib2data/src/tree/TreeToXMLComposer.cpp
deleted file mode 100644
index ba1b5e4cda..0000000000
--- a/alib2data/src/tree/TreeToXMLComposer.cpp
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * TreeToXMLComposer.cpp
- *
- *  Created on: Nov 16, 2014
- *      Author: Stepan Plachy
- */
-
-#include "TreeToXMLComposer.h"
-#include "../XmlApi.hpp"
-#include "Tree.h"
-#include "TreeClasses.h"
-
-namespace tree {
-
-void TreeToXMLComposer::composeBar(std::deque<sax::Token>& out, const alphabet::Symbol& symbol) const {
-	out.emplace_back(sax::Token("bar", sax::Token::TokenType::START_ELEMENT));
-	alib::xmlApi<alphabet::Symbol>::compose(out, symbol);
-	out.emplace_back(sax::Token("bar", sax::Token::TokenType::END_ELEMENT));
-}
-
-void TreeToXMLComposer::composeVariablesBar(std::deque<sax::Token>& out, const alphabet::Symbol& symbol) const {
-	out.emplace_back(sax::Token("variablesBar", sax::Token::TokenType::START_ELEMENT));
-	alib::xmlApi<alphabet::Symbol>::compose(out, symbol);
-	out.emplace_back(sax::Token("variablesBar", sax::Token::TokenType::END_ELEMENT));
-}
-
-template<class T>
-void TreeToXMLComposer::composeSubtreeWildcard(std::deque<sax::Token>& out, const T& symbol) const {
-	out.emplace_back(sax::Token("subtreeWildcard", sax::Token::TokenType::START_ELEMENT));
-	alib::xmlApi<T>::compose(out, symbol);
-	out.emplace_back(sax::Token("subtreeWildcard", sax::Token::TokenType::END_ELEMENT));
-}
-
-void TreeToXMLComposer::composeAlphabet(std::deque<sax::Token>& out, const std::set<alphabet::RankedSymbol>& symbols) const {
-	out.emplace_back(sax::Token("rankedAlphabet", sax::Token::TokenType::START_ELEMENT));
-	for (const auto& symbol : symbols) {
-		alib::xmlApi<alphabet::RankedSymbol>::compose(out, symbol);
-	}
-	out.emplace_back(sax::Token("rankedAlphabet", sax::Token::TokenType::END_ELEMENT));
-}
-
-void TreeToXMLComposer::composeAlphabet(std::deque<sax::Token>& out, const std::set<alphabet::Symbol>& symbols) const {
-	out.emplace_back(sax::Token("alphabet", sax::Token::TokenType::START_ELEMENT));
-	for (const auto& symbol : symbols) {
-		alib::xmlApi<alphabet::Symbol>::compose(out, symbol);
-	}
-	out.emplace_back(sax::Token("alphabet", sax::Token::TokenType::END_ELEMENT));
-}
-
-void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const TreeBase& tree) const {
-	tree.Accept((void*) &out, alib::ToXMLComposers::toXMLComposers);
-}
-
-void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const Tree& tree) const {
-	tree.getData().Accept((void*) &out, alib::ToXMLComposers::toXMLComposers);
-}
-
-void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const RankedTree& tree) const {
-	out.emplace_back(sax::Token(alib::Names::TREE_RANKED_TREE, sax::Token::TokenType::START_ELEMENT));
-
-	composeAlphabet(out, tree.getAlphabet());
-	composeNode(out, tree.getRoot());
-
-	out.emplace_back(sax::Token(alib::Names::TREE_RANKED_TREE, sax::Token::TokenType::END_ELEMENT));
-}
-
-void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const RankedPattern& tree) const {
-	out.emplace_back(sax::Token(alib::Names::TREE_RANKED_PATTERN, sax::Token::TokenType::START_ELEMENT));
-
-	composeSubtreeWildcard(out, tree.getSubtreeWildcard());
-	composeAlphabet(out, tree.getAlphabet());
-	composeNode(out, tree.getRoot());
-
-	out.emplace_back(sax::Token(alib::Names::TREE_RANKED_PATTERN, sax::Token::TokenType::END_ELEMENT));
-}
-
-void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const PrefixRankedTree& tree) const {
-	out.emplace_back(sax::Token(alib::Names::TREE_PREFIX_RANKED_TREE, sax::Token::TokenType::START_ELEMENT));
-
-	composeAlphabet(out, tree.getAlphabet());
-	out.emplace_back("content", sax::Token::TokenType::START_ELEMENT);
-	for(const auto& symbol : tree.getContent()) {
-		alib::xmlApi<alphabet::RankedSymbol>::compose(out, symbol);
-	}
-	out.emplace_back("content", sax::Token::TokenType::END_ELEMENT);
-
-	out.emplace_back(sax::Token(alib::Names::TREE_PREFIX_RANKED_TREE, sax::Token::TokenType::END_ELEMENT));
-}
-
-void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const PrefixRankedBarTree& tree) const {
-	out.emplace_back(sax::Token(alib::Names::TREE_PREFIX_RANKED_BAR_TREE, sax::Token::TokenType::START_ELEMENT));
-
-	composeBar(out, tree.getBarSymbol());
-	composeAlphabet(out, tree.getAlphabet());
-	out.emplace_back("content", sax::Token::TokenType::START_ELEMENT);
-	for(const auto& symbol : tree.getContent()) {
-		alib::xmlApi<alphabet::RankedSymbol>::compose(out, symbol);
-	}
-	out.emplace_back("content", sax::Token::TokenType::END_ELEMENT);
-
-	out.emplace_back(sax::Token(alib::Names::TREE_PREFIX_RANKED_BAR_TREE, sax::Token::TokenType::END_ELEMENT));
-}
-
-void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const PrefixRankedBarPattern& tree) const {
-	out.emplace_back(sax::Token(alib::Names::TREE_PREFIX_RANKED_BAR_PATTERN, sax::Token::TokenType::START_ELEMENT));
-
-	composeBar(out, tree.getBarSymbol());
-	composeVariablesBar(out, tree.getVariablesBarSymbol());
-	composeSubtreeWildcard(out, tree.getSubtreeWildcard());
-	composeAlphabet(out, tree.getAlphabet());
-	out.emplace_back("content", sax::Token::TokenType::START_ELEMENT);
-	for(const auto& symbol : tree.getContent()) {
-		alib::xmlApi<alphabet::RankedSymbol>::compose(out, symbol);
-	}
-	out.emplace_back("content", sax::Token::TokenType::END_ELEMENT);
-
-	out.emplace_back(sax::Token(alib::Names::TREE_PREFIX_RANKED_BAR_PATTERN, sax::Token::TokenType::END_ELEMENT));
-}
-
-void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const PrefixRankedPattern& tree) const {
-	out.emplace_back(sax::Token(alib::Names::TREE_PREFIX_RANKED_PATTERN, sax::Token::TokenType::START_ELEMENT));
-
-	composeSubtreeWildcard(out, tree.getSubtreeWildcard());
-	composeAlphabet(out, tree.getAlphabet());
-	out.emplace_back("content", sax::Token::TokenType::START_ELEMENT);
-	for(const auto& symbol : tree.getContent()) {
-		alib::xmlApi<alphabet::RankedSymbol>::compose(out, symbol);
-	}
-	out.emplace_back("content", sax::Token::TokenType::END_ELEMENT);
-
-	out.emplace_back(sax::Token(alib::Names::TREE_PREFIX_RANKED_PATTERN, sax::Token::TokenType::END_ELEMENT));
-}
-
-void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const UnrankedTree& tree) const {
-	out.emplace_back(sax::Token(alib::Names::TREE_UNRANKED_TREE, sax::Token::TokenType::START_ELEMENT));
-
-	composeAlphabet(out, tree.getAlphabet());
-	composeNode(out, tree.getRoot());
-
-	out.emplace_back(sax::Token(alib::Names::TREE_UNRANKED_TREE, sax::Token::TokenType::END_ELEMENT));
-}
-
-void TreeToXMLComposer::compose(std::deque<sax::Token>& out, const UnrankedPattern& tree) const {
-	out.emplace_back(sax::Token(alib::Names::TREE_UNRANKED_PATTERN, sax::Token::TokenType::START_ELEMENT));
-
-	composeSubtreeWildcard(out, tree.getSubtreeWildcard());
-	composeAlphabet(out, tree.getAlphabet());
-	composeNode(out, tree.getRoot());
-
-	out.emplace_back(sax::Token(alib::Names::TREE_UNRANKED_PATTERN, sax::Token::TokenType::END_ELEMENT));
-}
-
-void TreeToXMLComposer::composeNode(std::deque<sax::Token>& out, const RankedNode& node) const {
-	out.emplace_back(sax::Token("rankedNode", sax::Token::TokenType::START_ELEMENT));
-	alib::xmlApi<alphabet::RankedSymbol>::compose(out, node.getSymbol());
-	for(const auto& child : node.getChildren()) {
-		composeNode(out, *child);
-	}
-
-	out.emplace_back(sax::Token("rankedNode", sax::Token::TokenType::END_ELEMENT));
-}
-
-void TreeToXMLComposer::composeNode(std::deque<sax::Token>& out, const UnrankedNode& node) const {
-	out.emplace_back(sax::Token("unrankedNode", sax::Token::TokenType::START_ELEMENT));
-	alib::xmlApi<alphabet::Symbol>::compose(out, node.getSymbol());
-	for(const auto& child : node.getChildren()) {
-		composeNode(out, *child);
-	}
-
-	out.emplace_back(sax::Token("unrankedNode", sax::Token::TokenType::END_ELEMENT));
-}
-
-} /* namespace automaton */
-
diff --git a/alib2data/src/tree/TreeToXMLComposer.h b/alib2data/src/tree/TreeToXMLComposer.h
deleted file mode 100644
index c1e2563b35..0000000000
--- a/alib2data/src/tree/TreeToXMLComposer.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * TreeToXMLComposer.h
- *
- *  Created on: Nov 16, 2014
- *      Author: Stepan Plachy
- */
-
-#ifndef TREE_TO_XML_COMPOSER_H_
-#define TREE_TO_XML_COMPOSER_H_
-
-#include <deque>
-#include "TreeFeatures.h"
-#include "../alphabet/SymbolFeatures.h"
-#include "../sax/Token.h"
-#include <set>
-#include "../XmlApiBase.h"
-
-namespace tree {
-
-/**
- * This class contains methods to print XML representation of tree to the output stream.
- */
-class TreeToXMLComposer {
-public:
-	TreeToXMLComposer() {}
-
-private:
-	void composeAlphabet(std::deque<sax::Token>& out, const std::set<alphabet::RankedSymbol>& symbols) const;
-	void composeAlphabet(std::deque<sax::Token>& out, const std::set<alphabet::Symbol>& symbols) const;
-
-	void composeBar(std::deque<sax::Token>& out, const alphabet::Symbol& symbol) const;
-	void composeVariablesBar(std::deque<sax::Token>& out, const alphabet::Symbol& symbol) const;
-
-	template<class T>
-	void composeSubtreeWildcard(std::deque<sax::Token>& out, const T& symbol) const;
-
-	/**
-	 * Prints XML representation of Tree to the output stream.
-	 * @param tree tree to print
-	 * @return list of xml tokens representing the tree
-	 */
-	void compose(std::deque<sax::Token>& out, const TreeBase& tree) const;
-	void compose(std::deque<sax::Token>& out, const Tree& tree) const;
-
-	void compose(std::deque<sax::Token>& out, const RankedTree& tree) const;
-	void compose(std::deque<sax::Token>& out, const RankedPattern& tree) const;
-	void compose(std::deque<sax::Token>& out, const PrefixRankedTree& tree) const;
-	void compose(std::deque<sax::Token>& out, const PrefixRankedBarTree& tree) const;
-	void compose(std::deque<sax::Token>& out, const PrefixRankedPattern& tree) const;
-	void compose(std::deque<sax::Token>& out, const PrefixRankedBarPattern& tree) const;
-	void compose(std::deque<sax::Token>& out, const UnrankedTree& tree) const;
-	void compose(std::deque<sax::Token>& out, const UnrankedPattern& tree) const;
-
-	void composeNode(std::deque<sax::Token>& out, const RankedNode& node) const;
-	void composeNode(std::deque<sax::Token>& out, const UnrankedNode& node) const;
-
-	template<typename T, typename Enable> friend struct alib::xmlApi;
-};
-
-} /* namespace tree */
-
-#endif /* TREE_TO_XML_COMPOSER_H_ */
-
diff --git a/alib2data/src/tree/common/TreeFromXMLParser.cpp b/alib2data/src/tree/common/TreeFromXMLParser.cpp
new file mode 100644
index 0000000000..b486e10a5f
--- /dev/null
+++ b/alib2data/src/tree/common/TreeFromXMLParser.cpp
@@ -0,0 +1,100 @@
+/*
+ * TreeFromXMLParser.cpp
+ *
+ *  Created on: Nov 16, 2014
+ *      Author: Stepan Plachy
+ */
+
+#include "../../sax/FromXMLParserHelper.h"
+#include "TreeFromXMLParser.h"
+#include "../../sax/ParserException.h"
+#include "../../XmlApi.hpp"
+
+namespace tree {
+
+alphabet::Symbol TreeFromXMLParser::parseBar(std::deque<sax::Token>::iterator& input) {
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "bar");
+	alphabet::Symbol bar(alib::xmlApi<alphabet::Symbol>::parse(input));
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "bar");
+	return bar;
+}
+
+alphabet::Symbol TreeFromXMLParser::parseVariablesBar(std::deque<sax::Token>::iterator& input) {
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "variablesBar");
+	alphabet::Symbol variablesBar(alib::xmlApi<alphabet::Symbol>::parse(input));
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "variablesBar");
+	return variablesBar;
+}
+
+alphabet::Symbol TreeFromXMLParser::parseSubtreeWildcardSymbol(std::deque<sax::Token>::iterator& input) {
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "subtreeWildcard");
+	alphabet::Symbol subtreeWildcard(alib::xmlApi<alphabet::Symbol>::parse(input));
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "subtreeWildcard");
+	return subtreeWildcard;
+}
+
+alphabet::RankedSymbol TreeFromXMLParser::parseSubtreeWildcardRankedSymbol(std::deque<sax::Token>::iterator& input) {
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "subtreeWildcard");
+	alphabet::RankedSymbol subtreeWildcard(alib::xmlApi<alphabet::RankedSymbol>::parse(input));
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "subtreeWildcard");
+	return subtreeWildcard;
+}
+
+std::set<alphabet::RankedSymbol> TreeFromXMLParser::parseRankedAlphabet(std::deque<sax::Token>::iterator& input) {
+	std::set<alphabet::RankedSymbol> rankedSymbols;
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "rankedAlphabet");
+	while (sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
+		rankedSymbols.insert(alib::xmlApi<alphabet::RankedSymbol>::parse(input));
+	}
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "rankedAlphabet");
+	return rankedSymbols;
+}
+
+std::set<alphabet::Symbol> TreeFromXMLParser::parseAlphabet(std::deque<sax::Token>::iterator& input) {
+	std::set<alphabet::Symbol> symbols;
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "alphabet");
+	while (sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
+		symbols.insert(alib::xmlApi<alphabet::Symbol>::parse(input));
+	}
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "alphabet");
+	return symbols;
+}
+
+std::vector<alphabet::RankedSymbol> TreeFromXMLParser::parseContentData(std::deque<sax::Token>::iterator& input) {
+	std::vector<alphabet::RankedSymbol> data;
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "content");
+	while (sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
+		data.push_back(alib::xmlApi<alphabet::RankedSymbol>::parse(input));
+	}
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "content");
+	return data;
+}
+
+RankedNode * TreeFromXMLParser::parseRankedNode(std::deque<sax::Token>::iterator& input) {
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "rankedNode");
+	alphabet::RankedSymbol symbol = alib::xmlApi<alphabet::RankedSymbol>::parse(input);
+	int rank = symbol.getRank().getData();
+	std::vector<RankedNode *> children;
+	children.reserve(rank);
+	while (sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
+		children.push_back(parseRankedNode(input));
+	}
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "rankedNode");
+
+	return new RankedNode(symbol, children);
+}
+
+UnrankedNode * TreeFromXMLParser::parseUnrankedNode(std::deque<sax::Token>::iterator& input) {
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, "unrankedNode");
+	alphabet::Symbol symbol = alib::xmlApi<alphabet::Symbol>::parse(input);
+	std::vector<UnrankedNode *> children;
+	while (sax::FromXMLParserHelper::isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
+		children.push_back(parseUnrankedNode(input));
+	}
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, "unrankedNode");
+
+	return new UnrankedNode(symbol, children);
+}
+
+} /* namespace tree */
+
diff --git a/alib2data/src/tree/common/TreeFromXMLParser.h b/alib2data/src/tree/common/TreeFromXMLParser.h
new file mode 100644
index 0000000000..73321b4b1a
--- /dev/null
+++ b/alib2data/src/tree/common/TreeFromXMLParser.h
@@ -0,0 +1,43 @@
+/*
+ * TreeFromXMLParser.h
+ *
+ *  Created on: Nov 16, 2014
+ *      Author: Stepan Plachy
+ */
+
+#ifndef TREE_FROM_XML_PARSER_H_
+#define TREE_FROM_XML_PARSER_H_
+
+#include <set>
+#include <vector>
+#include <deque>
+
+#include "../../sax/Token.h"
+#include "../../alphabet/SymbolFeatures.h"
+#include "../ranked/RankedNode.h"
+#include "../unranked/UnrankedNode.h"
+
+namespace tree {
+
+/**
+ * Parser used to get tree from XML parsed into list of Tokens.
+ */
+class TreeFromXMLParser {
+public:
+	static RankedNode * parseRankedNode(std::deque<sax::Token>::iterator& input);
+	static std::vector<alphabet::RankedSymbol> parseContentData(std::deque<sax::Token>::iterator& input);
+	static UnrankedNode * parseUnrankedNode(std::deque<sax::Token>::iterator& input);
+	static std::set<alphabet::RankedSymbol> parseRankedAlphabet(std::deque<sax::Token>::iterator& input);
+	static std::set<alphabet::Symbol> parseAlphabet(std::deque<sax::Token>::iterator& input);
+
+	static alphabet::Symbol parseBar(std::deque<sax::Token>::iterator& input);
+	static alphabet::Symbol parseVariablesBar(std::deque<sax::Token>::iterator& input);
+
+	static alphabet::Symbol parseSubtreeWildcardSymbol(std::deque<sax::Token>::iterator& input);
+	static alphabet::RankedSymbol parseSubtreeWildcardRankedSymbol(std::deque<sax::Token>::iterator& input);
+};
+
+} /* namespace tree */
+
+#endif /* TREE_FROM_XML_PARSER_H_ */
+
diff --git a/alib2data/src/tree/common/TreeToXMLComposer.cpp b/alib2data/src/tree/common/TreeToXMLComposer.cpp
new file mode 100644
index 0000000000..c3760cdb8c
--- /dev/null
+++ b/alib2data/src/tree/common/TreeToXMLComposer.cpp
@@ -0,0 +1,90 @@
+/*
+ * TreeToXMLComposer.cpp
+ *
+ *  Created on: Nov 16, 2014
+ *      Author: Stepan Plachy
+ */
+
+#include "TreeToXMLComposer.h"
+#include "../../XmlApi.hpp"
+
+namespace tree {
+
+void TreeToXMLComposer::composeBar(std::deque<sax::Token>& out, const alphabet::Symbol& symbol) {
+	out.emplace_back(sax::Token("bar", sax::Token::TokenType::START_ELEMENT));
+	alib::xmlApi<alphabet::Symbol>::compose(out, symbol);
+	out.emplace_back(sax::Token("bar", sax::Token::TokenType::END_ELEMENT));
+}
+
+void TreeToXMLComposer::composeVariablesBar(std::deque<sax::Token>& out, const alphabet::Symbol& symbol) {
+	out.emplace_back(sax::Token("variablesBar", sax::Token::TokenType::START_ELEMENT));
+	alib::xmlApi<alphabet::Symbol>::compose(out, symbol);
+	out.emplace_back(sax::Token("variablesBar", sax::Token::TokenType::END_ELEMENT));
+}
+
+void TreeToXMLComposer::composeSubtreeWildcard(std::deque<sax::Token>& out, const alphabet::Symbol& symbol) {
+	out.emplace_back(sax::Token("subtreeWildcard", sax::Token::TokenType::START_ELEMENT));
+	alib::xmlApi<alphabet::Symbol>::compose(out, symbol);
+	out.emplace_back(sax::Token("subtreeWildcard", sax::Token::TokenType::END_ELEMENT));
+}
+
+void TreeToXMLComposer::composeSubtreeWildcard(std::deque<sax::Token>& out, const alphabet::RankedSymbol& symbol) {
+	out.emplace_back(sax::Token("subtreeWildcard", sax::Token::TokenType::START_ELEMENT));
+	alib::xmlApi<alphabet::RankedSymbol>::compose(out, symbol);
+	out.emplace_back(sax::Token("subtreeWildcard", sax::Token::TokenType::END_ELEMENT));
+}
+
+void TreeToXMLComposer::composeAlphabet(std::deque<sax::Token>& out, const std::set<alphabet::RankedSymbol>& symbols) {
+	out.emplace_back(sax::Token("rankedAlphabet", sax::Token::TokenType::START_ELEMENT));
+	for (const auto& symbol : symbols) {
+		alib::xmlApi<alphabet::RankedSymbol>::compose(out, symbol);
+	}
+	out.emplace_back(sax::Token("rankedAlphabet", sax::Token::TokenType::END_ELEMENT));
+}
+
+void TreeToXMLComposer::composeAlphabet(std::deque<sax::Token>& out, const std::set<alphabet::Symbol>& symbols) {
+	out.emplace_back(sax::Token("alphabet", sax::Token::TokenType::START_ELEMENT));
+	for (const auto& symbol : symbols) {
+		alib::xmlApi<alphabet::Symbol>::compose(out, symbol);
+	}
+	out.emplace_back(sax::Token("alphabet", sax::Token::TokenType::END_ELEMENT));
+}
+
+void TreeToXMLComposer::composeNode(std::deque<sax::Token>& out, const RankedNode& node) {
+	out.emplace_back(sax::Token("rankedNode", sax::Token::TokenType::START_ELEMENT));
+	alib::xmlApi<alphabet::RankedSymbol>::compose(out, node.getSymbol());
+	for(const auto& child : node.getChildren()) {
+		composeNode(out, *child);
+	}
+
+	out.emplace_back(sax::Token("rankedNode", sax::Token::TokenType::END_ELEMENT));
+}
+
+void TreeToXMLComposer::composeNode(std::deque<sax::Token>& out, const UnrankedNode& node) {
+	out.emplace_back(sax::Token("unrankedNode", sax::Token::TokenType::START_ELEMENT));
+	alib::xmlApi<alphabet::Symbol>::compose(out, node.getSymbol());
+	for(const auto& child : node.getChildren()) {
+		composeNode(out, *child);
+	}
+
+	out.emplace_back(sax::Token("unrankedNode", sax::Token::TokenType::END_ELEMENT));
+}
+
+void TreeToXMLComposer::composeContent(std::deque<sax::Token>& out, const std::vector<alphabet::Symbol>& content) {
+	out.emplace_back("content", sax::Token::TokenType::START_ELEMENT);
+	for(const auto& symbol : content) {
+		alib::xmlApi<alphabet::Symbol>::compose(out, symbol);
+	}
+	out.emplace_back("content", sax::Token::TokenType::END_ELEMENT);
+}
+
+void TreeToXMLComposer::composeContent(std::deque<sax::Token>& out, const std::vector<alphabet::RankedSymbol>& content) {
+	out.emplace_back("content", sax::Token::TokenType::START_ELEMENT);
+	for(const auto& symbol : content) {
+		alib::xmlApi<alphabet::RankedSymbol>::compose(out, symbol);
+	}
+	out.emplace_back("content", sax::Token::TokenType::END_ELEMENT);
+}
+
+} /* namespace automaton */
+
diff --git a/alib2data/src/tree/common/TreeToXMLComposer.h b/alib2data/src/tree/common/TreeToXMLComposer.h
new file mode 100644
index 0000000000..aba26b4689
--- /dev/null
+++ b/alib2data/src/tree/common/TreeToXMLComposer.h
@@ -0,0 +1,45 @@
+/*
+ * TreeToXMLComposer.h
+ *
+ *  Created on: Nov 16, 2014
+ *      Author: Stepan Plachy
+ */
+
+#ifndef TREE_TO_XML_COMPOSER_H_
+#define TREE_TO_XML_COMPOSER_H_
+
+#include <deque>
+#include <set>
+#include <vector>
+#include "../../alphabet/SymbolFeatures.h"
+#include "../../sax/Token.h"
+#include "../ranked/RankedNode.h"
+#include "../unranked/UnrankedNode.h"
+
+namespace tree {
+
+/**
+ * This class contains methods to print XML representation of tree to the output stream.
+ */
+class TreeToXMLComposer {
+public:
+	static void composeAlphabet(std::deque<sax::Token>& out, const std::set<alphabet::RankedSymbol>& symbols);
+	static void composeAlphabet(std::deque<sax::Token>& out, const std::set<alphabet::Symbol>& symbols);
+
+	static void composeBar(std::deque<sax::Token>& out, const alphabet::Symbol& symbol);
+	static void composeVariablesBar(std::deque<sax::Token>& out, const alphabet::Symbol& symbol);
+
+	static void composeSubtreeWildcard(std::deque<sax::Token>& out, const alphabet::Symbol& symbol);
+	static void composeSubtreeWildcard(std::deque<sax::Token>& out, const alphabet::RankedSymbol& symbol);
+
+	static void composeNode(std::deque<sax::Token>& out, const RankedNode& node);
+	static void composeNode(std::deque<sax::Token>& out, const UnrankedNode& node);
+
+	static void composeContent(std::deque<sax::Token>& out, const std::vector<alphabet::Symbol>& content);
+	static void composeContent(std::deque<sax::Token>& out, const std::vector<alphabet::RankedSymbol>& content);
+};
+
+} /* namespace tree */
+
+#endif /* TREE_TO_XML_COMPOSER_H_ */
+
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp
index ec0e599716..11e0c3d4c1 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp
@@ -14,6 +14,12 @@
 
 #include "RankedPattern.h"
 
+#include "../../sax/FromXMLParserHelper.h"
+#include "../common/TreeFromXMLParser.h"
+#include "../common/TreeToXMLComposer.h"
+#include "../Tree.h"
+#include "../../XmlApi.hpp"
+
 namespace tree {
 
 PrefixRankedBarPattern::PrefixRankedBarPattern(alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::set<alphabet::RankedSymbol> alphabet, std::vector<alphabet::RankedSymbol> data) : RankedPatternAlphabet(std::move(subtreeWildcard)), bar(std::move(bar)), variablesBar(std::move(variablesBar)) {
@@ -147,5 +153,33 @@ PrefixRankedBarPattern::operator std::string () const {
 	return std::move(ss).str();
 }
 
+const std::string PrefixRankedBarPattern::XML_TAG_NAME = "PrefixRankedBarPattern";
+
+PrefixRankedBarPattern PrefixRankedBarPattern::parse(std::deque<sax::Token>::iterator& input) {
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, PrefixRankedBarPattern::XML_TAG_NAME);
+	alphabet::Symbol bar = TreeFromXMLParser::parseBar(input);
+	alphabet::Symbol variablesBarSymbol = TreeFromXMLParser::parseVariablesBar(input);
+	alphabet::RankedSymbol subtreeWildcardSymbol = TreeFromXMLParser::parseSubtreeWildcardRankedSymbol(input);
+	std::set<alphabet::RankedSymbol> rankedAlphabet = TreeFromXMLParser::parseRankedAlphabet(input);
+	std::vector<alphabet::RankedSymbol> data = TreeFromXMLParser::parseContentData(input);
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, PrefixRankedBarPattern::XML_TAG_NAME);
+	return PrefixRankedBarPattern(std::move(bar), std::move(variablesBarSymbol), std::move(subtreeWildcardSymbol), std::move(rankedAlphabet), std::move(data));
+}
+
+void PrefixRankedBarPattern::compose(std::deque<sax::Token>& out) const {
+	out.emplace_back(PrefixRankedBarPattern::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT);
+	TreeToXMLComposer::composeBar(out, bar);
+	TreeToXMLComposer::composeVariablesBar(out, variablesBar);
+	TreeToXMLComposer::composeSubtreeWildcard(out, subtreeWildcard);
+	TreeToXMLComposer::composeAlphabet(out, alphabet);
+	TreeToXMLComposer::composeContent(out, m_Data);
+	out.emplace_back(PrefixRankedBarPattern::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT);
+}
+
 } /* namespace tree */
 
+namespace alib {
+
+xmlApi<tree::Tree>::ParserRegister<tree::PrefixRankedBarPattern> prefixRankedBarPatternParserRegister = xmlApi<tree::Tree>::ParserRegister<tree::PrefixRankedBarPattern>(tree::PrefixRankedBarPattern::XML_TAG_NAME, tree::PrefixRankedBarPattern::parse);
+
+} /* namespace alib */
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h
index e206d86164..0a229ab29f 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h
+++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h
@@ -70,6 +70,12 @@ public:
 	virtual int selfTypeId() const {
 		return typeId(*this);
 	}
+
+	const static std::string XML_TAG_NAME;
+
+	static PrefixRankedBarPattern parse(std::deque<sax::Token>::iterator& input);
+
+	void compose(std::deque<sax::Token>& out) const;
 };
 
 } /* namespace tree */
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp b/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp
index 435bd5ed96..d7560ec570 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp
@@ -14,6 +14,12 @@
 
 #include "RankedTree.h"
 
+#include "../../sax/FromXMLParserHelper.h"
+#include "../common/TreeFromXMLParser.h"
+#include "../common/TreeToXMLComposer.h"
+#include "../Tree.h"
+#include "../../XmlApi.hpp"
+
 namespace tree {
 
 PrefixRankedBarTree::PrefixRankedBarTree(alphabet::Symbol bar, std::set<alphabet::RankedSymbol> alphabet, std::vector<alphabet::RankedSymbol> data) : bar(std::move(bar)) {
@@ -131,5 +137,29 @@ PrefixRankedBarTree::operator std::string () const {
 	return std::move(ss).str();
 }
 
+const std::string PrefixRankedBarTree::XML_TAG_NAME = "PrefixRankedBarTree";
+
+PrefixRankedBarTree PrefixRankedBarTree::parse(std::deque<sax::Token>::iterator& input) {
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, PrefixRankedBarTree::XML_TAG_NAME);
+	alphabet::Symbol bar = TreeFromXMLParser::parseBar(input);
+	std::set<alphabet::RankedSymbol> rankedAlphabet = TreeFromXMLParser::parseRankedAlphabet(input);
+	std::vector<alphabet::RankedSymbol> data = TreeFromXMLParser::parseContentData(input);
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, PrefixRankedBarTree::XML_TAG_NAME);
+	return PrefixRankedBarTree(std::move(bar), std::move(rankedAlphabet), std::move(data));
+}
+
+void PrefixRankedBarTree::compose(std::deque<sax::Token>& out) const {
+	out.emplace_back(PrefixRankedBarTree::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT);
+	TreeToXMLComposer::composeBar(out, bar);
+	TreeToXMLComposer::composeAlphabet(out, alphabet);
+	TreeToXMLComposer::composeContent(out, m_Data);
+	out.emplace_back(PrefixRankedBarTree::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT);
+}
+
 } /* namespace tree */
 
+namespace alib {
+
+xmlApi<tree::Tree>::ParserRegister<tree::PrefixRankedBarTree> prefixRankedBarTreeParserRegister = xmlApi<tree::Tree>::ParserRegister<tree::PrefixRankedBarTree>(tree::PrefixRankedBarTree::XML_TAG_NAME, tree::PrefixRankedBarTree::parse);
+
+} /* namespace alib */
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarTree.h b/alib2data/src/tree/ranked/PrefixRankedBarTree.h
index 0d887eac3a..68088760f0 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarTree.h
+++ b/alib2data/src/tree/ranked/PrefixRankedBarTree.h
@@ -67,6 +67,12 @@ public:
 	virtual int selfTypeId() const {
 		return typeId(*this);
 	}
+
+	const static std::string XML_TAG_NAME;
+
+	static PrefixRankedBarTree parse(std::deque<sax::Token>::iterator& input);
+
+	void compose(std::deque<sax::Token>& out) const;
 };
 
 } /* namespace tree */
diff --git a/alib2data/src/tree/ranked/PrefixRankedPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedPattern.cpp
index 106931c551..36d7941905 100644
--- a/alib2data/src/tree/ranked/PrefixRankedPattern.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedPattern.cpp
@@ -14,6 +14,12 @@
 
 #include "RankedPattern.h"
 
+#include "../../sax/FromXMLParserHelper.h"
+#include "../common/TreeFromXMLParser.h"
+#include "../common/TreeToXMLComposer.h"
+#include "../Tree.h"
+#include "../../XmlApi.hpp"
+
 namespace tree {
 
 PrefixRankedPattern::PrefixRankedPattern(alphabet::RankedSymbol subtreeWildcard, std::set<alphabet::RankedSymbol> alphabet, std::vector<alphabet::RankedSymbol> data) : RankedPatternAlphabet(std::move(subtreeWildcard)) {
@@ -123,5 +129,29 @@ PrefixRankedPattern::operator std::string () const {
 	return std::move(ss).str();
 }
 
+const std::string PrefixRankedPattern::XML_TAG_NAME = "PrefixRankedPattern";
+
+PrefixRankedPattern PrefixRankedPattern::parse(std::deque<sax::Token>::iterator& input) {
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, PrefixRankedPattern::XML_TAG_NAME);
+	alphabet::RankedSymbol subtreeWildcardSymbol = TreeFromXMLParser::parseSubtreeWildcardRankedSymbol(input);
+	std::set<alphabet::RankedSymbol> rankedAlphabet = TreeFromXMLParser::parseRankedAlphabet(input);
+	std::vector<alphabet::RankedSymbol> data = TreeFromXMLParser::parseContentData(input);
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, PrefixRankedPattern::XML_TAG_NAME);
+	return PrefixRankedPattern(std::move(subtreeWildcardSymbol), std::move(rankedAlphabet), std::move(data));
+}
+
+void PrefixRankedPattern::compose(std::deque<sax::Token>& out) const {
+	out.emplace_back(PrefixRankedPattern::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT);
+	TreeToXMLComposer::composeSubtreeWildcard(out, subtreeWildcard);
+	TreeToXMLComposer::composeAlphabet(out, alphabet);
+	TreeToXMLComposer::composeContent(out, m_Data);
+	out.emplace_back(PrefixRankedPattern::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT);
+}
+
 } /* namespace tree */
 
+namespace alib {
+
+xmlApi<tree::Tree>::ParserRegister<tree::PrefixRankedPattern> prefixRankedPatternParserRegister = xmlApi<tree::Tree>::ParserRegister<tree::PrefixRankedPattern>(tree::PrefixRankedPattern::XML_TAG_NAME, tree::PrefixRankedPattern::parse);
+
+} /* namespace alib */
diff --git a/alib2data/src/tree/ranked/PrefixRankedPattern.h b/alib2data/src/tree/ranked/PrefixRankedPattern.h
index 439fe5b7d5..56331bc755 100644
--- a/alib2data/src/tree/ranked/PrefixRankedPattern.h
+++ b/alib2data/src/tree/ranked/PrefixRankedPattern.h
@@ -60,6 +60,12 @@ public:
 	virtual int selfTypeId() const {
 		return typeId(*this);
 	}
+
+	const static std::string XML_TAG_NAME;
+
+	static PrefixRankedPattern parse(std::deque<sax::Token>::iterator& input);
+
+	void compose(std::deque<sax::Token>& out) const;
 };
 
 } /* namespace tree */
diff --git a/alib2data/src/tree/ranked/PrefixRankedTree.cpp b/alib2data/src/tree/ranked/PrefixRankedTree.cpp
index e25bb312a9..ebddab3aa8 100644
--- a/alib2data/src/tree/ranked/PrefixRankedTree.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedTree.cpp
@@ -14,6 +14,12 @@
 
 #include "RankedTree.h"
 
+#include "../../sax/FromXMLParserHelper.h"
+#include "../common/TreeFromXMLParser.h"
+#include "../common/TreeToXMLComposer.h"
+#include "../Tree.h"
+#include "../../XmlApi.hpp"
+
 namespace tree {
 
 PrefixRankedTree::PrefixRankedTree(std::set<alphabet::RankedSymbol> alphabet, std::vector<alphabet::RankedSymbol> data) {
@@ -120,5 +126,27 @@ PrefixRankedTree::operator std::string () const {
 	return std::move(ss).str();
 }
 
+const std::string PrefixRankedTree::XML_TAG_NAME = "PrefixRankedTree";
+
+PrefixRankedTree PrefixRankedTree::parse(std::deque<sax::Token>::iterator& input) {
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, PrefixRankedTree::XML_TAG_NAME);
+	std::set<alphabet::RankedSymbol> rankedAlphabet = TreeFromXMLParser::parseRankedAlphabet(input);
+	std::vector<alphabet::RankedSymbol> data = TreeFromXMLParser::parseContentData(input);
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, PrefixRankedTree::XML_TAG_NAME);
+	return PrefixRankedTree(std::move(rankedAlphabet), std::move(data));
+}
+
+void PrefixRankedTree::compose(std::deque<sax::Token>& out) const {
+	out.emplace_back(PrefixRankedTree::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT);
+	TreeToXMLComposer::composeAlphabet(out, alphabet);
+	TreeToXMLComposer::composeContent(out, m_Data);
+	out.emplace_back(PrefixRankedTree::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT);
+}
+
 } /* namespace tree */
 
+namespace alib {
+
+xmlApi<tree::Tree>::ParserRegister<tree::PrefixRankedTree> prefixRankedTreeParserRegister = xmlApi<tree::Tree>::ParserRegister<tree::PrefixRankedTree>(tree::PrefixRankedTree::XML_TAG_NAME, tree::PrefixRankedTree::parse);
+
+} /* namespace alib */
diff --git a/alib2data/src/tree/ranked/PrefixRankedTree.h b/alib2data/src/tree/ranked/PrefixRankedTree.h
index f732636f08..e832b63b39 100644
--- a/alib2data/src/tree/ranked/PrefixRankedTree.h
+++ b/alib2data/src/tree/ranked/PrefixRankedTree.h
@@ -60,6 +60,12 @@ public:
 	virtual int selfTypeId() const {
 		return typeId(*this);
 	}
+
+	const static std::string XML_TAG_NAME;
+
+	static PrefixRankedTree parse(std::deque<sax::Token>::iterator& input);
+
+	void compose(std::deque<sax::Token>& out) const;
 };
 
 } /* namespace tree */
diff --git a/alib2data/src/tree/ranked/RankedPattern.cpp b/alib2data/src/tree/ranked/RankedPattern.cpp
index 7bf22b03d0..4c8bce329e 100644
--- a/alib2data/src/tree/ranked/RankedPattern.cpp
+++ b/alib2data/src/tree/ranked/RankedPattern.cpp
@@ -14,6 +14,12 @@
 
 #include "../unranked/UnrankedPattern.h"
 
+#include "../../sax/FromXMLParserHelper.h"
+#include "../common/TreeFromXMLParser.h"
+#include "../common/TreeToXMLComposer.h"
+#include "../Tree.h"
+#include "../../XmlApi.hpp"
+
 namespace tree {
 
 RankedPattern::RankedPattern(const UnrankedPattern& other) : RankedPatternAlphabet(alphabet::RankedSymbol(other.getSubtreeWildcard(), 0)) {
@@ -128,4 +134,31 @@ RankedPattern::operator std::string () const {
 	return ss.str();
 }
 
+const std::string RankedPattern::XML_TAG_NAME = "RankedPattern";
+
+RankedPattern RankedPattern::parse(std::deque<sax::Token>::iterator& input) {
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, RankedPattern::XML_TAG_NAME);
+	alphabet::RankedSymbol subtreeWildcardSymbol = TreeFromXMLParser::parseSubtreeWildcardRankedSymbol(input);
+	std::set<alphabet::RankedSymbol> rankedAlphabet = TreeFromXMLParser::parseRankedAlphabet(input);
+	RankedNode * root = TreeFromXMLParser::parseRankedNode(input);
+	RankedPattern tree(std::move(subtreeWildcardSymbol), std::move(rankedAlphabet), std::move(*root));
+	delete root;
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, RankedPattern::XML_TAG_NAME);
+	return tree;
+}
+
+void RankedPattern::compose(std::deque<sax::Token>& out) const {
+	out.emplace_back(RankedPattern::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT);
+	TreeToXMLComposer::composeSubtreeWildcard(out, subtreeWildcard);
+	TreeToXMLComposer::composeAlphabet(out, alphabet);
+	TreeToXMLComposer::composeNode(out, *pattern);
+	out.emplace_back(RankedPattern::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT);
+}
+
 } /* namespace tree */
+
+namespace alib {
+
+xmlApi<tree::Tree>::ParserRegister<tree::RankedPattern> rankedPatternParserRegister = xmlApi<tree::Tree>::ParserRegister<tree::RankedPattern>(tree::RankedPattern::XML_TAG_NAME, tree::RankedPattern::parse);
+
+} /* namespace alib */
diff --git a/alib2data/src/tree/ranked/RankedPattern.h b/alib2data/src/tree/ranked/RankedPattern.h
index 8ff7744c18..fe9bb3bf83 100644
--- a/alib2data/src/tree/ranked/RankedPattern.h
+++ b/alib2data/src/tree/ranked/RankedPattern.h
@@ -95,6 +95,12 @@ public:
 	virtual int selfTypeId() const {
 		return typeId(*this);
 	}
+
+	const static std::string XML_TAG_NAME;
+
+	static RankedPattern parse(std::deque<sax::Token>::iterator& input);
+
+	void compose(std::deque<sax::Token>& out) const;
 };
 
 } /* namespace tree */
diff --git a/alib2data/src/tree/ranked/RankedTree.cpp b/alib2data/src/tree/ranked/RankedTree.cpp
index f0d69c94b1..bbe1975d7a 100644
--- a/alib2data/src/tree/ranked/RankedTree.cpp
+++ b/alib2data/src/tree/ranked/RankedTree.cpp
@@ -14,6 +14,12 @@
 
 #include "../unranked/UnrankedTree.h"
 
+#include "../../sax/FromXMLParserHelper.h"
+#include "../common/TreeFromXMLParser.h"
+#include "../common/TreeToXMLComposer.h"
+#include "../Tree.h"
+#include "../../XmlApi.hpp"
+
 namespace tree {
 
 RankedTree::RankedTree(const UnrankedTree& other) {
@@ -122,4 +128,29 @@ RankedTree::operator std::string () const {
 	return ss.str();
 }
 
+const std::string RankedTree::XML_TAG_NAME = "RankedTree";
+
+RankedTree RankedTree::parse(std::deque<sax::Token>::iterator& input) {
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, RankedTree::XML_TAG_NAME);
+	std::set<alphabet::RankedSymbol> rankedAlphabet = TreeFromXMLParser::parseRankedAlphabet(input);
+	RankedNode * root = TreeFromXMLParser::parseRankedNode(input);
+	RankedTree tree(std::move(rankedAlphabet), std::move(*root));
+	delete root;
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, RankedTree::XML_TAG_NAME);
+	return tree;
+}
+
+void RankedTree::compose(std::deque<sax::Token>& out) const {
+	out.emplace_back(RankedTree::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT);
+	TreeToXMLComposer::composeAlphabet(out, alphabet);
+	TreeToXMLComposer::composeNode(out, *tree);
+	out.emplace_back(RankedTree::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT);
+}
+
 } /* namespace tree */
+
+namespace alib {
+
+xmlApi<tree::Tree>::ParserRegister<tree::RankedTree> rankedTreeParserRegister = xmlApi<tree::Tree>::ParserRegister<tree::RankedTree>(tree::RankedTree::XML_TAG_NAME, tree::RankedTree::parse);
+
+} /* namespace alib */
diff --git a/alib2data/src/tree/ranked/RankedTree.h b/alib2data/src/tree/ranked/RankedTree.h
index 1e11068c5b..a049c41448 100644
--- a/alib2data/src/tree/ranked/RankedTree.h
+++ b/alib2data/src/tree/ranked/RankedTree.h
@@ -95,6 +95,12 @@ public:
 	virtual int selfTypeId() const {
 		return typeId(*this);
 	}
+
+	const static std::string XML_TAG_NAME;
+
+	static RankedTree parse(std::deque<sax::Token>::iterator& input);
+
+	void compose(std::deque<sax::Token>& out) const;
 };
 
 } /* namespace tree */
diff --git a/alib2data/src/tree/unranked/UnrankedPattern.cpp b/alib2data/src/tree/unranked/UnrankedPattern.cpp
index 3dc27ddc66..80a4ade2ba 100644
--- a/alib2data/src/tree/unranked/UnrankedPattern.cpp
+++ b/alib2data/src/tree/unranked/UnrankedPattern.cpp
@@ -14,6 +14,12 @@
 
 #include "../ranked/RankedPattern.h"
 
+#include "../../sax/FromXMLParserHelper.h"
+#include "../common/TreeFromXMLParser.h"
+#include "../common/TreeToXMLComposer.h"
+#include "../Tree.h"
+#include "../../XmlApi.hpp"
+
 namespace tree {
 
 UnrankedPattern::UnrankedPattern(const RankedPattern& other) : UnrankedPatternAlphabet(other.getSubtreeWildcard().getSymbol()) {
@@ -128,4 +134,31 @@ UnrankedPattern::operator std::string () const {
 	return ss.str();
 }
 
+const std::string UnrankedPattern::XML_TAG_NAME = "UnrankedPattern";
+
+UnrankedPattern UnrankedPattern::parse(std::deque<sax::Token>::iterator& input) {
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, UnrankedPattern::XML_TAG_NAME);
+	alphabet::Symbol subtreeWildcardSymbol = TreeFromXMLParser::parseSubtreeWildcardSymbol(input);
+	std::set<alphabet::Symbol> rankedAlphabet = TreeFromXMLParser::parseAlphabet(input);
+	UnrankedNode * root = TreeFromXMLParser::parseUnrankedNode(input);
+	UnrankedPattern tree(std::move(subtreeWildcardSymbol), std::move(rankedAlphabet), std::move(*root));
+	delete root;
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, UnrankedPattern::XML_TAG_NAME);
+	return tree;
+}
+
+void UnrankedPattern::compose(std::deque<sax::Token>& out) const {
+	out.emplace_back(UnrankedPattern::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT);
+	TreeToXMLComposer::composeSubtreeWildcard(out, subtreeWildcard);
+	TreeToXMLComposer::composeAlphabet(out, alphabet);
+	TreeToXMLComposer::composeNode(out, *pattern);
+	out.emplace_back(UnrankedPattern::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT);
+}
+
 } /* namespace tree */
+
+namespace alib {
+
+xmlApi<tree::Tree>::ParserRegister<tree::UnrankedPattern> unrankedPatternParserRegister = xmlApi<tree::Tree>::ParserRegister<tree::UnrankedPattern>(tree::UnrankedPattern::XML_TAG_NAME, tree::UnrankedPattern::parse);
+
+} /* namespace alib */
diff --git a/alib2data/src/tree/unranked/UnrankedPattern.h b/alib2data/src/tree/unranked/UnrankedPattern.h
index 177b9cc82c..6180f4252e 100644
--- a/alib2data/src/tree/unranked/UnrankedPattern.h
+++ b/alib2data/src/tree/unranked/UnrankedPattern.h
@@ -95,6 +95,12 @@ public:
 	virtual int selfTypeId() const {
 		return typeId(*this);
 	}
+
+	const static std::string XML_TAG_NAME;
+
+	static UnrankedPattern parse(std::deque<sax::Token>::iterator& input);
+
+	void compose(std::deque<sax::Token>& out) const;
 };
 
 } /* namespace tree */
diff --git a/alib2data/src/tree/unranked/UnrankedTree.cpp b/alib2data/src/tree/unranked/UnrankedTree.cpp
index 3634c5fa39..d5aa2e7a71 100644
--- a/alib2data/src/tree/unranked/UnrankedTree.cpp
+++ b/alib2data/src/tree/unranked/UnrankedTree.cpp
@@ -14,6 +14,12 @@
 
 #include "../ranked/RankedTree.h"
 
+#include "../../sax/FromXMLParserHelper.h"
+#include "../common/TreeFromXMLParser.h"
+#include "../common/TreeToXMLComposer.h"
+#include "../Tree.h"
+#include "../../XmlApi.hpp"
+
 namespace tree {
 
 UnrankedTree::UnrankedTree(const RankedTree& other) {
@@ -122,4 +128,29 @@ UnrankedTree::operator std::string () const {
 	return ss.str();
 }
 
+const std::string UnrankedTree::XML_TAG_NAME = "UnrankedTree";
+
+UnrankedTree UnrankedTree::parse(std::deque<sax::Token>::iterator& input) {
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, UnrankedTree::XML_TAG_NAME);
+	std::set<alphabet::Symbol> rankedAlphabet = TreeFromXMLParser::parseAlphabet(input);
+	UnrankedNode * root = TreeFromXMLParser::parseUnrankedNode(input);
+	UnrankedTree tree(std::move(rankedAlphabet), std::move(*root));
+	delete root;
+	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, UnrankedTree::XML_TAG_NAME);
+	return tree;
+}
+
+void UnrankedTree::compose(std::deque<sax::Token>& out) const {
+	out.emplace_back(UnrankedTree::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT);
+	TreeToXMLComposer::composeAlphabet(out, alphabet);
+	TreeToXMLComposer::composeNode(out, *tree);
+	out.emplace_back(UnrankedTree::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT);
+}
+
 } /* namespace tree */
+
+namespace alib {
+
+xmlApi<tree::Tree>::ParserRegister<tree::UnrankedTree> unrankedTreeParserRegister = xmlApi<tree::Tree>::ParserRegister<tree::UnrankedTree>(tree::UnrankedTree::XML_TAG_NAME, tree::UnrankedTree::parse);
+
+} /* namespace alib */
diff --git a/alib2data/src/tree/unranked/UnrankedTree.h b/alib2data/src/tree/unranked/UnrankedTree.h
index 35173add3a..bda48e5d98 100644
--- a/alib2data/src/tree/unranked/UnrankedTree.h
+++ b/alib2data/src/tree/unranked/UnrankedTree.h
@@ -95,6 +95,12 @@ public:
 	virtual int selfTypeId() const {
 		return typeId(*this);
 	}
+
+	const static std::string XML_TAG_NAME;
+
+	static UnrankedTree parse(std::deque<sax::Token>::iterator& input);
+
+	void compose(std::deque<sax::Token>& out) const;
 };
 
 } /* namespace tree */
-- 
GitLab