From 40ba7ac8367ae87a61c9916b5b9aa847820e35a3 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Sat, 9 Aug 2014 21:12:17 +0200
Subject: [PATCH] to string for the rest of data classes

---
 alib2data/src/automaton/AutomatonBase.h         |  2 ++
 alib2data/src/automaton/FSM/CompactNFA.cpp      |  7 +++++++
 alib2data/src/automaton/FSM/CompactNFA.h        |  2 ++
 alib2data/src/automaton/FSM/DFA.cpp             |  7 +++++++
 alib2data/src/automaton/FSM/DFA.h               |  2 ++
 alib2data/src/automaton/FSM/EpsilonNFA.cpp      |  7 +++++++
 alib2data/src/automaton/FSM/EpsilonNFA.h        |  2 ++
 alib2data/src/automaton/FSM/ExtendedNFA.cpp     |  7 +++++++
 alib2data/src/automaton/FSM/ExtendedNFA.h       |  2 ++
 alib2data/src/automaton/FSM/NFA.cpp             |  7 +++++++
 alib2data/src/automaton/FSM/NFA.h               |  2 ++
 alib2data/src/automaton/PDA/NPDA.cpp            |  7 +++++++
 alib2data/src/automaton/PDA/NPDA.h              |  1 +
 alib2data/src/automaton/PDA/SinglePopNPDA.cpp   |  7 +++++++
 alib2data/src/automaton/PDA/SinglePopNPDA.h     |  1 +
 alib2data/src/automaton/TM/OneTapeDTM.cpp       |  7 +++++++
 alib2data/src/automaton/TM/OneTapeDTM.h         |  2 ++
 alib2data/src/automaton/UnknownAutomaton.cpp    |  7 +++++++
 alib2data/src/automaton/UnknownAutomaton.h      |  2 ++
 alib2data/src/grammar/ContextFree/CFG.cpp       |  6 ++++++
 alib2data/src/grammar/ContextFree/CFG.h         |  3 +++
 alib2data/src/grammar/ContextFree/CNF.cpp       |  6 ++++++
 alib2data/src/grammar/ContextFree/CNF.h         |  3 +++
 .../src/grammar/ContextFree/EpsilonFreeCFG.cpp  |  6 ++++++
 .../src/grammar/ContextFree/EpsilonFreeCFG.h    |  3 +++
 alib2data/src/grammar/ContextFree/GNF.cpp       |  6 ++++++
 alib2data/src/grammar/ContextFree/GNF.h         |  3 +++
 alib2data/src/grammar/ContextFree/LG.cpp        |  6 ++++++
 alib2data/src/grammar/ContextFree/LG.h          |  3 +++
 alib2data/src/grammar/ContextSensitive/CSG.cpp  |  7 +++++++
 alib2data/src/grammar/ContextSensitive/CSG.h    |  2 ++
 .../ContextSensitive/NonContractingGrammar.cpp  |  7 +++++++
 .../ContextSensitive/NonContractingGrammar.h    |  2 ++
 alib2data/src/grammar/GrammarBase.h             | 12 +++++++-----
 alib2data/src/grammar/Regular/LeftLG.cpp        |  7 +++++++
 alib2data/src/grammar/Regular/LeftLG.h          |  2 ++
 alib2data/src/grammar/Regular/LeftRG.cpp        |  7 +++++++
 alib2data/src/grammar/Regular/LeftRG.h          |  2 ++
 alib2data/src/grammar/Regular/RightLG.cpp       |  7 +++++++
 alib2data/src/grammar/Regular/RightLG.h         |  2 ++
 alib2data/src/grammar/Regular/RightRG.cpp       |  7 +++++++
 alib2data/src/grammar/Regular/RightRG.h         |  2 ++
 alib2data/src/grammar/UnknownGrammar.cpp        |  7 +++++++
 alib2data/src/grammar/UnknownGrammar.h          |  1 +
 .../ContextPreservingUnrestrictedGrammar.cpp    |  7 +++++++
 .../ContextPreservingUnrestrictedGrammar.h      |  2 ++
 .../Unrestricted/UnrestrictedGrammar.cpp        |  7 +++++++
 .../grammar/Unrestricted/UnrestrictedGrammar.h  |  2 ++
 alib2data/src/regexp/RegExpBase.cpp             |  8 ++++++++
 alib2data/src/regexp/RegExpBase.h               | 12 +++++++++---
 alib2data/src/regexp/formal/FormalRegExp.cpp    |  4 ++--
 alib2data/src/regexp/formal/FormalRegExp.h      | 17 ++++++++---------
 52 files changed, 240 insertions(+), 19 deletions(-)

