From f4861fbab56a3297fe8c40f56060bce8a92c06ee Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Thu, 17 Nov 2016 19:02:24 +0100
Subject: [PATCH] new approach to specify constant symbols

---
 .../exact/ExactPatternMatchingAutomaton.cpp   |  4 +-
 .../exact/ExactSubtreeMatchingAutomaton.cpp   |  4 +-
 .../src/automaton/transform/PDAToRHPDA.cpp    |  8 ++--
 .../src/automaton/transform/RHPDAToPDA.cpp    |  4 +-
 .../grammar/convert/ToAutomatonBottomUp.cpp   |  4 +-
 .../ToPostfixPushdownAutomatonGlushkov.cpp    |  8 ++--
 .../src/tree/generate/RandomTreeFactory.cpp   | 10 ++---
 .../grammar/convert/GrammarCFGtoPDATest.cpp   |  2 +-
 alib2data/src/alphabet/BarSymbol.cpp          |  5 +--
 alib2data/src/alphabet/BarSymbol.h            | 32 +++++++++++++-
 alib2data/src/alphabet/BlankSymbol.cpp        |  5 +--
 alib2data/src/alphabet/BlankSymbol.h          | 32 +++++++++++++-
 .../src/alphabet/BottomOfTheStackSymbol.cpp   |  6 +--
 .../src/alphabet/BottomOfTheStackSymbol.h     | 32 +++++++++++++-
 alib2data/src/alphabet/EndSymbol.cpp          |  5 +--
 alib2data/src/alphabet/EndSymbol.h            | 32 +++++++++++++-
 alib2data/src/alphabet/RankedSymbol.h         |  4 ++
 alib2data/src/alphabet/StartSymbol.cpp        |  5 +--
 alib2data/src/alphabet/StartSymbol.h          | 32 +++++++++++++-
 .../src/alphabet/SubtreeWildcardSymbol.cpp    |  6 +--
 .../src/alphabet/SubtreeWildcardSymbol.h      | 44 +++++++++++++++++--
 alib2data/src/alphabet/VariablesBarSymbol.cpp |  6 +--
 alib2data/src/alphabet/VariablesBarSymbol.h   | 44 +++++++++++++++++--
 .../ranked/PrefixRankedBarNonlinearPattern.h  | 10 ++---
 .../src/tree/ranked/PrefixRankedBarPattern.h  |  4 +-
 .../src/tree/ranked/PrefixRankedBarTree.h     |  2 +-
 .../ranked/PrefixRankedNonlinearPattern.h     |  4 +-
 .../src/tree/ranked/PrefixRankedPattern.h     |  2 +-
 alib2data/src/tree/unranked/PrefixBarTree.h   |  2 +-
 alib2data/test-src/alphabet/SymbolTest.cpp    | 20 +++++++++
 alib2data/test-src/alphabet/SymbolTest.h      |  2 +
 .../test-src/automaton/AutomatonTest.cpp      |  4 +-
 alib2data/test-src/tree/PatternTest.cpp       |  2 +-
 alib2str/src/tree/TreeFromStringParser.cpp    | 28 +++++-------
 34 files changed, 313 insertions(+), 101 deletions(-)

diff --git a/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp b/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp
index 7b634dab3e..36cd8e05a3 100644
--- a/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp
+++ b/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp
@@ -123,7 +123,7 @@ automaton::InputDrivenNPDA < > ExactPatternMatchingAutomaton::construct ( const
 auto ExactPatternMatchingAutomatonPrefixRankedBarTree = ExactPatternMatchingAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA < >, tree::PrefixRankedBarTree < > > ( ExactPatternMatchingAutomaton::construct );
 
 automaton::VisiblyPushdownNPDA < > ExactPatternMatchingAutomaton::construct ( const tree::PrefixRankedBarPattern < > & pattern ) {
-	automaton::VisiblyPushdownNPDA < > res ( alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } );
+	automaton::VisiblyPushdownNPDA < > res ( alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) );
 
 	res.addState ( label::labelFrom ( 0 ) );
 	res.addInitialState ( label::labelFrom ( 0 ) );
@@ -137,7 +137,7 @@ automaton::VisiblyPushdownNPDA < > ExactPatternMatchingAutomaton::construct ( co
 			res.addCallInputSymbol ( alphabet::Symbol ( alphabet::RankedSymbol < > { symbol } ) );
 	}
 
-	res.setPushdownStoreAlphabet ( { alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK }, alphabet::symbolFrom ( 'T' ), alphabet::symbolFrom ( 'R' ) } );
+	res.setPushdownStoreAlphabet ( { alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) , alphabet::symbolFrom ( 'T' ), alphabet::symbolFrom ( 'R' ) } );
 
 	for ( const std::ranked_symbol < > & symbol : pattern.getAlphabet ( ) ) {
 		if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol == pattern.getVariablesBar ( ) ) ) continue;
diff --git a/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp b/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp
index 18d04e7fae..2f3e997d99 100644
--- a/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp
+++ b/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp
@@ -52,9 +52,9 @@ automaton::InputDrivenNPDA < > ExactSubtreeMatchingAutomaton::construct ( const
 auto ExactSubtreeMatchingAutomatonPrefixRankedTree = ExactSubtreeMatchingAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA < >, tree::PrefixRankedTree < > > ( ExactSubtreeMatchingAutomaton::construct );
 
 automaton::InputDrivenNPDA < > ExactSubtreeMatchingAutomaton::construct ( const tree::PrefixRankedBarTree < > & pattern ) {
-	automaton::InputDrivenNPDA < > res ( label::labelFrom ( 0 ), alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } );
+	automaton::InputDrivenNPDA < > res ( label::labelFrom ( 0 ), alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) );
 
-	res.setPushdownStoreAlphabet ( { alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK }, alphabet::symbolFrom ( 'S' ) } );
+	res.setPushdownStoreAlphabet ( { alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ), alphabet::symbolFrom ( 'S' ) } );
 
 	for ( const std::ranked_symbol < > & symbol : pattern.getAlphabet ( ) ) {
 		res.addInputSymbol ( alphabet::Symbol ( alphabet::RankedSymbol < > { symbol } ) );
diff --git a/alib2algo/src/automaton/transform/PDAToRHPDA.cpp b/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
index 008e876c99..3ac0e4571c 100644
--- a/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
+++ b/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
@@ -38,7 +38,7 @@ auto PDAToRHPDARealTimeHeightDeterministicNPDA = PDAToRHPDA::RegistratorWrapper
 automaton::RealTimeHeightDeterministicDPDA < > PDAToRHPDA::convert ( const automaton::DPDA < > & pda ) {
 	label::Label q0 = common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, pda.getStates ( ) );
 
-	RealTimeHeightDeterministicDPDA < > res ( q0, alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } );
+	RealTimeHeightDeterministicDPDA < > res ( q0, alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) );
 
 	res.setInputAlphabet ( pda.getInputAlphabet ( ) );
 
@@ -47,7 +47,7 @@ automaton::RealTimeHeightDeterministicDPDA < > PDAToRHPDA::convert ( const autom
 
 	res.setFinalStates ( pda.getFinalStates ( ) );
 	std::set < alphabet::Symbol > pushdownStoreAlphabet = pda.getPushdownStoreAlphabet ( );
-	pushdownStoreAlphabet.insert ( alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } );
+	pushdownStoreAlphabet.insert ( alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) );
 	res.setPushdownStoreAlphabet ( pushdownStoreAlphabet );
 
 	res.addCallTransition ( q0, pda.getInitialState ( ), pda.getInitialSymbol ( ) );
