From e9cdb5481c5352888456477485744610f892db8c Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Thu, 11 Jun 2015 11:28:51 +0200
Subject: [PATCH] even more improvements of includes

---
 alib2data/src/XmlApi.cpp                      | 10 ++++++
 alib2data/src/alphabet/SymbolFeatures.h       |  1 +
 alib2data/src/alphabet/SymbolToXMLComposer.h  |  2 +-
 alib2data/src/automaton/AutomatonFeatures.h   |  3 ++
 .../src/automaton/AutomatonFromStringParser.h |  6 ++--
 .../src/automaton/AutomatonFromXMLParser.cpp  |  6 ++--
 .../src/automaton/AutomatonFromXMLParser.h    |  7 ++--
 .../src/automaton/AutomatonToXMLComposer.cpp  |  5 +--
 .../src/automaton/AutomatonToXMLComposer.h    | 10 +++---
 alib2data/src/automaton/common/Shift.cpp      | 33 +++++++++++++++++++
 alib2data/src/automaton/common/Shift.h        |  9 +++--
 alib2data/src/container/ContainerFeatures.h   |  1 +
 .../src/container/ContainerToXMLComposer.cpp  |  1 +
 .../src/container/ContainerToXMLComposer.hpp  |  2 +-
 .../src/exception/ExceptionToXMLComposer.h    |  2 +-
 alib2data/src/grammar/GrammarFeatures.h       |  1 +
 alib2data/src/grammar/GrammarFromXMLParser.h  |  2 +-
 .../src/grammar/GrammarToXMLComposer.cpp      |  1 +
 alib2data/src/grammar/GrammarToXMLComposer.h  |  3 +-
 alib2data/src/graph/GraphFeatures.h           |  6 ++++
 alib2data/src/graph/GraphFromXMLParser.h      |  4 +--
 alib2data/src/graph/GraphToXMLComposer.cpp    |  1 +
 alib2data/src/graph/GraphToXMLComposer.h      |  2 +-
 alib2data/src/label/LabelFeatures.h           |  1 +
 alib2data/src/label/LabelToXMLComposer.cpp    |  1 +
 alib2data/src/label/LabelToXMLComposer.h      |  2 +-
 alib2data/src/object/ObjectFeatures.h         |  1 +
 alib2data/src/object/ObjectFromXMLParser.cpp  | 10 ++++++
 alib2data/src/object/ObjectToXMLComposer.h    |  2 +-
 alib2data/src/primitive/PrimitiveFeatures.h   |  1 +
 .../src/primitive/PrimitiveToXMLComposer.h    |  2 +-
 alib2data/src/regexp/RegExpFeatures.h         |  1 +
 alib2data/src/regexp/RegExpToXMLComposer.cpp  |  1 +
 alib2data/src/regexp/RegExpToXMLComposer.h    |  2 +-
 alib2data/src/string/StringFeatures.h         |  1 +
 alib2data/src/string/StringFromXMLParser.h    |  2 +-
 alib2data/src/string/StringToXMLComposer.cpp  |  1 +
 alib2data/src/string/StringToXMLComposer.h    |  2 +-
 alib2data/src/tree/TreeFeatures.h             |  1 +
 alib2data/src/tree/TreeFromXMLParser.h        |  2 +-
 alib2data/src/tree/TreeToXMLComposer.cpp      |  1 +
 alib2data/src/tree/TreeToXMLComposer.h        |  3 +-
 astat2/src/AutomataSettings.h                 |  4 +--
 astat2/src/GrammarSettings.h                  | 20 +++++++++++
 astat2/src/GrammarStat.h                      | 16 +++++++++
 astat2/src/RegExpSettings.h                   | 18 ++++++++++
 astat2/src/RegExpStat.h                       | 16 +++++++++
 astat2/src/astat.cpp                          |  5 ++-
 48 files changed, 194 insertions(+), 40 deletions(-)
 create mode 100644 astat2/src/GrammarSettings.h
 create mode 100644 astat2/src/GrammarStat.h
 create mode 100644 astat2/src/RegExpSettings.h
 create mode 100644 astat2/src/RegExpStat.h

diff --git a/alib2data/src/XmlApi.cpp b/alib2data/src/XmlApi.cpp
index 21a28d361e..41a741a47f 100644
--- a/alib2data/src/XmlApi.cpp
+++ b/alib2data/src/XmlApi.cpp
@@ -7,17 +7,27 @@
 
 #include "XmlApi.hpp"
 
+#include "alphabet/Symbol.h"
 #include "alphabet/SymbolClasses.h"
+#include "label/Label.h"
 #include "label/LabelClasses.h"