diff --git a/alib2data/src/automaton/AutomatonBase.h b/alib2data/src/automaton/AutomatonBase.h
index 4038de9f78..48bb33c069 100644
--- a/alib2data/src/automaton/AutomatonBase.h
+++ b/alib2data/src/automaton/AutomatonBase.h
@@ -59,6 +59,8 @@ public:
 	friend std::ostream& operator<<(std::ostream& os, const AutomatonBase& automaton);
 
 	virtual void operator>>(std::ostream&) const = 0;
+
+	virtual operator std::string () const = 0;
 };
 
 } /* namespace automaton */
diff --git a/alib2data/src/automaton/FSM/CompactNFA.cpp b/alib2data/src/automaton/FSM/CompactNFA.cpp
index 5e3a22d065..6671cf8e07 100644
--- a/alib2data/src/automaton/FSM/CompactNFA.cpp
+++ b/alib2data/src/automaton/FSM/CompactNFA.cpp
@@ -11,6 +11,7 @@
 #include "../../string/StringAlphabetGetter.h"
 #include <ostream>
 #include <algorithm>
+#include <sstream>
 
 namespace automaton {
 
@@ -126,4 +127,10 @@ void CompactNFA::operator>>(std::ostream& out) const {
 		<< ")";
 }
 
+CompactNFA::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace automaton */
diff --git a/alib2data/src/automaton/FSM/CompactNFA.h b/alib2data/src/automaton/FSM/CompactNFA.h
index 3ec1959049..17baf98b81 100644
--- a/alib2data/src/automaton/FSM/CompactNFA.h
+++ b/alib2data/src/automaton/FSM/CompactNFA.h
@@ -75,6 +75,8 @@ public:
 	virtual bool operator==(const CompactNFA& other) const;
 
 	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string() const;
 };
 
 } /* namespace automaton */
diff --git a/alib2data/src/automaton/FSM/DFA.cpp b/alib2data/src/automaton/FSM/DFA.cpp
index b7e15b791c..6ff34348fb 100644
--- a/alib2data/src/automaton/FSM/DFA.cpp
+++ b/alib2data/src/automaton/FSM/DFA.cpp
@@ -10,6 +10,7 @@
 #include "../../std/map.hpp"
 #include "../AutomatonException.h"
 #include <ostream>
+#include <sstream>
 
 namespace automaton {
 
@@ -149,4 +150,10 @@ void DFA::operator>>(std::ostream& out) const {
 		<< ")";
 }
 
+DFA::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace automaton */
diff --git a/alib2data/src/automaton/FSM/DFA.h b/alib2data/src/automaton/FSM/DFA.h
index ec5a979539..a87fd23d71 100644
--- a/alib2data/src/automaton/FSM/DFA.h
+++ b/alib2data/src/automaton/FSM/DFA.h
@@ -85,6 +85,8 @@ public:
 	virtual bool operator==(const DFA& other) const;
 	
 	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string() const;
 };
 
 } /* namespace automaton */
diff --git a/alib2data/src/automaton/FSM/EpsilonNFA.cpp b/alib2data/src/automaton/FSM/EpsilonNFA.cpp
index 79a1268dac..2558499995 100644
--- a/alib2data/src/automaton/FSM/EpsilonNFA.cpp
+++ b/alib2data/src/automaton/FSM/EpsilonNFA.cpp
@@ -9,6 +9,7 @@
 #include "../../std/map.hpp"
 #include "../AutomatonException.h"
 #include <ostream>
+#include <sstream>
 
 namespace automaton {
 
@@ -249,4 +250,10 @@ void EpsilonNFA::operator>>(std::ostream& out) const {
 		<< ")";
 }
 
+EpsilonNFA::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace automaton */
diff --git a/alib2data/src/automaton/FSM/EpsilonNFA.h b/alib2data/src/automaton/FSM/EpsilonNFA.h
index cb2fe65b5b..d60f89c74c 100644
--- a/alib2data/src/automaton/FSM/EpsilonNFA.h
+++ b/alib2data/src/automaton/FSM/EpsilonNFA.h
@@ -156,6 +156,8 @@ public:
 	virtual bool operator==(const EpsilonNFA& other) const;
 
 	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string() const;
 };
 
 } /* namespace automaton */
diff --git a/alib2data/src/automaton/FSM/ExtendedNFA.cpp b/alib2data/src/automaton/FSM/ExtendedNFA.cpp
index c21145a5d5..e376438117 100644
--- a/alib2data/src/automaton/FSM/ExtendedNFA.cpp
+++ b/alib2data/src/automaton/FSM/ExtendedNFA.cpp
@@ -11,6 +11,7 @@
 #include <ostream>
 #include <algorithm>
 #include "../../regexp/RegExpAlphabetGetter.h"