@@ -112,13 +112,13 @@ automaton::RealTimeHeightDeterministicDPDA < > PDAToRHPDA::convert ( const autom
 auto PDAToRHPDADPDA = PDAToRHPDA::RegistratorWrapper < automaton::RealTimeHeightDeterministicDPDA < >, automaton::DPDA < > > ( PDAToRHPDA::convert );
 
 automaton::RealTimeHeightDeterministicNPDA < > PDAToRHPDA::convert ( const automaton::NPDA < > & pda ) {
-	RealTimeHeightDeterministicNPDA < > res ( alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } );
+	RealTimeHeightDeterministicNPDA < > res ( alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) );
 
 	res.setInputAlphabet ( pda.getInputAlphabet ( ) );
 	res.setStates ( pda.getStates ( ) );
 	res.setFinalStates ( pda.getFinalStates ( ) );
 	std::set < alphabet::Symbol > pushdownStoreAlphabet = pda.getPushdownStoreAlphabet ( );
-	pushdownStoreAlphabet.insert ( alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } );
+	pushdownStoreAlphabet.insert ( alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) );
 	res.setPushdownStoreAlphabet ( pushdownStoreAlphabet );
 
 	label::Label q0 = common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, res.getStates ( ) );
diff --git a/alib2algo/src/automaton/transform/RHPDAToPDA.cpp b/alib2algo/src/automaton/transform/RHPDAToPDA.cpp
index 7906b2088c..aaa663cf71 100644
--- a/alib2algo/src/automaton/transform/RHPDAToPDA.cpp
+++ b/alib2algo/src/automaton/transform/RHPDAToPDA.cpp
@@ -82,7 +82,7 @@ automaton::DPDA < > RHPDAToPDA::convert ( const automaton::RealTimeHeightDetermi
 	}
 
 	for ( const auto & transition : pda.getReturnTransitions ( ) ) {
-		if ( std::get < 2 > ( transition.first ).getData ( ) == alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK ) continue;
+		if ( std::get < 2 > ( transition.first ) == alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) ) continue;
 
 		if ( std::get < 1 > ( transition.first ).is < string::Epsilon < > > ( ) ) {
 			auto & epsT = epsilonTransitions[std::get < 0 > ( transition.first )];
@@ -193,7 +193,7 @@ automaton::NPDA < > RHPDAToPDA::convert ( const automaton::RealTimeHeightDetermi
 	}
 
 	for ( const auto & transition : pda.getReturnTransitions ( ) ) {
-		if ( std::get < 2 > ( transition.first ).getData ( ) == alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK ) continue;
+		if ( std::get < 2 > ( transition.first ) == alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) ) continue;
 
 		if ( std::get < 1 > ( transition.first ).is < string::Epsilon < > > ( ) ) {
 			auto & epsT = epsilonTransitions[std::get < 0 > ( transition.first )];
diff --git a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp
index fab2d6e156..6bd1e388d9 100644
--- a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp
+++ b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp
@@ -24,7 +24,7 @@ automaton::NPDA < > ToAutomatonBottomUp::convert(const T& grammar) {
 	label::Label q = label::InitialStateLabel::INITIAL_STATE_LABEL;
 	label::Label r = label::FinalStateLabel::FINAL_STATE_LABEL;
 
-	automaton::NPDA < > automaton(q, alphabet::Symbol(alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK));
+	automaton::NPDA < > automaton(q, alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) );
 	automaton.addState(r);
 	automaton.addFinalState(r);
 
@@ -43,7 +43,7 @@ automaton::NPDA < > ToAutomatonBottomUp::convert(const T& grammar) {
 		for(const std::vector<alphabet::Symbol>& rhs : kv.second)
 			automaton.addTransition(automaton.getInitialState(), rhs, automaton.getInitialState(), std::vector<alphabet::Symbol>{kv.first});
 
-	automaton.addTransition(automaton.getInitialState(), std::vector<alphabet::Symbol>{alphabet::Symbol(alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK), grammar.getInitialSymbol()}, r, std::vector<alphabet::Symbol>{});
+	automaton.addTransition(automaton.getInitialState(), std::vector<alphabet::Symbol>{ alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ), grammar.getInitialSymbol()}, r, std::vector<alphabet::Symbol>{});
 
 	return automaton;
 }
diff --git a/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkov.cpp b/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkov.cpp
index a82cd27825..984a7cd0f3 100644
--- a/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkov.cpp
+++ b/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkov.cpp
@@ -69,7 +69,7 @@ automaton::NPDA < > ToPostfixPushdownAutomatonGlushkov::convert ( const rte::For
 	 // step 3; create PDA (w/o transitions yet) and initialize input alphabet = (non-indexed) RTE alphabet and END symbol
 	label::Label q = label::labelFrom ( 'q' );
 	label::Label f = label::labelFrom ( 'f' );
-	automaton::NPDA < > automaton ( q, alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } );
+	automaton::NPDA < > automaton ( q, alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) );
 
 	automaton.addState ( f );
 	automaton.addFinalState ( f );
@@ -77,7 +77,7 @@ automaton::NPDA < > ToPostfixPushdownAutomatonGlushkov::convert ( const rte::For
 	for ( const std::ranked_symbol < > & symbol : rte.getAlphabet ( ) )
 		automaton.addInputSymbol ( symbol.getSymbol ( ) );
 
-	automaton.addInputSymbol ( alphabet::Symbol { alphabet::EndSymbol::END } );
+	automaton.addInputSymbol ( alphabet::EndSymbol::instance < alphabet::Symbol > ( ) );
 
 	 // step 4; create pushdown store alphabet; it consists of elements of indexed RTE alphabet and BotS symbol
 	for ( const std::ranked_symbol < > & symb : indexedRTE.getAlphabet ( ) )
@@ -132,8 +132,8 @@ automaton::NPDA < > ToPostfixPushdownAutomatonGlushkov::convert ( const rte::For
 	for ( const std::ranked_symbol < > & symb : firstSet ) {
 		std::vector < alphabet::Symbol > pop;
 		pop.push_back ( alphabet::Symbol ( alphabet::RankedSymbol < > ( symb ) ) );
-		pop.push_back ( alphabet::Symbol ( alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK ) );
-		automaton.addTransition ( q, alphabet::Symbol { alphabet::EndSymbol::END }, pop, f, { } );
+		pop.push_back ( alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) );
+		automaton.addTransition ( q, alphabet::EndSymbol::instance < alphabet::Symbol > ( ), pop, f, { } );
 	}
 
 	return automaton;
diff --git a/alib2algo/src/tree/generate/RandomTreeFactory.cpp b/alib2algo/src/tree/generate/RandomTreeFactory.cpp
index b227061de2..26f1a4c1f0 100644
--- a/alib2algo/src/tree/generate/RandomTreeFactory.cpp
+++ b/alib2algo/src/tree/generate/RandomTreeFactory.cpp
@@ -120,7 +120,7 @@ struct Node {
 
 	std::tree < alphabet::Symbol > createUnrankedPatternNode ( ) {
 		if ( rank == 0 ) {
-			return std::tree < alphabet::Symbol > ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), { } );
+			return std::tree < alphabet::Symbol > ( alphabet::SubtreeWildcardSymbol::instance < alphabet::Symbol > ( ), { } );
 		} else {
 			std::vector < std::tree < alphabet::Symbol > > children;
 			Node * nextChild = child;
@@ -148,7 +148,7 @@ struct Node {
 
 	std::tree < std::ranked_symbol < > > createRankedPatternNode ( ) {
 		if ( rank == 0 ) {
-			return std::tree < std::ranked_symbol < > > ( std::ranked_symbol < > ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ), { } );
+			return std::tree < std::ranked_symbol < > > ( std::ranked_symbol < > ( alphabet::SubtreeWildcardSymbol::instance < alphabet::Symbol > ( ), 0 ), { } );
 		} else {
 			std::vector < std::tree < std::ranked_symbol < > > > children;
 			Node * nextChild = child;
@@ -310,7 +310,7 @@ UnrankedPattern < > RandomTreeFactory::generateUnrankedPattern ( int depth, int
 	for ( std::vector < char >::const_iterator it = alphabet.begin ( ); it != alphabet.end ( ); ++it )
 		treeAlphabet.insert ( alphabet::symbolFrom ( * it ) );
 
-	alphabet::Symbol subtreeWildcard ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD );
+	alphabet::Symbol subtreeWildcard = alphabet::SubtreeWildcardSymbol::instance < alphabet::Symbol > ( );
 	treeAlphabet.insert ( subtreeWildcard );
 	UnrankedPattern < > tree ( std::move ( subtreeWildcard ), treeAlphabet, root->createUnrankedPatternNode ( ) );
 	delete root;
@@ -350,7 +350,7 @@ RankedPattern < > RandomTreeFactory::generateRankedPattern ( int depth, int node
 		for ( char i : it.second )
 			treeRankedAlphabet.insert ( std::ranked_symbol < > ( i, it.first ) );
 
-	std::ranked_symbol < > subtreeWildcard ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 );
+	std::ranked_symbol < > subtreeWildcard = alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < > > ( );
 	treeRankedAlphabet.insert ( subtreeWildcard );
 	RankedPattern < > tree ( std::move ( subtreeWildcard ), treeRankedAlphabet, root->createRankedPatternNode ( ) );
 	delete root;
@@ -378,7 +378,7 @@ RankedNonlinearPattern < > RandomTreeFactory::generateRankedNonlinearPattern ( i
 		for ( char i : rankedAlphabet [ 0 ] )
 			nonlinearVariables.insert ( std::ranked_symbol < > ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol < > ( i ) ), 0 ) );
 
-	std::ranked_symbol < > subtreeWildcard ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 );
+	std::ranked_symbol < > subtreeWildcard = alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < > > ( );
 	treeRankedAlphabet.insert ( subtreeWildcard );
 	treeRankedAlphabet.insert ( nonlinearVariables.begin ( ), nonlinearVariables.end ( ) );
 	RankedNonlinearPattern < > tree ( std::move ( subtreeWildcard ), nonlinearVariables, treeRankedAlphabet, root->createRankedNonlinearPatternNode ( singleNonlinearVariable ) );
diff --git a/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp b/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp
index 14086a6310..b755827c35 100644
--- a/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp
+++ b/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp
@@ -91,7 +91,7 @@ void GrammarCFGtoPDATest::testBottomUp()
 
 		label::Label q = label::InitialStateLabel::INITIAL_STATE_LABEL;
 		label::Label r = label::FinalStateLabel::FINAL_STATE_LABEL;
-		alphabet::Symbol bots(alphabet::Symbol{alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK});
+		alphabet::Symbol bots( alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) );
 
 		automaton::NPDA < > pda(q, bots);
 		pda.addState(r);
diff --git a/alib2data/src/alphabet/BarSymbol.cpp b/alib2data/src/alphabet/BarSymbol.cpp
index f9d267a094..d18bfb07b5 100644
--- a/alib2data/src/alphabet/BarSymbol.cpp
+++ b/alib2data/src/alphabet/BarSymbol.cpp
@@ -35,12 +35,9 @@ void BarSymbol::operator>>(std::ostream& out) const {
 }
 
 BarSymbol::operator std::string () const {
-	return "|";
+	return BarSymbol::instance < std::string > ( );
 }
 
-BarSymbol BarSymbol::BAR = BarSymbol ( );
-Symbol BarSymbol::BAR_SYMBOL = Symbol ( BarSymbol ( ) );
-
 BarSymbol BarSymbol::parse(std::deque<sax::Token>::iterator& input) {
 	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, BarSymbol::getXmlTagName());
 	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, BarSymbol::getXmlTagName());