+#include "primitive/Primitive.h"
 #include "primitive/PrimitiveClasses.h"
 #include "object/ObjectClasses.h"
 #include "exception/ExceptionClasses.h"
+#include "string/String.h"
 #include "string/StringClasses.h"
+#include "automaton/Automaton.h"
 #include "automaton/AutomatonClasses.h"
+#include "container/Container.h"
 #include "container/ContainerClasses.h"
+#include "grammar/Grammar.h"
 #include "grammar/GrammarClasses.h"
+#include "regexp/RegExp.h"
 #include "regexp/RegExpClasses.h"
+#include "tree/Tree.h"
 #include "tree/TreeClasses.h"
+#include "graph/Graph.h"
 #include "graph/GraphClasses.h"
 
 namespace alib {
diff --git a/alib2data/src/alphabet/SymbolFeatures.h b/alib2data/src/alphabet/SymbolFeatures.h
index 65c3e03060..6d6ff7cb6b 100644
--- a/alib2data/src/alphabet/SymbolFeatures.h
+++ b/alib2data/src/alphabet/SymbolFeatures.h
@@ -26,6 +26,7 @@ enum class FEATURES {
 };
 
 class Symbol;
+class SymbolBase;
 
 class LabeledSymbol;
 class BlankSymbol;
diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.h b/alib2data/src/alphabet/SymbolToXMLComposer.h
index fb254e4450..6dedb4ad58 100644
--- a/alib2data/src/alphabet/SymbolToXMLComposer.h
+++ b/alib2data/src/alphabet/SymbolToXMLComposer.h
@@ -9,7 +9,7 @@
 #define SYMBOL_TO_XML_COMPOSER_H_
 
 #include <deque>
-#include "Symbol.h"
+#include "SymbolFeatures.h"
 #include "../sax/Token.h"
 
 namespace alib {
diff --git a/alib2data/src/automaton/AutomatonFeatures.h b/alib2data/src/automaton/AutomatonFeatures.h
index 2981c4bf32..83cb35dce0 100644
--- a/alib2data/src/automaton/AutomatonFeatures.h
+++ b/alib2data/src/automaton/AutomatonFeatures.h
@@ -33,6 +33,9 @@ enum class FEATURES {
 };
 
 class Automaton;
+class AutomatonBase;
+class State;
+enum class Shift;
 
 class EpsilonNFA;
 class NFA;
diff --git a/alib2data/src/automaton/AutomatonFromStringParser.h b/alib2data/src/automaton/AutomatonFromStringParser.h
index 7a6fbb5a58..717e0cc517 100644
--- a/alib2data/src/automaton/AutomatonFromStringParser.h
+++ b/alib2data/src/automaton/AutomatonFromStringParser.h
@@ -11,11 +11,13 @@
 #include "AutomatonFromStringLexer.h"
 
 #include "AutomatonFeatures.h"
-#include "common/State.h"
+#include "../string/StringFeatures.h"
+#include "../alphabet/SymbolFeatures.h"
 
+#include <set>
+#include <vector>
 #include <tuple>
 #include <variant>
-#include "../string/Epsilon.h"
 
 namespace alib {
 
diff --git a/alib2data/src/automaton/AutomatonFromXMLParser.cpp b/alib2data/src/automaton/AutomatonFromXMLParser.cpp
index 6005709e06..7efdfcd348 100644
--- a/alib2data/src/automaton/AutomatonFromXMLParser.cpp
+++ b/alib2data/src/automaton/AutomatonFromXMLParser.cpp
@@ -997,11 +997,11 @@ Shift AutomatonFromXMLParser::parseTransitionShift(std::deque<sax::Token>::itera
 
 	popToken(input, sax::Token::TokenType::START_ELEMENT, "shift");
 	if (isToken(input, sax::Token::TokenType::CHARACTER, "left")) {
-		shift = LEFT;
+		shift = Shift::LEFT;
 	} else if (isToken(input, sax::Token::TokenType::CHARACTER, "right")) {
-		shift = RIGHT;
+		shift = Shift::RIGHT;
 	} else if (isToken(input, sax::Token::TokenType::CHARACTER, "none")) {
-		shift = NONE;
+		shift = Shift::NONE;
 	} else {
 		throw sax::ParserException(sax::Token("", sax::Token::TokenType::CHARACTER), *input);
 	}
diff --git a/alib2data/src/automaton/AutomatonFromXMLParser.h b/alib2data/src/automaton/AutomatonFromXMLParser.h
index f625ba9d9b..9d000c0d81 100644
--- a/alib2data/src/automaton/AutomatonFromXMLParser.h
+++ b/alib2data/src/automaton/AutomatonFromXMLParser.h
@@ -13,10 +13,9 @@
 #include <vector>
 #include <variant>
 #include "AutomatonFeatures.h"
-
-#include "common/State.h"
-#include "common/Shift.h"
-#include "../regexp/RegExp.h"
+#include "../regexp/RegExpFeatures.h"
+#include "../alphabet/SymbolFeatures.h"
+#include "../string/StringFeatures.h"
 
 namespace alib {
 
diff --git a/alib2data/src/automaton/AutomatonToXMLComposer.cpp b/alib2data/src/automaton/AutomatonToXMLComposer.cpp
index af9978167d..f6b192c73d 100644
--- a/alib2data/src/automaton/AutomatonToXMLComposer.cpp
+++ b/alib2data/src/automaton/AutomatonToXMLComposer.cpp
@@ -9,6 +9,7 @@
 
 #include "../XmlApi.hpp"
 
+#include "Automaton.h"
 #include "AutomatonClasses.h"
 
 namespace automaton {
@@ -576,9 +577,9 @@ void AutomatonToXMLComposer::composeTransitionFrom(std::deque<sax::Token>& out,
 	out.emplace_back(sax::Token("from", sax::Token::TokenType::END_ELEMENT));
 }
 
-void AutomatonToXMLComposer::composeTransitionShift(std::deque<sax::Token>& out, const Shift shift) const {
+void AutomatonToXMLComposer::composeTransitionShift(std::deque<sax::Token>& out, Shift shift) const {
 	out.emplace_back("shift", sax::Token::TokenType::START_ELEMENT);
-	out.emplace_back(SHIFT_NAMES [shift], sax::Token::TokenType::CHARACTER);
+	out.emplace_back(SHIFT_NAMES [shiftToInt(shift)], sax::Token::TokenType::CHARACTER);
 	out.emplace_back("shift", sax::Token::TokenType::END_ELEMENT);
 }
 
diff --git a/alib2data/src/automaton/AutomatonToXMLComposer.h b/alib2data/src/automaton/AutomatonToXMLComposer.h
index 39ce199a2b..313c67e395 100644
--- a/alib2data/src/automaton/AutomatonToXMLComposer.h
+++ b/alib2data/src/automaton/AutomatonToXMLComposer.h
@@ -13,12 +13,12 @@
 #include <vector>
 #include <set>
 #include <variant>
-#include "Automaton.h"
+#include "AutomatonFeatures.h"
+#include "../regexp/RegExpFeatures.h"
+#include "../alphabet/SymbolFeatures.h"
+#include "../string/StringFeatures.h"
 #include "../sax/Token.h"
 
-#include "common/Shift.h"
-#include "../regexp/RegExp.h"
-
 namespace alib {
 
 template<typename T>
@@ -77,7 +77,7 @@ private:
 	void composeTransitionTo(std::deque<sax::Token>&, const State& state) const;
 	void composeTransitionFrom(std::deque<sax::Token>&, const State& state) const;
 	void composeTransitionFrom(std::deque<sax::Token>&, const std::vector<State> & states) const;
-	void composeTransitionShift(std::deque<sax::Token>&, const Shift shift) const;
+	void composeTransitionShift(std::deque<sax::Token>&, Shift shift) const;
 	void composeTransitionPop(std::deque<sax::Token>&, const std::vector<alphabet::Symbol>& symbols) const;
 	void composeTransitionSinglePop(std::deque<sax::Token>&, const alphabet::Symbol& symbol) const;
 	void composeTransitionPush(std::deque<sax::Token>&, const std::vector<alphabet::Symbol>& symbols) const;
diff --git a/alib2data/src/automaton/common/Shift.cpp b/alib2data/src/automaton/common/Shift.cpp
index 8ca3a6be4b..fbc79dad58 100644
--- a/alib2data/src/automaton/common/Shift.cpp
+++ b/alib2data/src/automaton/common/Shift.cpp
@@ -11,4 +11,37 @@ namespace automaton {
 
 std::string SHIFT_NAMES[] = {"LEFT", "RIGHT", "NONE", "NOT_SET" };
 
+int shiftToInt(const automaton::Shift& shift) {
+	switch(shift) {
+	case automaton::Shift::LEFT:
+		return 0;
+	case automaton::Shift::RIGHT:
+		return 1;
+	case automaton::Shift::NONE:
+		return 2;
+	case automaton::Shift::NOT_SET:
+		return 3;
+	}
+	return 3;
+}
+
+automaton::Shift intToShift(int value) {
+	switch(value) {
+	case 0:
+		return automaton::Shift::LEFT;
+	case 1:
+		return automaton::Shift::RIGHT;
+	case 2:
+		return automaton::Shift::NONE;
+	case 3:
+		return automaton::Shift::NOT_SET;
+	}
+	return automaton::Shift::NOT_SET;
+}
+
+std::ostream& operator<<(std::ostream& out, const automaton::Shift&) {
+
+	return out;
+}
+
 } /* namepsace automaton */
diff --git a/alib2data/src/automaton/common/Shift.h b/alib2data/src/automaton/common/Shift.h
index 9bd37b10f1..5f9c033bf5 100644
--- a/alib2data/src/automaton/common/Shift.h
+++ b/alib2data/src/automaton/common/Shift.h
@@ -16,12 +16,17 @@ namespace automaton {
 /**
  * Represent movement of the reading head in the Turing machine.
  */
-enum Shift {
+enum class Shift {
 	LEFT, RIGHT, NONE, NOT_SET
 };
 
+int shiftToInt(const automaton::Shift& shift);
+automaton::Shift intToShift(int value);
+
 extern std::string SHIFT_NAMES[4];
 
+std::ostream& operator<<(std::ostream& out, const automaton::Shift&);
+
 } /* namespace automaton */
 
 namespace std {
@@ -29,7 +34,7 @@ namespace std {
 template<>
 struct compare<automaton::Shift> {
 	int operator()(const automaton::Shift& first, const automaton::Shift& second) {
-		return first - second;
+		 return automaton::shiftToInt(first) - automaton::shiftToInt(second);
 	}
 };
 
diff --git a/alib2data/src/container/ContainerFeatures.h b/alib2data/src/container/ContainerFeatures.h
index 49a1a35f41..b98acd2048 100644
--- a/alib2data/src/container/ContainerFeatures.h
+++ b/alib2data/src/container/ContainerFeatures.h
@@ -18,6 +18,7 @@ enum class FEATURES {
 };
 
 class Container;
+class ContainerBase;
 
 class ObjectsSet;
 class ObjectsVector;
diff --git a/alib2data/src/container/ContainerToXMLComposer.cpp b/alib2data/src/container/ContainerToXMLComposer.cpp
index c8d9f65915..d7dc9c3116 100644
--- a/alib2data/src/container/ContainerToXMLComposer.cpp
+++ b/alib2data/src/container/ContainerToXMLComposer.cpp
@@ -9,6 +9,7 @@
 
 #include "../XmlApi.hpp"
 
+#include "Container.h"
 #include "ContainerClasses.h"
 
 namespace container {
diff --git a/alib2data/src/container/ContainerToXMLComposer.hpp b/alib2data/src/container/ContainerToXMLComposer.hpp
index 7214b89ee0..07502e1b53 100644
--- a/alib2data/src/container/ContainerToXMLComposer.hpp
+++ b/alib2data/src/container/ContainerToXMLComposer.hpp
@@ -9,7 +9,7 @@
 #define CONTAINER_TO_XML_COMPOSER_H_
 
 #include <deque>
-#include "Container.h"
+#include "ContainerFeatures.h"
 #include <variant>
 #include <set>
 #include <vector>
diff --git a/alib2data/src/exception/ExceptionToXMLComposer.h b/alib2data/src/exception/ExceptionToXMLComposer.h
index a8529ab0ff..611085e813 100644
--- a/alib2data/src/exception/ExceptionToXMLComposer.h
+++ b/alib2data/src/exception/ExceptionToXMLComposer.h
@@ -9,7 +9,7 @@
 #define EXCEPTION_TO_XML_COMPOSER_H_
 
 #include <deque>
-#include "AlibException.h"
+#include "ExceptionFeatures.h"
 #include "../sax/Token.h"
 
 namespace alib {
diff --git a/alib2data/src/grammar/GrammarFeatures.h b/alib2data/src/grammar/GrammarFeatures.h
index 4533db988b..919b3d2cd9 100644
--- a/alib2data/src/grammar/GrammarFeatures.h
+++ b/alib2data/src/grammar/GrammarFeatures.h
@@ -27,6 +27,7 @@ enum class FEATURES {
 };
 
 class Grammar;
+class GrammarBase;
 
 class LeftLG;
 class LeftRG;
diff --git a/alib2data/src/grammar/GrammarFromXMLParser.h b/alib2data/src/grammar/GrammarFromXMLParser.h
index 30eb28e887..9919933bbe 100644
--- a/alib2data/src/grammar/GrammarFromXMLParser.h
+++ b/alib2data/src/grammar/GrammarFromXMLParser.h
@@ -14,7 +14,7 @@
 #include <variant>
 #include <vector>
 #include "GrammarFeatures.h"
-#include "../alphabet/Symbol.h"
+#include "../alphabet/SymbolFeatures.h"
 
 namespace alib {
 
diff --git a/alib2data/src/grammar/GrammarToXMLComposer.cpp b/alib2data/src/grammar/GrammarToXMLComposer.cpp
index 7785030f4e..38df7374ce 100644
--- a/alib2data/src/grammar/GrammarToXMLComposer.cpp
+++ b/alib2data/src/grammar/GrammarToXMLComposer.cpp
@@ -9,6 +9,7 @@
 
 #include "../XmlApi.hpp"
 
+#include "Grammar.h"
 #include "GrammarClasses.h"
 
 namespace grammar {
diff --git a/alib2data/src/grammar/GrammarToXMLComposer.h b/alib2data/src/grammar/GrammarToXMLComposer.h
index b48f971fe5..7d90a1adcd 100644
--- a/alib2data/src/grammar/GrammarToXMLComposer.h
+++ b/alib2data/src/grammar/GrammarToXMLComposer.h
@@ -15,7 +15,8 @@
 #include <map>
 #include <set>
 #include <variant>
-#include "Grammar.h"
+#include "GrammarFeatures.h"
+#include "../alphabet/SymbolFeatures.h"
 #include "../sax/Token.h"
 
 namespace alib {
diff --git a/alib2data/src/graph/GraphFeatures.h b/alib2data/src/graph/GraphFeatures.h
index 0a5e5e8f77..20924e0a5a 100644
--- a/alib2data/src/graph/GraphFeatures.h
+++ b/alib2data/src/graph/GraphFeatures.h
@@ -16,9 +16,15 @@ enum class FEATURES {
 };
 
 class Graph;
+class GraphBase;
+
+class Node;
+enum class REPRESENTATION;
 
 class DirectedGraph;
+class DirectedEdge;
 class UndirectedGraph;
+class UndirectedEdge;
 
 } // namespace graph
 
diff --git a/alib2data/src/graph/GraphFromXMLParser.h b/alib2data/src/graph/GraphFromXMLParser.h
index 877154b5b6..bb415006a7 100644
--- a/alib2data/src/graph/GraphFromXMLParser.h
+++ b/alib2data/src/graph/GraphFromXMLParser.h
@@ -10,9 +10,7 @@
 
 #include "../sax/FromXMLParserHelper.h"
 #include "GraphFeatures.h"
-#include "common/Node.h"
-#include "../alphabet/Symbol.h"
-#include "GraphRepresentation.h"
+#include "../alphabet/SymbolFeatures.h"
 
 namespace alib {
 
diff --git a/alib2data/src/graph/GraphToXMLComposer.cpp b/alib2data/src/graph/GraphToXMLComposer.cpp
index af4e64f09c..3dc0210634 100644
--- a/alib2data/src/graph/GraphToXMLComposer.cpp
+++ b/alib2data/src/graph/GraphToXMLComposer.cpp
@@ -9,6 +9,7 @@
 #include "../XmlApi.hpp"
 
 #include "GraphRepresentation.h"
+#include "Graph.h"
 #include "GraphClasses.h"
 
 namespace graph {
diff --git a/alib2data/src/graph/GraphToXMLComposer.h b/alib2data/src/graph/GraphToXMLComposer.h
index a7a3411f77..1e7c1b136e 100644
--- a/alib2data/src/graph/GraphToXMLComposer.h
+++ b/alib2data/src/graph/GraphToXMLComposer.h
@@ -11,7 +11,7 @@
 #include <set>
 #include <deque>
 
-#include "Graph.h"
+#include "GraphFeatures.h"
 #include "common/GraphElement.h"
 #include "../sax/Token.h"
 
diff --git a/alib2data/src/label/LabelFeatures.h b/alib2data/src/label/LabelFeatures.h
index 8f6721c757..33eb238f44 100644
--- a/alib2data/src/label/LabelFeatures.h
+++ b/alib2data/src/label/LabelFeatures.h
@@ -20,6 +20,7 @@ enum class FEATURES {
 };
 
 class Label;
+class LabelBase;
 
 class PrimitiveLabel;
 class HexavigesimalLabel;
diff --git a/alib2data/src/label/LabelToXMLComposer.cpp b/alib2data/src/label/LabelToXMLComposer.cpp
index c316f6033c..dbd0a3ed81 100644
--- a/alib2data/src/label/LabelToXMLComposer.cpp
+++ b/alib2data/src/label/LabelToXMLComposer.cpp
@@ -9,6 +9,7 @@
 
 #include "../XmlApi.hpp"
 
+#include "Label.h"
 #include "LabelClasses.h"
 
 namespace label {
diff --git a/alib2data/src/label/LabelToXMLComposer.h b/alib2data/src/label/LabelToXMLComposer.h
index d3cc0d1ff7..868d103d88 100644
--- a/alib2data/src/label/LabelToXMLComposer.h
+++ b/alib2data/src/label/LabelToXMLComposer.h
@@ -9,7 +9,7 @@
 #define LABEL_TO_XML_COMPOSER_H_
 
 #include <deque>
-#include "Label.h"
+#include "LabelFeatures.h"
 #include "../sax/Token.h"
 
 namespace alib {
diff --git a/alib2data/src/object/ObjectFeatures.h b/alib2data/src/object/ObjectFeatures.h
index a0361a23c1..a57aa1f843 100644
--- a/alib2data/src/object/ObjectFeatures.h
+++ b/alib2data/src/object/ObjectFeatures.h
@@ -15,6 +15,7 @@ enum class FEATURES {
 };
 
 class Object;
+class ObjectBase;
 
 class Void;
 
diff --git a/alib2data/src/object/ObjectFromXMLParser.cpp b/alib2data/src/object/ObjectFromXMLParser.cpp
index 38b2cef558..e9575438b2 100644
--- a/alib2data/src/object/ObjectFromXMLParser.cpp
+++ b/alib2data/src/object/ObjectFromXMLParser.cpp
@@ -12,6 +12,16 @@
 #include "Object.h"
 #include "ObjectClasses.h"
 
+#include "../alphabet/Symbol.h"
+#include "../automaton/Automaton.h"
+#include "../container/Container.h"
+#include "../grammar/Grammar.h"
+#include "../label/Label.h"
+#include "../primitive/Primitive.h"
+#include "../regexp/RegExp.h"
+#include "../string/String.h"
+#include "../tree/Tree.h"
+
 namespace alib {
 
 Object ObjectFromXMLParser::parseObject(std::deque<sax::Token>::iterator& input) const {
diff --git a/alib2data/src/object/ObjectToXMLComposer.h b/alib2data/src/object/ObjectToXMLComposer.h
index a00e3917d9..a6ff6ee337 100644
--- a/alib2data/src/object/ObjectToXMLComposer.h
+++ b/alib2data/src/object/ObjectToXMLComposer.h
@@ -9,7 +9,7 @@
 #define OBJECT_TO_XML_COMPOSER_H_
 
 #include <deque>
-#include "Object.h"
+#include "ObjectFeatures.h"
 #include "../sax/Token.h"
 
 namespace alib {
diff --git a/alib2data/src/primitive/PrimitiveFeatures.h b/alib2data/src/primitive/PrimitiveFeatures.h
index 3fdbc4a8d3..e66479e7a7 100644
--- a/alib2data/src/primitive/PrimitiveFeatures.h
+++ b/alib2data/src/primitive/PrimitiveFeatures.h
@@ -19,6 +19,7 @@ enum class FEATURES {
 };
 
 class Primitive;
+class PrimitiveBase;
 
 class String;
 class Integer;
diff --git a/alib2data/src/primitive/PrimitiveToXMLComposer.h b/alib2data/src/primitive/PrimitiveToXMLComposer.h
index fab4070830..328c533fe6 100644
--- a/alib2data/src/primitive/PrimitiveToXMLComposer.h
+++ b/alib2data/src/primitive/PrimitiveToXMLComposer.h
@@ -9,7 +9,7 @@
 #define PRIMITIVE_TO_XML_COMPOSER_H_
 
 #include <deque>
-#include "Primitive.h"
+#include "PrimitiveFeatures.h"
 #include "../sax/Token.h"
 
 namespace alib {
diff --git a/alib2data/src/regexp/RegExpFeatures.h b/alib2data/src/regexp/RegExpFeatures.h
index 71d3d5e687..cd1c24f8fa 100644
--- a/alib2data/src/regexp/RegExpFeatures.h
+++ b/alib2data/src/regexp/RegExpFeatures.h
@@ -16,6 +16,7 @@ enum class FEATURES {
 };
 
 class RegExp;
+class RegExpBase;
 
 class UnboundedRegExp;
 
diff --git a/alib2data/src/regexp/RegExpToXMLComposer.cpp b/alib2data/src/regexp/RegExpToXMLComposer.cpp
index 3d76f27050..d9b6ccb8c2 100644
--- a/alib2data/src/regexp/RegExpToXMLComposer.cpp
+++ b/alib2data/src/regexp/RegExpToXMLComposer.cpp
@@ -8,6 +8,7 @@
 #include "RegExpToXMLComposer.h"
 #include "../XmlApi.hpp"
 
+#include "RegExp.h"
 #include "RegExpClasses.h"
 
 #include "unbounded/UnboundedRegExpElements.h"
diff --git a/alib2data/src/regexp/RegExpToXMLComposer.h b/alib2data/src/regexp/RegExpToXMLComposer.h
index 314cf322ef..00b98c422e 100644
--- a/alib2data/src/regexp/RegExpToXMLComposer.h
+++ b/alib2data/src/regexp/RegExpToXMLComposer.h
@@ -9,7 +9,7 @@
 #define REG_EXP_TO_XML_COMPOSER_H_
 
 #include <deque>
-#include "RegExp.h"
+#include "RegExpFeatures.h"
 #include "unbounded/UnboundedRegExpElement.h"
 #include "formal/FormalRegExpElement.h"
 #include "../sax/Token.h"
diff --git a/alib2data/src/string/StringFeatures.h b/alib2data/src/string/StringFeatures.h
index c1f954e132..e8187b712a 100644
--- a/alib2data/src/string/StringFeatures.h
+++ b/alib2data/src/string/StringFeatures.h
@@ -17,6 +17,7 @@ enum class FEATURES {
 };
 
 class String;
+class StringBase;
 
 class Epsilon;
 class LinearString;
diff --git a/alib2data/src/string/StringFromXMLParser.h b/alib2data/src/string/StringFromXMLParser.h
index 0903832daa..78e655c6fe 100644
--- a/alib2data/src/string/StringFromXMLParser.h
+++ b/alib2data/src/string/StringFromXMLParser.h
@@ -12,7 +12,7 @@
 #include <vector>
 #include <set>
 #include "StringFeatures.h"
-#include "../alphabet/Symbol.h"
+#include "../alphabet/SymbolFeatures.h"
 
 namespace alib {
 
diff --git a/alib2data/src/string/StringToXMLComposer.cpp b/alib2data/src/string/StringToXMLComposer.cpp
index 23dd1f74e4..7508195a1f 100644
--- a/alib2data/src/string/StringToXMLComposer.cpp
+++ b/alib2data/src/string/StringToXMLComposer.cpp
@@ -8,6 +8,7 @@
 #include "StringToXMLComposer.h"
 #include "../XmlApi.hpp"
 
+#include "String.h"
 #include "StringClasses.h"
 
 namespace string {
diff --git a/alib2data/src/string/StringToXMLComposer.h b/alib2data/src/string/StringToXMLComposer.h
index aba820c437..6c4ab396ba 100644
--- a/alib2data/src/string/StringToXMLComposer.h
+++ b/alib2data/src/string/StringToXMLComposer.h
@@ -9,7 +9,7 @@
 #define STRING_TO_XML_COMPOSER_H_
 
 #include <deque>
-#include "String.h"
+#include "StringFeatures.h"
 #include "../sax/Token.h"
 
 namespace alib {
diff --git a/alib2data/src/tree/TreeFeatures.h b/alib2data/src/tree/TreeFeatures.h
index ebc94bef34..8c7e94ac7b 100644
--- a/alib2data/src/tree/TreeFeatures.h
+++ b/alib2data/src/tree/TreeFeatures.h
@@ -22,6 +22,7 @@ enum class FEATURES {
 };
 
 class Tree;
+class TreeBase;
 
 class RankedTree;
 class RankedPattern;
diff --git a/alib2data/src/tree/TreeFromXMLParser.h b/alib2data/src/tree/TreeFromXMLParser.h
index 5131a5be76..3b14bffcec 100644
--- a/alib2data/src/tree/TreeFromXMLParser.h
+++ b/alib2data/src/tree/TreeFromXMLParser.h
@@ -15,7 +15,7 @@
 #include <variant>
 #include <vector>
 
-#include "../alphabet/Symbol.h"
+#include "../alphabet/SymbolFeatures.h"
 
 namespace alib {
 
diff --git a/alib2data/src/tree/TreeToXMLComposer.cpp b/alib2data/src/tree/TreeToXMLComposer.cpp
index 340f2d439b..ba1b5e4cda 100644
--- a/alib2data/src/tree/TreeToXMLComposer.cpp
+++ b/alib2data/src/tree/TreeToXMLComposer.cpp
@@ -7,6 +7,7 @@
 
 #include "TreeToXMLComposer.h"
 #include "../XmlApi.hpp"
+#include "Tree.h"
 #include "TreeClasses.h"
 
 namespace tree {
diff --git a/alib2data/src/tree/TreeToXMLComposer.h b/alib2data/src/tree/TreeToXMLComposer.h
index c807678c58..4204168175 100644
--- a/alib2data/src/tree/TreeToXMLComposer.h
+++ b/alib2data/src/tree/TreeToXMLComposer.h
@@ -9,7 +9,8 @@
 #define TREE_TO_XML_COMPOSER_H_
 
 #include <deque>
-#include "Tree.h"
+#include "TreeFeatures.h"
+#include "../alphabet/SymbolFeatures.h"
 #include "../sax/Token.h"
 #include <set>
 
diff --git a/astat2/src/AutomataSettings.h b/astat2/src/AutomataSettings.h
index 3e39f9596a..97b59fe0d7 100644
--- a/astat2/src/AutomataSettings.h
+++ b/astat2/src/AutomataSettings.h
@@ -1,5 +1,5 @@
 /*
- * Settings.h
+ * AutomataSettings.h
  *
  *  Created on: 26. 3. 2014
  *	  Author: Jan Travnicek
@@ -18,4 +18,4 @@ struct AutomataSettings {
 	PrintingOptions transitions;
 };
 
-#endif /* __AUTOMATA_SETTINGS_H_ */
+#endif /* __AUTOMATA_SETTINGS_H__ */
diff --git a/astat2/src/GrammarSettings.h b/astat2/src/GrammarSettings.h
new file mode 100644
index 0000000000..ece01e5b7a
--- /dev/null
+++ b/astat2/src/GrammarSettings.h
@@ -0,0 +1,20 @@
+/*
+ * GrammarSettings.h
+ *
+ *  Created on: 26. 3. 2014
+ *	  Author: Jan Travnicek
+ */
+
+#ifndef __GRAMMAR_SETTINGS_H__
+#define __GRAMMAR_SETTINGS_H__
+
+#include "PrintingOptions.h"
+
+struct GrammarSettings {
+	PrintingOptions nonterminals;
+	PrintingOptions terminals;
+	PrintingOptions initialNonterminal;
+	PrintingOptions rules;
+};
+
+#endif /* __GRAMMAR_SETTINGS_H__ */
diff --git a/astat2/src/GrammarStat.h b/astat2/src/GrammarStat.h
new file mode 100644
index 0000000000..690dbbab8f
--- /dev/null
+++ b/astat2/src/GrammarStat.h
@@ -0,0 +1,16 @@
+/*
+ * GrammarStat.h
+ *
+ *  Created on: 20. 9. 2014
+ *	  Author: Jan Travnicek
+ */
+
+#ifndef GRAMMAR_STAT_H_
+#define GRAMMAR_STAT_H_
+
+#include "grammar/Grammar.h"
+
+#include "GrammarSettings.h"
+
+
+#endif /* GRAMMAR_STAT_H_ */
diff --git a/astat2/src/RegExpSettings.h b/astat2/src/RegExpSettings.h
new file mode 100644
index 0000000000..6c888c86ff
--- /dev/null
+++ b/astat2/src/RegExpSettings.h
@@ -0,0 +1,18 @@
+/*
+ * RegExpSettings.h
+ *
+ *  Created on: 26. 3. 2014
+ *	  Author: Jan Travnicek
+ */
+
+#ifndef __REG_EXP_SETTINGS_H__
+#define __REG_EXP_SETTINGS_H__
+
+#include "PrintingOptions.h"
+
+struct RegExpSettings {
+	PrintingOptions nodes;
+	PrintingOptions alphabet;
+};
+
+#endif /* __REG_EXP_SETTINGS_H__ */
diff --git a/astat2/src/RegExpStat.h b/astat2/src/RegExpStat.h
new file mode 100644
index 0000000000..be57cf81e5
--- /dev/null
+++ b/astat2/src/RegExpStat.h
@@ -0,0 +1,16 @@
+/*
+ * RegExpStat.h
+ *
+ *  Created on: 20. 9. 2014
+ *	  Author: Jan Travnicek
+ */
+
+#ifndef REG_EXP_STATS_H_
+#define REG_EXP_STATS_H_
+
+#include "regexp/RegExp.h"
+
+#include "RegExpSettings.h"
+
+
+#endif /* REG_EXP_STATS_H_ */
diff --git a/astat2/src/astat.cpp b/astat2/src/astat.cpp
index 9e40a770be..0570db9ed9 100644
--- a/astat2/src/astat.cpp
+++ b/astat2/src/astat.cpp
@@ -11,10 +11,9 @@
 #include <factory/XmlDataFactory.hpp>
 #include <exception/AlibException.h>
 
-#include "AutomataSettings.h"
 #include "AutomataStat.h"
-
-#include "SetSettings.h"
+#include "GrammarStat.h"
+#include "RegExpStat.h"
 #include "SetStat.h"
 
 PrintingOptions translatePrintingOptions(std::string value) {
-- 
GitLab