+#include <sstream>
 
 namespace automaton {
 
@@ -126,4 +127,10 @@ void ExtendedNFA::operator>>(std::ostream& out) const {
 		<< ")";
 }
 
+ExtendedNFA::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace automaton */
diff --git a/alib2data/src/automaton/FSM/ExtendedNFA.h b/alib2data/src/automaton/FSM/ExtendedNFA.h
index d0847d82e2..c95bb77aa3 100644
--- a/alib2data/src/automaton/FSM/ExtendedNFA.h
+++ b/alib2data/src/automaton/FSM/ExtendedNFA.h
@@ -74,6 +74,8 @@ public:
 	virtual bool operator==(const ExtendedNFA& other) const;
 
 	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string() const;
 };
 
 } /* namespace automaton */
diff --git a/alib2data/src/automaton/FSM/NFA.cpp b/alib2data/src/automaton/FSM/NFA.cpp
index dd1d8f5837..ff79e0b4d8 100644
--- a/alib2data/src/automaton/FSM/NFA.cpp
+++ b/alib2data/src/automaton/FSM/NFA.cpp
@@ -8,6 +8,7 @@
 #include "NFA.h"
 #include "../AutomatonException.h"
 #include <ostream>
+#include <sstream>
 
 namespace automaton {
 
@@ -138,4 +139,10 @@ void NFA::operator>>(std::ostream& out) const {
 		<< ")";
 }
 
+NFA::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace automaton */
diff --git a/alib2data/src/automaton/FSM/NFA.h b/alib2data/src/automaton/FSM/NFA.h
index e3efb77104..8bcfba5c5b 100644
--- a/alib2data/src/automaton/FSM/NFA.h
+++ b/alib2data/src/automaton/FSM/NFA.h
@@ -94,6 +94,8 @@ public:
 	virtual bool operator==(const NFA& other) const;
 
 	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string() const;
 };
 
 } /* namespace automaton */
diff --git a/alib2data/src/automaton/PDA/NPDA.cpp b/alib2data/src/automaton/PDA/NPDA.cpp
index 5c498c2b3b..6a4809e22a 100644
--- a/alib2data/src/automaton/PDA/NPDA.cpp
+++ b/alib2data/src/automaton/PDA/NPDA.cpp
@@ -9,6 +9,7 @@
 #include "../../std/map.hpp"
 #include "../AutomatonException.h"
 #include <algorithm>
+#include <sstream>
 
 namespace automaton {
 
@@ -152,4 +153,10 @@ void NPDA::operator>>(std::ostream& out) const {
 		<< ")";
 }
 
+NPDA::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace automaton */
diff --git a/alib2data/src/automaton/PDA/NPDA.h b/alib2data/src/automaton/PDA/NPDA.h
index 3cfb2372ba..dc4c65c5f1 100644
--- a/alib2data/src/automaton/PDA/NPDA.h
+++ b/alib2data/src/automaton/PDA/NPDA.h
@@ -81,6 +81,7 @@ public:
 
 	virtual void operator>>(std::ostream& os) const;
 
+	virtual operator std::string() const;
 };
 
 } /* namespace automaton */
diff --git a/alib2data/src/automaton/PDA/SinglePopNPDA.cpp b/alib2data/src/automaton/PDA/SinglePopNPDA.cpp
index f11d563453..cb7787a39a 100644
--- a/alib2data/src/automaton/PDA/SinglePopNPDA.cpp
+++ b/alib2data/src/automaton/PDA/SinglePopNPDA.cpp
@@ -9,6 +9,7 @@
 #include "../../std/map.hpp"
 #include "../AutomatonException.h"
 #include <algorithm>
+#include <sstream>
 
 namespace automaton {
 
@@ -148,4 +149,10 @@ void SinglePopNPDA::operator>>(std::ostream& out) const {
 		<< ")";
 }
 
+SinglePopNPDA::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace automaton */
diff --git a/alib2data/src/automaton/PDA/SinglePopNPDA.h b/alib2data/src/automaton/PDA/SinglePopNPDA.h
index 4544d6195e..12767c98da 100644
--- a/alib2data/src/automaton/PDA/SinglePopNPDA.h
+++ b/alib2data/src/automaton/PDA/SinglePopNPDA.h
@@ -81,6 +81,7 @@ public:
 
 	virtual void operator>>(std::ostream& os) const;
 
+	virtual operator std::string() const;
 };
 
 } /* namespace automaton */
diff --git a/alib2data/src/automaton/TM/OneTapeDTM.cpp b/alib2data/src/automaton/TM/OneTapeDTM.cpp
index 2e699ca519..27fb8467af 100644
--- a/alib2data/src/automaton/TM/OneTapeDTM.cpp
+++ b/alib2data/src/automaton/TM/OneTapeDTM.cpp
@@ -8,6 +8,7 @@
 #include "OneTapeDTM.h"
 #include "../../std/map.hpp"
 #include "../AutomatonException.h"