diff --git a/alib2data/src/alphabet/BarSymbol.h b/alib2data/src/alphabet/BarSymbol.h
index f01113bc6e..5b2b5a5021 100644
--- a/alib2data/src/alphabet/BarSymbol.h
+++ b/alib2data/src/alphabet/BarSymbol.h
@@ -10,6 +10,7 @@
 
 #include "SymbolBase.h"
 #include "Symbol.h"
+#include <object/Object.h>
 
 namespace alphabet {
 
@@ -39,8 +40,10 @@ public:
 
 	virtual explicit operator std::string ( ) const;
 
-	static BarSymbol BAR;
-	static Symbol BAR_SYMBOL;
+	template < typename Base >
+	static inline typename std::enable_if <   std::is_integral < Base >::value, Base >::type instance ( );
+	template < typename Base >
+	static inline typename std::enable_if < ! std::is_integral < Base >::value, Base >::type instance ( );
 
 	static const std::string & getXmlTagName() {
 		static std::string xmlTagName = "BarSymbol";
@@ -55,6 +58,31 @@ public:
 	virtual SymbolBase * inc ( ) &&;
 };
 
+template < typename Base >
+inline typename std::enable_if < std::is_integral < Base >::value, Base >::type BarSymbol::instance ( ) {
+	return '|';
+}
+
+template < >
+inline std::string BarSymbol::instance < std::string > ( ) {
+	return std::string ( 1, BarSymbol::instance < char > ( ) );
+}
+
+template < >
+inline BarSymbol BarSymbol::instance < BarSymbol > ( ) {
+	return BarSymbol ( );
+}
+
+template < >
+inline Symbol BarSymbol::instance < Symbol > ( ) {
+	return Symbol ( BarSymbol ( ) );
+}
+
+template < >
+inline alib::Object BarSymbol::instance < alib::Object > ( ) {
+	return alib::Object ( BarSymbol ( ) );
+}
+
 } /* namespace alphabet */
 
 #endif /* BAR_SYMBOL_H_ */
diff --git a/alib2data/src/alphabet/BlankSymbol.cpp b/alib2data/src/alphabet/BlankSymbol.cpp
index e250d84a12..2551a6b65e 100644
--- a/alib2data/src/alphabet/BlankSymbol.cpp
+++ b/alib2data/src/alphabet/BlankSymbol.cpp
@@ -35,12 +35,9 @@ void BlankSymbol::operator>>(std::ostream& out) const {
 }
 
 BlankSymbol::operator std::string () const {
-	return "B";
+	return BlankSymbol::instance < std::string > ( );
 }
 
-BlankSymbol BlankSymbol::BLANK = BlankSymbol ( );
-Symbol BlankSymbol::BLANK_SYMBOL = Symbol ( BlankSymbol ( ) );
-
 BlankSymbol BlankSymbol::parse(std::deque<sax::Token>::iterator& input) {
 	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, BlankSymbol::getXmlTagName());
 	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, BlankSymbol::getXmlTagName());
diff --git a/alib2data/src/alphabet/BlankSymbol.h b/alib2data/src/alphabet/BlankSymbol.h
index d3e9540b47..0d45eca1e8 100644
--- a/alib2data/src/alphabet/BlankSymbol.h
+++ b/alib2data/src/alphabet/BlankSymbol.h
@@ -10,6 +10,7 @@
 
 #include "SymbolBase.h"
 #include "Symbol.h"
+#include <object/Object.h>
 
 namespace alphabet {
 
@@ -39,8 +40,10 @@ public:
 
 	virtual explicit operator std::string ( ) const;
 
-	static BlankSymbol BLANK;
-	static Symbol BLANK_SYMBOL;
+	template < typename Base >
+	static inline typename std::enable_if <   std::is_integral < Base >::value, Base >::type instance ( );
+	template < typename Base >
+	static inline typename std::enable_if < ! std::is_integral < Base >::value, Base >::type instance ( );
 
 	static const std::string & getXmlTagName() {
 		static std::string xmlTagName = "BlankSymbol";
@@ -55,6 +58,31 @@ public:
 	virtual SymbolBase * inc ( ) &&;
 };
 
+template < typename Base >
+inline typename std::enable_if < std::is_integral < Base >::value, Base >::type BlankSymbol::instance ( ) {
+	return ' ';
+}
+
+template < >
+inline std::string BlankSymbol::instance < std::string > ( ) {
+	return std::string ( 1, BlankSymbol::instance < char > ( ) );
+}
+
+template < >
+inline BlankSymbol BlankSymbol::instance < BlankSymbol > ( ) {
+	return BlankSymbol ( );
+}
+
+template < >
+inline Symbol BlankSymbol::instance < Symbol > ( ) {
+	return Symbol ( BlankSymbol ( ) );
+}
+
+template < >
+inline alib::Object BlankSymbol::instance < alib::Object > ( ) {
+	return alib::Object ( BlankSymbol ( ) );
+}
+
 } /* namespace alphabet */
 
 #endif /* BLANK_SYMBOL_H_ */