+#include <sstream>
 
 namespace automaton {
 
@@ -130,4 +131,10 @@ void OneTapeDTM::operator>>(std::ostream& out) const {
 			<< ")";
 }
 
+OneTapeDTM::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace automaton */
diff --git a/alib2data/src/automaton/TM/OneTapeDTM.h b/alib2data/src/automaton/TM/OneTapeDTM.h
index 805ad65488..0329719551 100644
--- a/alib2data/src/automaton/TM/OneTapeDTM.h
+++ b/alib2data/src/automaton/TM/OneTapeDTM.h
@@ -78,6 +78,8 @@ public:
 	virtual bool operator==(const OneTapeDTM& other) const;
 
 	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string() const;
 };
 
 } /* namespace automaton */
diff --git a/alib2data/src/automaton/UnknownAutomaton.cpp b/alib2data/src/automaton/UnknownAutomaton.cpp
index b66f57f5d0..19eed66137 100644
--- a/alib2data/src/automaton/UnknownAutomaton.cpp
+++ b/alib2data/src/automaton/UnknownAutomaton.cpp
@@ -7,6 +7,7 @@
 
 #include "UnknownAutomaton.h"
 #include "../std/set.hpp"
+#include <sstream>
 
 #include "AutomatonException.h"
 
@@ -210,5 +211,11 @@ void UnknownAutomaton::operator>>(std::ostream& out) const {
 		<< ")";
 }
 
+UnknownAutomaton::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace automaton */
 
diff --git a/alib2data/src/automaton/UnknownAutomaton.h b/alib2data/src/automaton/UnknownAutomaton.h
index 6b7f65fa31..f8bd8f1375 100644
--- a/alib2data/src/automaton/UnknownAutomaton.h
+++ b/alib2data/src/automaton/UnknownAutomaton.h
@@ -280,6 +280,8 @@ public:
 	virtual bool operator==(const AutomatonBase& other) const;
 
 	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string() const;
 };
 
 } /* namespace automaton */
diff --git a/alib2data/src/grammar/ContextFree/CFG.cpp b/alib2data/src/grammar/ContextFree/CFG.cpp
index 5a49d3dfeb..af0ee70557 100644
--- a/alib2data/src/grammar/ContextFree/CFG.cpp
+++ b/alib2data/src/grammar/ContextFree/CFG.cpp
@@ -94,4 +94,10 @@ void CFG::operator>>(std::ostream& out) const {
 			<< ")";
 }
 
+CFG::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/ContextFree/CFG.h b/alib2data/src/grammar/ContextFree/CFG.h
index 721fee7c46..ea6ef6f3d6 100644
--- a/alib2data/src/grammar/ContextFree/CFG.h
+++ b/alib2data/src/grammar/ContextFree/CFG.h
@@ -11,6 +11,7 @@
 #include "../GrammarBase.h"
 #include <map>
 #include <vector>
+#include <sstream>
 #include "../common/TerminalNonterminalAlphabetInitialSymbol.h"
 
 namespace grammar {
@@ -44,6 +45,8 @@ public:
 	virtual bool operator==(const CFG& other) const;
 
 	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string () const;
 };
 
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/ContextFree/CNF.cpp b/alib2data/src/grammar/ContextFree/CNF.cpp
index 711cc84d54..a5b7050dbc 100644
--- a/alib2data/src/grammar/ContextFree/CNF.cpp
+++ b/alib2data/src/grammar/ContextFree/CNF.cpp
@@ -137,4 +137,10 @@ void CNF::operator>>(std::ostream& out) const {
 			<< ")";
 }
 
+CNF::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/ContextFree/CNF.h b/alib2data/src/grammar/ContextFree/CNF.h
index 9f2317e31c..277c64a399 100644
--- a/alib2data/src/grammar/ContextFree/CNF.h
+++ b/alib2data/src/grammar/ContextFree/CNF.h
@@ -11,6 +11,7 @@
 #include "../GrammarBase.h"
 #include <map>
 #include <vector>
+#include <sstream>
 #include "../../std/variant.hpp"
 #include "../common/TerminalNonterminalAlphabetInitialSymbol.h"
 
@@ -53,6 +54,8 @@ public:
 	virtual bool operator==(const CNF& other) const;
 
 	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string () const;
 };
 
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.cpp b/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.cpp
index 9ed84f4ac1..b72ab20e60 100644
--- a/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.cpp
+++ b/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.cpp
@@ -110,4 +110,10 @@ void EpsilonFreeCFG::operator>>(std::ostream& out) const {
 			<< ")";
 }
 