diff --git a/alib2data/src/alphabet/BottomOfTheStackSymbol.cpp b/alib2data/src/alphabet/BottomOfTheStackSymbol.cpp
index 8b54944099..ec403cd907 100644
--- a/alib2data/src/alphabet/BottomOfTheStackSymbol.cpp
+++ b/alib2data/src/alphabet/BottomOfTheStackSymbol.cpp
@@ -35,12 +35,10 @@ void BottomOfTheStackSymbol::operator>>(std::ostream& out) const {
 }
 
 BottomOfTheStackSymbol::operator std::string () const {
-	return "T";
+	return BottomOfTheStackSymbol::instance < std::string > ( );
+;
 }
 
-BottomOfTheStackSymbol BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK = BottomOfTheStackSymbol ( );
-Symbol BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK_SYMBOL = Symbol ( BottomOfTheStackSymbol ( ) );
-
 BottomOfTheStackSymbol BottomOfTheStackSymbol::parse(std::deque<sax::Token>::iterator& input) {
 	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, BottomOfTheStackSymbol::getXmlTagName());
 	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, BottomOfTheStackSymbol::getXmlTagName());
diff --git a/alib2data/src/alphabet/BottomOfTheStackSymbol.h b/alib2data/src/alphabet/BottomOfTheStackSymbol.h
index 9eda130ede..9bbef82703 100644
--- a/alib2data/src/alphabet/BottomOfTheStackSymbol.h
+++ b/alib2data/src/alphabet/BottomOfTheStackSymbol.h
@@ -10,6 +10,7 @@
 
 #include "SymbolBase.h"
 #include "Symbol.h"
+#include <object/Object.h>
 
 namespace alphabet {
 
@@ -39,8 +40,10 @@ public:
 
 	virtual explicit operator std::string ( ) const;
 
-	static BottomOfTheStackSymbol BOTTOM_OF_THE_STACK;
-	static Symbol BOTTOM_OF_THE_STACK_SYMBOL;
+	template < typename Base >
+	static inline typename std::enable_if <   std::is_integral < Base >::value, Base >::type instance ( );
+	template < typename Base >
+	static inline typename std::enable_if < ! std::is_integral < Base >::value, Base >::type instance ( );
 
 	static const std::string & getXmlTagName() {
 		static std::string xmlTagName = "BottomOfTheStackSymbol";
@@ -55,6 +58,31 @@ public:
 	virtual SymbolBase * inc ( ) &&;
 };
 
+template < typename Base >
+inline typename std::enable_if < std::is_integral < Base >::value, Base >::type BottomOfTheStackSymbol::instance ( ) {
+	return '_';
+}
+
+template < >
+inline std::string BottomOfTheStackSymbol::instance < std::string > ( ) {
+	return std::string ( 1, BottomOfTheStackSymbol::instance < char > ( ) );
+}
+
+template < >
+inline BottomOfTheStackSymbol BottomOfTheStackSymbol::instance < BottomOfTheStackSymbol > ( ) {
+	return BottomOfTheStackSymbol ( );
+}
+
+template < >
+inline Symbol BottomOfTheStackSymbol::instance < Symbol > ( ) {
+	return Symbol ( BottomOfTheStackSymbol ( ) );
+}
+
+template < >
+inline alib::Object BottomOfTheStackSymbol::instance < alib::Object > ( ) {
+	return alib::Object ( BottomOfTheStackSymbol ( ) );
+}
+
 } /* namespace alphabet */
 
 #endif /* BOTTOM_OF_THE_STACK_SYMBOL_H_ */
diff --git a/alib2data/src/alphabet/EndSymbol.cpp b/alib2data/src/alphabet/EndSymbol.cpp
index 9879d7cd59..74fab90d2f 100644
--- a/alib2data/src/alphabet/EndSymbol.cpp
+++ b/alib2data/src/alphabet/EndSymbol.cpp
@@ -35,12 +35,9 @@ void EndSymbol::operator>>(std::ostream& out) const {
 }
 
 EndSymbol::operator std::string () const {
-	return "$";
+	return EndSymbol::instance < std::string > ( );
 }
 
-EndSymbol EndSymbol::END = EndSymbol ( );
-Symbol EndSymbol::END_SYMBOL = Symbol ( EndSymbol ( ) );
-
 EndSymbol EndSymbol::parse(std::deque<sax::Token>::iterator& input) {
 	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, EndSymbol::getXmlTagName());
 	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, EndSymbol::getXmlTagName());
diff --git a/alib2data/src/alphabet/EndSymbol.h b/alib2data/src/alphabet/EndSymbol.h
index d2b77c40ff..a5f9fca8f8 100644
--- a/alib2data/src/alphabet/EndSymbol.h
+++ b/alib2data/src/alphabet/EndSymbol.h
@@ -10,6 +10,7 @@
 
 #include "SymbolBase.h"
 #include "Symbol.h"
+#include <object/Object.h>
 
 namespace alphabet {
 
@@ -39,8 +40,10 @@ public:
 
 	virtual explicit operator std::string ( ) const;
 
-	static EndSymbol END;
-	static Symbol END_SYMBOL;
+	template < typename Base >
+	static inline typename std::enable_if <   std::is_integral < Base >::value, Base >::type instance ( );
+	template < typename Base >
+	static inline typename std::enable_if < ! std::is_integral < Base >::value, Base >::type instance ( );
 
 	static const std::string & getXmlTagName() {
 		static std::string xmlTagName = "EndSymbol";
@@ -55,6 +58,31 @@ public:
 	virtual SymbolBase * inc ( ) &&;
 };
 
+template < typename Base >
+inline typename std::enable_if < std::is_integral < Base >::value, Base >::type EndSymbol::instance ( ) {
+	return '$';
+}
+
+template < >
+inline std::string EndSymbol::instance < std::string > ( ) {
+	return std::string ( 1, EndSymbol::instance < char > ( ) );
+}
+
+template < >
+inline EndSymbol EndSymbol::instance < EndSymbol > ( ) {
+	return EndSymbol ( );
+}
+
+template < >
+inline Symbol EndSymbol::instance < Symbol > ( ) {
+	return Symbol ( EndSymbol ( ) );
+}
+
+template < >
+inline alib::Object EndSymbol::instance < alib::Object > ( ) {
+	return alib::Object ( EndSymbol ( ) );
+}
+
 } /* namespace alphabet */
 
 #endif /* END_SYMBOL_H_ */
diff --git a/alib2data/src/alphabet/RankedSymbol.h b/alib2data/src/alphabet/RankedSymbol.h
index dae75a6675..4abc6797fe 100644
--- a/alib2data/src/alphabet/RankedSymbol.h
+++ b/alib2data/src/alphabet/RankedSymbol.h
@@ -42,7 +42,11 @@ public:
 	virtual explicit operator std::string ( ) const;
 
 	using SymbolBase::operator ==;
+	using SymbolBase::operator !=;
 	using SymbolBase::operator <;
+	using SymbolBase::operator <=;
+	using SymbolBase::operator >;
+	using SymbolBase::operator >=;
 
 	static const std::string & getXmlTagName() {
 		static std::string xmlTagName = "RankedSymbol";
diff --git a/alib2data/src/alphabet/StartSymbol.cpp b/alib2data/src/alphabet/StartSymbol.cpp
index 28668e3a3f..64c3525af8 100644
--- a/alib2data/src/alphabet/StartSymbol.cpp
+++ b/alib2data/src/alphabet/StartSymbol.cpp
@@ -35,12 +35,9 @@ void StartSymbol::operator>>(std::ostream& out) const {
 }
 
 StartSymbol::operator std::string () const {
-	return "$";
+	return StartSymbol::instance < std::string > ( );
 }
 
-StartSymbol StartSymbol::START = StartSymbol ( );
-Symbol StartSymbol::START_SYMBOL = Symbol ( StartSymbol ( ) );
-
 StartSymbol StartSymbol::parse(std::deque<sax::Token>::iterator& input) {
 	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, StartSymbol::getXmlTagName());
 	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, StartSymbol::getXmlTagName());