+EpsilonFreeCFG::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.h b/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.h
index 149d0c65ed..871b0e027e 100644
--- a/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.h
+++ b/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.h
@@ -11,6 +11,7 @@
 #include "../GrammarBase.h"
 #include <map>
 #include <vector>
+#include <sstream>
 #include "../common/TerminalNonterminalAlphabetInitialSymbol.h"
 
 namespace grammar {
@@ -48,6 +49,8 @@ public:
 	virtual bool operator==(const EpsilonFreeCFG& other) const;
 
 	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string () const;
 };
 
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/ContextFree/GNF.cpp b/alib2data/src/grammar/ContextFree/GNF.cpp
index 4bf533992a..c86c40af01 100644
--- a/alib2data/src/grammar/ContextFree/GNF.cpp
+++ b/alib2data/src/grammar/ContextFree/GNF.cpp
@@ -105,4 +105,10 @@ void GNF::operator>>(std::ostream& out) const {
 			<< ")";
 }
 
+GNF::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/ContextFree/GNF.h b/alib2data/src/grammar/ContextFree/GNF.h
index b3341ec7be..d56dc66bf7 100644
--- a/alib2data/src/grammar/ContextFree/GNF.h
+++ b/alib2data/src/grammar/ContextFree/GNF.h
@@ -11,6 +11,7 @@
 #include "../GrammarBase.h"
 #include <map>
 #include <vector>
+#include <sstream>
 #include "../common/TerminalNonterminalAlphabetInitialSymbol.h"
 
 namespace grammar {
@@ -48,6 +49,8 @@ public:
 	virtual bool operator==(const GNF& other) const;
 
 	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string () const;
 };
 
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/ContextFree/LG.cpp b/alib2data/src/grammar/ContextFree/LG.cpp
index 61a5b80b67..ac1fd82d8f 100644
--- a/alib2data/src/grammar/ContextFree/LG.cpp
+++ b/alib2data/src/grammar/ContextFree/LG.cpp
@@ -165,4 +165,10 @@ void LG::operator>>(std::ostream& out) const {
 			<< ")";
 }
 
+LG::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/ContextFree/LG.h b/alib2data/src/grammar/ContextFree/LG.h
index 61fae87f03..c76c41dc9a 100644
--- a/alib2data/src/grammar/ContextFree/LG.h
+++ b/alib2data/src/grammar/ContextFree/LG.h
@@ -12,6 +12,7 @@
 #include <map>
 #include <tuple>
 #include <vector>
+#include <sstream>
 #include "../../std/variant.hpp"
 #include "../common/TerminalNonterminalAlphabetInitialSymbol.h"
 
@@ -52,6 +53,8 @@ public:
 	virtual bool operator==(const LG& other) const;
 
 	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string () const;
 };
 
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/ContextSensitive/CSG.cpp b/alib2data/src/grammar/ContextSensitive/CSG.cpp
index 7e0a12b5e0..a6be7481a8 100644
--- a/alib2data/src/grammar/ContextSensitive/CSG.cpp
+++ b/alib2data/src/grammar/ContextSensitive/CSG.cpp
@@ -9,6 +9,7 @@
 #include "../../std/map.hpp"
 #include "../GrammarException.h"
 #include <algorithm>
+#include <sstream>
 
 #include "../../alphabet/Symbol.h"
 
@@ -136,4 +137,10 @@ void CSG::operator>>(std::ostream& out) const {
 			<< ")";
 }
 
+CSG::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/ContextSensitive/CSG.h b/alib2data/src/grammar/ContextSensitive/CSG.h
index d1384c28ff..df441b07db 100644
--- a/alib2data/src/grammar/ContextSensitive/CSG.h
+++ b/alib2data/src/grammar/ContextSensitive/CSG.h
@@ -48,6 +48,8 @@ public:
 	virtual bool operator==(const CSG& other) const;
 
 	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string () const;
 };
 
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.cpp b/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.cpp
index 710964b9d7..14a365d635 100644
--- a/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.cpp
+++ b/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.cpp
@@ -9,6 +9,7 @@
 #include "../../std/map.hpp"
 #include "../GrammarException.h"
 #include <algorithm>
+#include <sstream>
 
 #include "../../alphabet/Symbol.h"
 
@@ -117,4 +118,10 @@ void NonContractingGrammar::operator>>(std::ostream& out) const {
 			<< ")";
 }
 
+NonContractingGrammar::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.h b/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.h
index 9565901647..b868f2d362 100644
--- a/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.h
+++ b/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.h
@@ -48,6 +48,8 @@ public:
 	virtual bool operator==(const NonContractingGrammar& other) const;
 
 	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string () const;
 };
 
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/GrammarBase.h b/alib2data/src/grammar/GrammarBase.h
index 4953e8b004..a28b9d1ac2 100644
--- a/alib2data/src/grammar/GrammarBase.h
+++ b/alib2data/src/grammar/GrammarBase.h
@@ -58,15 +58,15 @@ public:
 	virtual bool operator==(const EpsilonFreeCFG& other) const;
 
 	virtual bool operator==(const CNF& other) const;