diff --git a/alib2data/src/alphabet/StartSymbol.h b/alib2data/src/alphabet/StartSymbol.h
index 3a322d3c8e..b3ab08c130 100644
--- a/alib2data/src/alphabet/StartSymbol.h
+++ b/alib2data/src/alphabet/StartSymbol.h
@@ -10,6 +10,7 @@
 
 #include "SymbolBase.h"
 #include "Symbol.h"
+#include <object/Object.h>
 
 namespace alphabet {
 
@@ -39,8 +40,10 @@ public:
 
 	virtual explicit operator std::string ( ) const;
 
-	static StartSymbol START;
-	static Symbol START_SYMBOL;
+	template < typename Base >
+	static inline typename std::enable_if <   std::is_integral < Base >::value, Base >::type instance ( );
+	template < typename Base >
+	static inline typename std::enable_if < ! std::is_integral < Base >::value, Base >::type instance ( );
 
 	static const std::string & getXmlTagName() {
 		static std::string xmlTagName = "StartSymbol";
@@ -55,6 +58,31 @@ public:
 	virtual SymbolBase * inc ( ) &&;
 };
 
+template < typename Base >
+inline typename std::enable_if < std::is_integral < Base >::value, Base >::type StartSymbol::instance ( ) {
+	return '^';
+}
+
+template < >
+inline std::string StartSymbol::instance < std::string > ( ) {
+	return std::string ( 1, StartSymbol::instance < char > ( ) );
+}
+
+template < >
+inline StartSymbol StartSymbol::instance < StartSymbol > ( ) {
+	return StartSymbol ( );
+}
+
+template < >
+inline Symbol StartSymbol::instance < Symbol > ( ) {
+	return Symbol ( StartSymbol ( ) );
+}
+
+template < >
+inline alib::Object StartSymbol::instance < alib::Object > ( ) {
+	return alib::Object ( StartSymbol ( ) );
+}
+
 } /* namespace alphabet */
 
 #endif /* START_SYMBOL_H_ */
diff --git a/alib2data/src/alphabet/SubtreeWildcardSymbol.cpp b/alib2data/src/alphabet/SubtreeWildcardSymbol.cpp
index b374d47678..bc7e63b7cc 100644
--- a/alib2data/src/alphabet/SubtreeWildcardSymbol.cpp
+++ b/alib2data/src/alphabet/SubtreeWildcardSymbol.cpp
@@ -35,13 +35,9 @@ void SubtreeWildcardSymbol::operator>>(std::ostream& out) const {
 }
 
 SubtreeWildcardSymbol::operator std::string () const {
-	return "#S";
+	return SubtreeWildcardSymbol::instance < std::string > ( );
 }
 
-SubtreeWildcardSymbol SubtreeWildcardSymbol::SUBTREE_WILDCARD = SubtreeWildcardSymbol ( );
-Symbol SubtreeWildcardSymbol::SUBTREE_WILDCARD_SYMBOL = Symbol ( SubtreeWildcardSymbol ( ) );
-RankedSymbol < > SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL = RankedSymbol < > ( Symbol ( SubtreeWildcardSymbol ( ) ), 0);
-
 SubtreeWildcardSymbol SubtreeWildcardSymbol::parse(std::deque<sax::Token>::iterator& input) {
 	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, SubtreeWildcardSymbol::getXmlTagName());
 	sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, SubtreeWildcardSymbol::getXmlTagName());
diff --git a/alib2data/src/alphabet/SubtreeWildcardSymbol.h b/alib2data/src/alphabet/SubtreeWildcardSymbol.h
index e820c63341..01d24677bd 100644
--- a/alib2data/src/alphabet/SubtreeWildcardSymbol.h
+++ b/alib2data/src/alphabet/SubtreeWildcardSymbol.h
@@ -11,6 +11,7 @@
 #include "SymbolBase.h"
 #include "Symbol.h"
 #include "RankedSymbol.h"
+#include <object/Object.h>
 
 namespace alphabet {
 
@@ -40,9 +41,10 @@ public:
 
 	virtual explicit operator std::string ( ) const;
 
-	static SubtreeWildcardSymbol SUBTREE_WILDCARD;
-	static Symbol SUBTREE_WILDCARD_SYMBOL;
-	static RankedSymbol < > RANKED_SUBTREE_WILDCARD_SYMBOL;
+	template < typename Base >
+	static inline typename std::enable_if <   std::is_integral < Base >::value, Base >::type instance ( );
+	template < typename Base >
+	static inline typename std::enable_if < ! std::is_integral < Base >::value, Base >::type instance ( );
 
 	static const std::string & getXmlTagName() {
 		static std::string xmlTagName = "SubtreeWildcardSymbol";
@@ -57,6 +59,42 @@ public:
 	virtual SymbolBase * inc ( ) &&;
 };
 
+template < typename Base >
+inline typename std::enable_if < std::is_integral < Base >::value, Base >::type SubtreeWildcardSymbol::instance ( ) {
+	return 'S';
+}
+
+template < >
+inline std::string SubtreeWildcardSymbol::instance < std::string > ( ) {
+	return std::string ( 1, SubtreeWildcardSymbol::instance < char > ( ) );
+}
+
+template < >
+inline SubtreeWildcardSymbol SubtreeWildcardSymbol::instance < SubtreeWildcardSymbol > ( ) {
+	return SubtreeWildcardSymbol ( );
+}
+
+template < >
+inline Symbol SubtreeWildcardSymbol::instance < Symbol > ( ) {
+	return Symbol ( SubtreeWildcardSymbol ( ) );
+}
+
+// TODO make partially specialised when needed by classes or variables, functions can be partially specialsed
+template < >
+inline std::ranked_symbol < > SubtreeWildcardSymbol::instance < std::ranked_symbol < > > ( ) {
+	return std::ranked_symbol < > ( Symbol ( SubtreeWildcardSymbol ( ) ), 0);
+}
+
+template < >
+inline RankedSymbol < > SubtreeWildcardSymbol::instance < RankedSymbol < > > ( ) {
+	return RankedSymbol < > ( SubtreeWildcardSymbol::instance < std::ranked_symbol < > > ( ) );
+}
+
+template < >
+inline alib::Object SubtreeWildcardSymbol::instance < alib::Object > ( ) {
+	return alib::Object ( SubtreeWildcardSymbol ( ) );
+}
+
 } /* namespace alphabet */
 
 #endif /* SUBTREE_WILDCARD_SYMBOL_H_ */
diff --git a/alib2data/src/alphabet/VariablesBarSymbol.cpp b/alib2data/src/alphabet/VariablesBarSymbol.cpp
index f24a092285..97f583978e 100644
--- a/alib2data/src/alphabet/VariablesBarSymbol.cpp
+++ b/alib2data/src/alphabet/VariablesBarSymbol.cpp
@@ -34,13 +34,9 @@ void VariablesBarSymbol::operator >>( std::ostream & out ) const {
 }
 
 VariablesBarSymbol::operator std::string ( ) const {
-	return "|";
+	return VariablesBarSymbol::instance < std::string > ( );
 }
 
-VariablesBarSymbol VariablesBarSymbol::BAR = VariablesBarSymbol ( );
-Symbol VariablesBarSymbol::BAR_SYMBOL = Symbol ( VariablesBarSymbol ( ) );
-RankedSymbol < > VariablesBarSymbol::RANKED_BAR_SYMBOL = RankedSymbol < > ( Symbol ( VariablesBarSymbol ( ) ), 0);
-
 VariablesBarSymbol VariablesBarSymbol::parse ( std::deque < sax::Token >::iterator & input ) {
 	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, VariablesBarSymbol::getXmlTagName() );
 	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, VariablesBarSymbol::getXmlTagName() );