-	
+
 	virtual bool operator==(const GNF& other) const;
-	
+
 	virtual bool operator==(const CSG& other) const;
-	
+
 	virtual bool operator==(const NonContractingGrammar& other) const;
-	
+
 	virtual bool operator==(const UnrestrictedGrammar& other) const;
-	
+
 	virtual bool operator==(const ContextPreservingUnrestrictedGrammar& other) const;
 
 	virtual bool operator==(const GrammarBase& other) const = 0;
@@ -74,6 +74,8 @@ public:
 	friend std::ostream& operator<<(std::ostream& os, const GrammarBase& grammar);
 
 	virtual void operator>>(std::ostream&) const = 0;
+
+	virtual operator std::string () const = 0;
 };
 
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/Regular/LeftLG.cpp b/alib2data/src/grammar/Regular/LeftLG.cpp
index f3ca254390..91ba66a931 100644
--- a/alib2data/src/grammar/Regular/LeftLG.cpp
+++ b/alib2data/src/grammar/Regular/LeftLG.cpp
@@ -9,6 +9,7 @@
 #include "../../std/map.hpp"
 #include "../GrammarException.h"
 #include <algorithm>
+#include <sstream>
 
 #include "../../alphabet/Symbol.h"
 
@@ -153,4 +154,10 @@ void LeftLG::operator>>(std::ostream& out) const {
 			<< ")";
 }
 
+LeftLG::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/Regular/LeftLG.h b/alib2data/src/grammar/Regular/LeftLG.h
index b251bb09c2..1561c938d5 100644
--- a/alib2data/src/grammar/Regular/LeftLG.h
+++ b/alib2data/src/grammar/Regular/LeftLG.h
@@ -51,6 +51,8 @@ public:
 	virtual bool operator==(const LeftLG& other) const;
 
 	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string () const;
 };
 
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/Regular/LeftRG.cpp b/alib2data/src/grammar/Regular/LeftRG.cpp
index 3f652862b5..6db45d239d 100644
--- a/alib2data/src/grammar/Regular/LeftRG.cpp
+++ b/alib2data/src/grammar/Regular/LeftRG.cpp
@@ -9,6 +9,7 @@
 #include "../../std/map.hpp"
 #include "../GrammarException.h"
 #include <algorithm>
+#include <sstream>
 
 #include "../../alphabet/Symbol.h"
 
@@ -133,4 +134,10 @@ void LeftRG::operator>>(std::ostream& out) const {
 			<< ")";
 }
 
+LeftRG::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/Regular/LeftRG.h b/alib2data/src/grammar/Regular/LeftRG.h
index 442061f6e3..734c583b86 100644
--- a/alib2data/src/grammar/Regular/LeftRG.h
+++ b/alib2data/src/grammar/Regular/LeftRG.h
@@ -68,6 +68,8 @@ public:
 	virtual bool operator==(const LeftRG& other) const;
 
 	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string () const;
 };
 
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/Regular/RightLG.cpp b/alib2data/src/grammar/Regular/RightLG.cpp
index 1ba4a09b65..58c386295d 100644
--- a/alib2data/src/grammar/Regular/RightLG.cpp
+++ b/alib2data/src/grammar/Regular/RightLG.cpp
@@ -9,6 +9,7 @@
 #include "../../std/map.hpp"
 #include "../GrammarException.h"
 #include <algorithm>
+#include <sstream>
 
 #include "../../alphabet/Symbol.h"
 
@@ -153,4 +154,10 @@ void RightLG::operator>>(std::ostream& out) const {
 			<< ")";
 }
 
+RightLG::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/Regular/RightLG.h b/alib2data/src/grammar/Regular/RightLG.h
index 3446bf5774..c807a57bcd 100644
--- a/alib2data/src/grammar/Regular/RightLG.h
+++ b/alib2data/src/grammar/Regular/RightLG.h
@@ -51,6 +51,8 @@ public:
 	virtual bool operator==(const RightLG& other) const;
 
 	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string () const;
 };
 
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/Regular/RightRG.cpp b/alib2data/src/grammar/Regular/RightRG.cpp
index f5977479e9..344c6a1446 100644
--- a/alib2data/src/grammar/Regular/RightRG.cpp
+++ b/alib2data/src/grammar/Regular/RightRG.cpp
@@ -9,6 +9,7 @@
 #include "../../std/map.hpp"
 #include "../GrammarException.h"
 #include <algorithm>
+#include <sstream>
 
 #include "../../alphabet/Symbol.h"
 
@@ -133,4 +134,10 @@ void RightRG::operator>>(std::ostream& out) const {
 			<< ")";
 }
 
+RightRG::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/Regular/RightRG.h b/alib2data/src/grammar/Regular/RightRG.h
index e70dce3805..f9d3c5e3e5 100644
--- a/alib2data/src/grammar/Regular/RightRG.h
+++ b/alib2data/src/grammar/Regular/RightRG.h
@@ -68,6 +68,8 @@ public:
 	virtual bool operator==(const RightRG& other) const;
 
 	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string () const;
 };
 
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/UnknownGrammar.cpp b/alib2data/src/grammar/UnknownGrammar.cpp
index fd05065400..869cde6aa7 100644
--- a/alib2data/src/grammar/UnknownGrammar.cpp
+++ b/alib2data/src/grammar/UnknownGrammar.cpp
@@ -8,6 +8,7 @@
 #include "UnknownGrammar.h"
 #include "GrammarException.h"
 #include "../std/set.hpp"
+#include <sstream>
 
 namespace grammar {
 
@@ -106,4 +107,10 @@ void UnknownGrammar::operator>>(std::ostream& out) const {
 		<< ")";
 }
 
+UnknownGrammar::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/UnknownGrammar.h b/alib2data/src/grammar/UnknownGrammar.h
index 72fa0ff513..0bf2d89510 100644
--- a/alib2data/src/grammar/UnknownGrammar.h
+++ b/alib2data/src/grammar/UnknownGrammar.h
@@ -65,6 +65,7 @@ public:
 
 	virtual void operator>>(std::ostream& out) const;
 
+	virtual operator std::string () const;
 };
 
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.cpp b/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.cpp
index 6938804fc1..2069a60578 100644
--- a/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.cpp
+++ b/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.cpp
@@ -9,6 +9,7 @@
 #include "../../std/map.hpp"
 #include "../GrammarException.h"
 #include <algorithm>
+#include <sstream>
 
 #include "../../alphabet/Symbol.h"
 
@@ -121,4 +122,10 @@ void ContextPreservingUnrestrictedGrammar::operator>>(std::ostream& out) const {
 			<< ")";
 }
 
+ContextPreservingUnrestrictedGrammar::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.h b/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.h
index 81784fb841..180bdf5ee0 100644
--- a/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.h
+++ b/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.h
@@ -44,6 +44,8 @@ public:
 	virtual bool operator==(const ContextPreservingUnrestrictedGrammar& other) const;
 
 	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string () const;
 };
 
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.cpp b/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.cpp
index a03aabbfbb..f6ca0fb904 100644
--- a/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.cpp
+++ b/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.cpp
@@ -9,6 +9,7 @@
 #include "../../std/map.hpp"
 #include "../GrammarException.h"
 #include <algorithm>
+#include <sstream>
 
 #include "../../alphabet/Symbol.h"
 
@@ -102,4 +103,10 @@ void UnrestrictedGrammar::operator>>(std::ostream& out) const {
 			<< ")";
 }
 
+UnrestrictedGrammar::operator std::string () const {
+	std::stringstream ss;
+	ss << *this;
+	return ss.str();
+}
+
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.h b/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.h
index d161652a27..1f37ac9a5c 100644
--- a/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.h
+++ b/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.h
@@ -45,6 +45,8 @@ public:
 	virtual bool operator==(const UnrestrictedGrammar& other) const;
 
 	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string () const;
 };
 
 } /* namespace grammar */
diff --git a/alib2data/src/regexp/RegExpBase.cpp b/alib2data/src/regexp/RegExpBase.cpp
index 82cd52b2d7..5d6ee1d24d 100644
--- a/alib2data/src/regexp/RegExpBase.cpp
+++ b/alib2data/src/regexp/RegExpBase.cpp
@@ -13,6 +13,14 @@ RegExpBase::~RegExpBase() {
 
 }
 
+bool RegExpBase::operator>=(const RegExpBase& other) const {
+	return !(*this < other);
+}
+
+bool RegExpBase::operator<=(const RegExpBase& other) const {
+	return !(*this > other);
+}
+
 bool RegExpBase::operator!=(const RegExpBase& other) const {
 	return !(*this == other);
 }
diff --git a/alib2data/src/regexp/RegExpBase.h b/alib2data/src/regexp/RegExpBase.h
index a18f1f59be..cf96030187 100644
--- a/alib2data/src/regexp/RegExpBase.h
+++ b/alib2data/src/regexp/RegExpBase.h
@@ -27,20 +27,26 @@ public:
 
 	virtual ~RegExpBase() noexcept;
 