diff --git a/alib2data/src/alphabet/VariablesBarSymbol.h b/alib2data/src/alphabet/VariablesBarSymbol.h
index 5f3d3671a2..585b50c76c 100644
--- a/alib2data/src/alphabet/VariablesBarSymbol.h
+++ b/alib2data/src/alphabet/VariablesBarSymbol.h
@@ -11,6 +11,7 @@
 #include "SymbolBase.h"
 #include "Symbol.h"
 #include "RankedSymbol.h"
+#include <object/Object.h>
 
 namespace alphabet {
 
@@ -40,9 +41,10 @@ public:
 
 	virtual explicit operator std::string ( ) const;
 
-	static VariablesBarSymbol BAR;
-	static Symbol BAR_SYMBOL;
-	static RankedSymbol < > RANKED_BAR_SYMBOL;
+	template < typename Base >
+	static inline typename std::enable_if <   std::is_integral < Base >::value, Base >::type instance ( );
+	template < typename Base >
+	static inline typename std::enable_if < ! std::is_integral < Base >::value, Base >::type instance ( );
 
 	static const std::string & getXmlTagName() {
 		static std::string xmlTagName = "VariablesBarSymbol";
@@ -57,6 +59,42 @@ public:
 	virtual SymbolBase * inc ( ) &&;
 };
 
+template < typename Base >
+inline typename std::enable_if < std::is_integral < Base >::value, Base >::type VariablesBarSymbol::instance ( ) {
+	return '!';
+}
+
+template < >
+inline std::string VariablesBarSymbol::instance < std::string > ( ) {
+	return std::string ( 1, VariablesBarSymbol::instance < char > ( ) );
+}
+
+template < >
+inline VariablesBarSymbol VariablesBarSymbol::instance < VariablesBarSymbol > ( ) {
+	return VariablesBarSymbol ( );
+}
+
+template < >
+inline Symbol VariablesBarSymbol::instance < Symbol > ( ) {
+	return Symbol ( VariablesBarSymbol ( ) );
+}
+
+// TODO make partially specialised when needed by classes or variables, functions can be partially specialsed
+template < >
+inline std::ranked_symbol < > VariablesBarSymbol::instance < std::ranked_symbol < > > ( ) {
+	return std::ranked_symbol < > ( Symbol ( VariablesBarSymbol ( ) ), 0);
+}
+
+template < >
+inline RankedSymbol < > VariablesBarSymbol::instance < RankedSymbol < > > ( ) {
+	return RankedSymbol < > ( VariablesBarSymbol::instance < std::ranked_symbol < > > ( ) );
+}
+
+template < >
+inline alib::Object VariablesBarSymbol::instance < alib::Object > ( ) {
+	return alib::Object ( VariablesBarSymbol ( ) );
+}
+
 } /* namespace alphabet */
 
 #endif /* VARIABLES_BAR_SYMBOL_H_ */
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.h b/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.h
index 855b370849..1a5cd708d3 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.h
+++ b/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.h
@@ -145,7 +145,7 @@ PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonline
 }
 
 template < class SymbolType, class RankType >
-PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < SymbolType, RankType > variablesBar, const RankedTree < > & tree ) : PrefixRankedBarNonlinearPattern ( TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar }, variablesBar, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ) + TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL }, toPrefixRankedBar ( tree.getContent ( ), alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, barBase, variablesBar ) ) {
+PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < SymbolType, RankType > variablesBar, const RankedTree < > & tree ) : PrefixRankedBarNonlinearPattern ( TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar }, variablesBar, alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), { }, tree.getAlphabet ( ) + TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar, alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ) }, toPrefixRankedBar ( tree.getContent ( ), alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), { }, barBase, variablesBar ) ) {
 }
 
 template < class SymbolType, class RankType >
@@ -157,7 +157,7 @@ PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonline
 }
 
 template < class SymbolType, class RankType >
-PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const PrefixRankedBarTree < > & tree ) : PrefixRankedBarNonlinearPattern ( tree.getBars ( ) + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL }, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ) + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL }, tree.getContent ( ) ) {
+PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const PrefixRankedBarTree < > & tree ) : PrefixRankedBarNonlinearPattern ( tree.getBars ( ) + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::VariablesBarSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ) }, alphabet::VariablesBarSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), { }, tree.getAlphabet ( ) + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::VariablesBarSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ) }, tree.getContent ( ) ) {
 }
 
 template < class SymbolType, class RankType >
@@ -165,15 +165,15 @@ PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonline
 }
 
 template < class SymbolType, class RankType >
-PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const RankedTree < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, tree ) {
+PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const RankedTree < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::instance < SymbolType > ( ), alphabet::VariablesBarSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), tree ) {
 }
 
 template < class SymbolType, class RankType >
-PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const RankedPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, tree ) {
+PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const RankedPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::instance < SymbolType > ( ), alphabet::VariablesBarSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), tree ) {
 }
 
 template < class SymbolType, class RankType >
-PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const RankedNonlinearPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, tree ) {
+PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const RankedNonlinearPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::instance < SymbolType > ( ), alphabet::VariablesBarSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), tree ) {
 }
 
 template < class SymbolType, class RankType >
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h
index 772bda0ca7..8ba7b4a313 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h
+++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h
@@ -135,11 +135,11 @@ PrefixRankedBarPattern < SymbolType, RankType >::PrefixRankedBarPattern ( alphab
 }
 
 template < class SymbolType, class RankType >
-PrefixRankedBarPattern < SymbolType, RankType >::PrefixRankedBarPattern ( const PrefixRankedBarTree < > & tree ) : PrefixRankedBarPattern ( tree.getBars() + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL }, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, tree.getAlphabet ( ) + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL }, tree.getContent ( ) ) {
+PrefixRankedBarPattern < SymbolType, RankType >::PrefixRankedBarPattern ( const PrefixRankedBarTree < > & tree ) : PrefixRankedBarPattern ( tree.getBars() + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::VariablesBarSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ) }, alphabet::VariablesBarSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), tree.getAlphabet ( ) + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::VariablesBarSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ) }, tree.getContent ( ) ) {
 }
 
 template < class SymbolType, class RankType >
-PrefixRankedBarPattern < SymbolType, RankType >::PrefixRankedBarPattern ( const RankedPattern < > & tree ) : PrefixRankedBarPattern ( alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, tree ) {
+PrefixRankedBarPattern < SymbolType, RankType >::PrefixRankedBarPattern ( const RankedPattern < > & tree ) : PrefixRankedBarPattern ( alphabet::BarSymbol::instance < SymbolType > ( ), alphabet::VariablesBarSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), tree ) {
 }
 
 template < class SymbolType, class RankType >
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarTree.h b/alib2data/src/tree/ranked/PrefixRankedBarTree.h
index f07086a877..4106f31398 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarTree.h
+++ b/alib2data/src/tree/ranked/PrefixRankedBarTree.h
@@ -121,7 +121,7 @@ PrefixRankedBarTree < SymbolType, RankType >::PrefixRankedBarTree ( alphabet::Sy
 }
 
 template < class SymbolType, class RankType >
-PrefixRankedBarTree < SymbolType, RankType >::PrefixRankedBarTree ( const RankedTree < > & tree ) : PrefixRankedBarTree ( alphabet::BarSymbol::BAR_SYMBOL, tree ) {
+PrefixRankedBarTree < SymbolType, RankType >::PrefixRankedBarTree ( const RankedTree < > & tree ) : PrefixRankedBarTree ( alphabet::BarSymbol::instance < SymbolType > ( ), tree ) {
 }
 
 template < class SymbolType, class RankType >
diff --git a/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.h b/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.h
index 643564a0c9..e843e58a22 100644
--- a/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.h
+++ b/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.h
@@ -133,7 +133,7 @@ PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPatt
 }
 
 template < class SymbolType, class RankType >
-PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( const PrefixRankedTree < > & tree ) : PrefixRankedNonlinearPattern ( alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ), tree.getContent ( ) ) {
+PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( const PrefixRankedTree < > & tree ) : PrefixRankedNonlinearPattern ( alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), { }, tree.getAlphabet ( ), tree.getContent ( ) ) {
 }
 
 template < class SymbolType, class RankType >
@@ -141,7 +141,7 @@ PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPatt
 }
 
 template < class SymbolType, class RankType >
-PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( const RankedTree < > & tree ) : PrefixRankedNonlinearPattern ( alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ), toPrefixRanked ( tree.getContent ( ) ) ) {
+PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( const RankedTree < > & tree ) : PrefixRankedNonlinearPattern ( alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), { }, tree.getAlphabet ( ), toPrefixRanked ( tree.getContent ( ) ) ) {
 }
 
 template < class SymbolType, class RankType >
diff --git a/alib2data/src/tree/ranked/PrefixRankedPattern.h b/alib2data/src/tree/ranked/PrefixRankedPattern.h
index 988cc22b8c..0b98089902 100644
--- a/alib2data/src/tree/ranked/PrefixRankedPattern.h
+++ b/alib2data/src/tree/ranked/PrefixRankedPattern.h
@@ -117,7 +117,7 @@ PrefixRankedPattern < SymbolType, RankType >::PrefixRankedPattern ( std::ranked_
 }
 
 template < class SymbolType, class RankType >
-PrefixRankedPattern < SymbolType, RankType >::PrefixRankedPattern ( const PrefixRankedTree < > & tree ) : PrefixRankedPattern ( alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, tree.getAlphabet ( ) + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL }, tree.getContent ( ) ) {
+PrefixRankedPattern < SymbolType, RankType >::PrefixRankedPattern ( const PrefixRankedTree < > & tree ) : PrefixRankedPattern ( alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), tree.getAlphabet ( ) + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ) }, tree.getContent ( ) ) {
 }
 
 template < class SymbolType, class RankType >
diff --git a/alib2data/src/tree/unranked/PrefixBarTree.h b/alib2data/src/tree/unranked/PrefixBarTree.h
index 98e7c5b341..874093c6f7 100644
--- a/alib2data/src/tree/unranked/PrefixBarTree.h
+++ b/alib2data/src/tree/unranked/PrefixBarTree.h
@@ -118,7 +118,7 @@ PrefixBarTree < SymbolType >::PrefixBarTree ( SymbolType bar, const UnrankedTree
 }
 
 template < class SymbolType >
-PrefixBarTree < SymbolType >::PrefixBarTree ( const UnrankedTree < SymbolType > & tree ) : PrefixBarTree ( alphabet::BarSymbol::BAR_SYMBOL, tree ) {
+PrefixBarTree < SymbolType >::PrefixBarTree ( const UnrankedTree < SymbolType > & tree ) : PrefixBarTree ( alphabet::BarSymbol::instance < SymbolType > ( ), tree ) {
 }
 
 template < class SymbolType >
diff --git a/alib2data/test-src/alphabet/SymbolTest.cpp b/alib2data/test-src/alphabet/SymbolTest.cpp
index 1a80a11f4c..8ceaec1194 100644
--- a/alib2data/test-src/alphabet/SymbolTest.cpp
+++ b/alib2data/test-src/alphabet/SymbolTest.cpp
@@ -77,3 +77,23 @@ void SymbolTest::testOrder ( ) {
 	// CPPUNIT_ASSERT(es < ls); //End symbol typically denoted by '$' is lexicographically smaller than any other symbol
 	// CPPUNIT_ASSERT(ls < ss); //Start symbol typically denoted by '^' is lexicographically bigger than any other symbol
 }
+
+namespace alphabet {
+
+template < >
+inline int BarSymbol::instance < int > ( ) {
+	return -1;
+}
+
+} /* namespace alphabet */
+
+void SymbolTest::testDefaultValues ( ) {
+	CPPUNIT_ASSERT ( alphabet::BarSymbol::instance < int > ( ) == -1 );
+	CPPUNIT_ASSERT ( alphabet::BarSymbol::instance < char > ( ) == '|');
+	std::cout << alphabet::BarSymbol::instance < std::string > ( ) << std::endl;
+	CPPUNIT_ASSERT ( alphabet::BarSymbol::instance < std::string > ( ) == "|");
+	CPPUNIT_ASSERT ( alphabet::BarSymbol::instance < alphabet::BarSymbol > ( ) == alphabet::BarSymbol ( ) );
+	CPPUNIT_ASSERT ( alphabet::BarSymbol::instance < alphabet::Symbol > ( ) == alphabet::Symbol ( alphabet::BarSymbol ( ) ) );
+	CPPUNIT_ASSERT ( alphabet::BarSymbol::instance < alib::Object > ( ) == alib::Object ( alphabet::BarSymbol ( ) ) );
+
+}
diff --git a/alib2data/test-src/alphabet/SymbolTest.h b/alib2data/test-src/alphabet/SymbolTest.h
index f9599c1c70..3b7070b978 100644
--- a/alib2data/test-src/alphabet/SymbolTest.h
+++ b/alib2data/test-src/alphabet/SymbolTest.h
@@ -9,6 +9,7 @@ class SymbolTest : public CppUnit::TestFixture
   CPPUNIT_TEST( testCopyConstruct );
   CPPUNIT_TEST( testXMLParser );
   CPPUNIT_TEST( testOrder );
+  CPPUNIT_TEST( testDefaultValues );
   CPPUNIT_TEST_SUITE_END();
 
 public:
@@ -18,6 +19,7 @@ public:
   void testCopyConstruct();
   void testXMLParser();
   void testOrder();
+  void testDefaultValues();
 };
 
 #endif  // SYMBOL_TEST_H_
diff --git a/alib2data/test-src/automaton/AutomatonTest.cpp b/alib2data/test-src/automaton/AutomatonTest.cpp
index 837d74bd24..b198c3354d 100644
--- a/alib2data/test-src/automaton/AutomatonTest.cpp
+++ b/alib2data/test-src/automaton/AutomatonTest.cpp
@@ -216,12 +216,12 @@ void AutomatonTest::testNPDATransitions() {
 }
 
 void AutomatonTest::testRHPDATransitions() {
-	automaton::RealTimeHeightDeterministicNPDA < > automaton{alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK_SYMBOL};
+	automaton::RealTimeHeightDeterministicNPDA < > automaton{alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) };
 	automaton.setStates({label::labelFrom(1), label::labelFrom(2), label::labelFrom(3)});
 	automaton.setInitialStates({label::labelFrom(1)});
 
 	automaton.setInputAlphabet({alphabet::symbolFrom("a"), alphabet::symbolFrom("b")});
-	automaton.setPushdownStoreAlphabet({alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK_SYMBOL, alphabet::symbolFrom("X"), alphabet::symbolFrom("Y")});
+	automaton.setPushdownStoreAlphabet({alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ), alphabet::symbolFrom("X"), alphabet::symbolFrom("Y")});
 
 	automaton.addCallTransition(label::labelFrom(1), alphabet::symbolFrom("a"), label::labelFrom(2), alphabet::symbolFrom("X"));
 	automaton.addCallTransition(label::labelFrom(2), label::labelFrom(3), alphabet::symbolFrom("X"));