-	virtual bool operator <(const RegExpBase& other) const = 0;
-	virtual bool operator ==(const RegExpBase& other) const = 0;
-	virtual bool operator >(const RegExpBase& other) const = 0;
+	bool operator>=(const RegExpBase& other) const;
+
+	bool operator<=(const RegExpBase& other) const;
+
 	bool operator !=(const RegExpBase& other) const;
 
+	virtual bool operator==(const RegExpBase& other) const = 0;
 	virtual bool operator==(const FormalRegExp& other) const = 0;
 	virtual bool operator==(const UnboundedRegExp& other) const = 0;
 
+	virtual bool operator<(const RegExpBase& other) const = 0;
 	virtual bool operator<(const FormalRegExp& other) const = 0;
 	virtual bool operator<(const UnboundedRegExp& other) const = 0;
+	virtual bool operator>(const RegExpBase& other) const = 0;
 
 	friend std::ostream& operator<<(std::ostream& os, const RegExpBase& regexp);
 
 	virtual void operator>>(std::ostream&) const = 0;
+
+	virtual operator std::string () const = 0;
 };
 
 } /* namespace regexp */
diff --git a/alib2data/src/regexp/formal/FormalRegExp.cpp b/alib2data/src/regexp/formal/FormalRegExp.cpp
index e1a6319427..14c2340f57 100644
--- a/alib2data/src/regexp/formal/FormalRegExp.cpp
+++ b/alib2data/src/regexp/formal/FormalRegExp.cpp
@@ -127,7 +127,7 @@ void FormalRegExp::setAlphabet(const std::set<alphabet::Symbol> & symbols) {
 bool FormalRegExp::removeSymbolFromAlphabet(const alphabet::Symbol & symbol) {
 	if(this->regExp->testSymbol(symbol))
 		throw exception::AlibException("Input symbol \"" + (std::string) symbol + "\" is used.");
-	
+
 	return alphabet.erase(symbol);
 }
 
@@ -180,7 +180,7 @@ bool FormalRegExp::operator >(const RegExpBase& other) const {
 FormalRegExp::operator std::string () const {
 	std::stringstream ss;
 	ss << *this;
-	return ss.str(); 
+	return ss.str();
 }
 
 } /* namespace regexp */
diff --git a/alib2data/src/regexp/formal/FormalRegExp.h b/alib2data/src/regexp/formal/FormalRegExp.h
index 2a2f7082b4..0b2be3ade7 100644
--- a/alib2data/src/regexp/formal/FormalRegExp.h
+++ b/alib2data/src/regexp/formal/FormalRegExp.h
@@ -27,14 +27,14 @@ class FormalRegExpElement;
 class FormalRegExp : public std::element<FormalRegExp, RegExpBase> {
 protected:
 	FormalRegExpElement* regExp;
-	
+
 	std::set<alphabet::Symbol> alphabet;
 
 	/**
 	 * @copydoc FormalRegExpElement::clone() const
 	 */
 	virtual RegExpBase* clone() const;
-	
+
 	/**
 	 * @copydoc FormalRegExpElement::plunder() const
 	 */
@@ -61,7 +61,7 @@ public:
 	 * @return Root node of the regular expression tree
 	 */
 	const FormalRegExpElement& getRegExp() const;
-	
+
 	/**
 	 * @return Root node of the regular expression tree
 	 */
@@ -73,19 +73,19 @@ public:
 	 * @param regExp root node to set
 	 */
 	void setRegExp(const FormalRegExpElement& regExp);
-	
+
 	/**
 	 * Sets the root node of the regular expression tree
 	 * @param regExp root node to set
 	 */
 	void setRegExp(FormalRegExpElement&& regExp);
-	
+
 	/**
 	 * Gets alphabet symbols used in RegExp.
 	 * @return set of alphabet symbols used in regexp.
 	 */
 	const std::set<alphabet::Symbol>& getAlphabet() const;
-	
+
 	/**
 	 * Adds symbol to the alphabet available in the regular expression
 	 * @param symbol new symbol added to the alphabet
@@ -97,13 +97,13 @@ public:
 	 * @param symbols new alphabet
 	 */
 	void setAlphabet(const std::set<alphabet::Symbol>& symbols);
-	
+
 	/**
 	 * Removes symbol from the alphabet of symbol available in the regular expression
 	 * @param symbol removed symbol from the alphabet
 	 */
 	bool removeSymbolFromAlphabet(const alphabet::Symbol & symbol);
-	
+
 	/**
 	 * @return true if regexp represents empty language
 	 */
@@ -132,7 +132,6 @@ public:
 	virtual bool operator<(const UnboundedRegExp&) const;
 
 	virtual operator std::string() const;
-
 };
 
 } /* namespace regexp */
-- 
GitLab