diff --git a/alib2data/test-src/tree/PatternTest.cpp b/alib2data/test-src/tree/PatternTest.cpp
index 3d8e7fe7d1..bae444f177 100644
--- a/alib2data/test-src/tree/PatternTest.cpp
+++ b/alib2data/test-src/tree/PatternTest.cpp
@@ -173,7 +173,7 @@ void PatternTest::testPrefixRankedBarPatternParser() {
 	std::tree < std::ranked_symbol < > > node1(a, {std::move(node2), std::move(node4)});
 
 	tree::RankedPattern < > pattern(S, alphabet, std::move(node1));
-	tree::PrefixRankedBarPattern < > pattern2(alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, pattern);
+	tree::PrefixRankedBarPattern < > pattern2(alphabet::BarSymbol::instance < alphabet::Symbol > ( ), alphabet::VariablesBarSymbol::instance < std::ranked_symbol < alphabet::Symbol, primitive::Unsigned > > ( ), pattern);
 
 	CPPUNIT_ASSERT( pattern2 == pattern2 );
 	{
diff --git a/alib2str/src/tree/TreeFromStringParser.cpp b/alib2str/src/tree/TreeFromStringParser.cpp
index 2f19e1d38b..bd26d73857 100644
--- a/alib2str/src/tree/TreeFromStringParser.cpp
+++ b/alib2str/src/tree/TreeFromStringParser.cpp
@@ -27,21 +27,19 @@ Tree TreeFromStringParser::parseTree ( std::istream & input, const std::set < FE
 		token = TreeFromStringLexer::next ( input );
 
 		if ( token.type == TreeFromStringLexer::TokenType::BAR ) {
-			alphabet::Symbol subtreeWildcard ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD );
-			return Tree ( UnrankedPattern < > ( subtreeWildcard, std::tree < alphabet::Symbol > ( subtreeWildcard, { } ) ) );
+			return Tree ( UnrankedPattern < > ( alphabet::SubtreeWildcardSymbol::instance < alphabet::Symbol > ( ), std::tree < alphabet::Symbol > ( alphabet::SubtreeWildcardSymbol::instance < alphabet::Symbol > ( ), { } ) ) );
 		} else {
-			std::ranked_symbol < > subtreeWildcard ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 );
-			return Tree ( RankedPattern < > ( subtreeWildcard, std::tree < std::ranked_symbol < > > ( subtreeWildcard, { } ) ) );
+			return Tree ( RankedPattern < > ( alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < > > ( ), std::tree < std::ranked_symbol < > > ( alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < > > ( ), { } ) ) );
 		}
 	} else if ( token.type == TreeFromStringLexer::TokenType::NONLINEAR_VARIABLE ) {
 		token = TreeFromStringLexer::next ( input );
 
 		if ( token.type == TreeFromStringLexer::TokenType::BAR ) {
-			alphabet::Symbol subtreeWildcard ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD );
+			alphabet::Symbol subtreeWildcard = alphabet::SubtreeWildcardSymbol::instance < alphabet::Symbol > ( );
 			alphabet::Symbol nonlinearVariable ( alphabet::NonlinearVariableSymbol < > ( alphabet::symbolFrom ( token.value ) ) );
 			return Tree ( UnrankedNonlinearPattern < > ( subtreeWildcard, { nonlinearVariable }, std::tree < alphabet::Symbol > ( subtreeWildcard, { } ) ) );
 		} else {
-			std::ranked_symbol < > subtreeWildcard ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 );
+			std::ranked_symbol < > subtreeWildcard = alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < > > ( );
 			std::ranked_symbol < > nonlinearVariable ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol < > ( alphabet::symbolFrom ( token.value ) ) ), 0 );
 			return Tree ( RankedNonlinearPattern < > ( subtreeWildcard, { nonlinearVariable }, std::tree < std::ranked_symbol < > > ( nonlinearVariable, { } ) ) );
 		}
@@ -65,13 +63,11 @@ Tree TreeFromStringParser::parseTree ( std::istream & input, const std::set < FE
 				childs.emplace_back ( parseRankedContent ( input, isPattern, nonlinearVariables ) );
 
 			if ( isPattern && nonlinearVariables.size ( ) ) {
-				std::ranked_symbol < > subtreeWildcard ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 );
-				RankedNonlinearPattern < > tree ( std::move ( subtreeWildcard ), std::move ( nonlinearVariables ), std::tree < std::ranked_symbol < > > ( std::ranked_symbol < > ( std::move ( symbol ), rank ), std::move ( childs ) ) );
+				RankedNonlinearPattern < > tree ( alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < > > ( ), std::move ( nonlinearVariables ), std::tree < std::ranked_symbol < > > ( std::ranked_symbol < > ( std::move ( symbol ), rank ), std::move ( childs ) ) );
 
 				if ( features.count ( FEATURES::RANKED_NONLINEAR_PATTERN ) ) return Tree ( std::move ( tree ) );
 			} else if ( isPattern ) {
-				std::ranked_symbol < > subtreeWildcard ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 );
-				RankedPattern < > tree ( std::move ( subtreeWildcard ), std::tree < std::ranked_symbol < > > ( std::ranked_symbol < > ( std::move ( symbol ), rank ), std::move ( childs ) ) );
+				RankedPattern < > tree ( alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < > > ( ), std::tree < std::ranked_symbol < > > ( std::ranked_symbol < > ( std::move ( symbol ), rank ), std::move ( childs ) ) );
 
 				if ( features.count ( FEATURES::RANKED_PATTERN ) ) return Tree ( std::move ( tree ) );
 			} else {
@@ -95,13 +91,11 @@ Tree TreeFromStringParser::parseTree ( std::istream & input, const std::set < FE
 				throw exception::CommonException ( "Missing bar" );
 
 			if ( isPattern && nonlinearVariables.size ( ) ) {
-				alphabet::Symbol subtreeWildcard ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD );
-				UnrankedNonlinearPattern < > tree ( std::move ( subtreeWildcard ), std::move ( nonlinearVariables ), std::tree < alphabet::Symbol > ( std::move ( symbol ), std::move ( childs ) ) );
+				UnrankedNonlinearPattern < > tree ( alphabet::SubtreeWildcardSymbol::instance < alphabet::Symbol > ( ), std::move ( nonlinearVariables ), std::tree < alphabet::Symbol > ( std::move ( symbol ), std::move ( childs ) ) );
 
 				if ( features.count ( FEATURES::UNRANKED_NONLINEAR_PATTERN ) ) return Tree ( std::move ( tree ) );
 			} else if ( isPattern ) {
-				alphabet::Symbol subtreeWildcard ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD );
-				UnrankedPattern < > tree ( std::move ( subtreeWildcard ), std::tree < alphabet::Symbol > ( std::move ( symbol ), std::move ( childs ) ) );
+				UnrankedPattern < > tree ( alphabet::SubtreeWildcardSymbol::instance < alphabet::Symbol > ( ), std::tree < alphabet::Symbol > ( std::move ( symbol ), std::move ( childs ) ) );
 
 				if ( features.count ( FEATURES::UNRANKED_PATTERN ) ) return Tree ( std::move ( tree ) );
 			} else {
@@ -120,8 +114,7 @@ std::tree < std::ranked_symbol < > > TreeFromStringParser::parseRankedContent (
 
 	if ( token.type == TreeFromStringLexer::TokenType::SUBTREE_WILDCARD ) {
 		isPattern = true;
-		std::ranked_symbol < > subtreeWildcard ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 );
-		return std::tree < std::ranked_symbol < > > ( std::move ( subtreeWildcard ), { } );
+		return std::tree < std::ranked_symbol < > > ( alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < > > ( ), { } );
 	} else if ( token.type == TreeFromStringLexer::TokenType::NONLINEAR_VARIABLE ) {
 		isPattern = true;
 		std::ranked_symbol < > nonlinearVariable ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol < > ( alphabet::symbolFrom ( token.value ) ) ), 0 );
@@ -158,8 +151,7 @@ std::tree < alphabet::Symbol > TreeFromStringParser::parseUnrankedContent ( std:
 			throw exception::CommonException ( "Missing bar" );
 
 		isPattern = true;
-		alphabet::Symbol subtreeWildcard ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD );
-		return std::tree < alphabet::Symbol > ( std::move ( subtreeWildcard ), { } );
+		return std::tree < alphabet::Symbol > ( alphabet::SubtreeWildcardSymbol::instance < alphabet::Symbol > ( ), { } );
 	} else if ( token.type == TreeFromStringLexer::TokenType::NONLINEAR_VARIABLE ) {
 		token = TreeFromStringLexer::next ( input );
 
-- 
GitLab