diff --git a/alib2data/src/Api.cpp b/alib2data/src/Api.cpp
index 1a7dba0475488b6f9b7e210dd9fb28270324ca9c..9935a06342faa47d6ab726506ba78e0609d1732d 100644
--- a/alib2data/src/Api.cpp
+++ b/alib2data/src/Api.cpp
@@ -137,6 +137,22 @@ std::list<sax::Token> api<alphabet::EndSymbol>::compose(const alphabet::EndSymbo
 	return ToXMLComposers::symbolComposer.compose(data);
 }
 
+alphabet::RankedSymbol api<alphabet::RankedSymbol>::parse(std::list<sax::Token>& input) {
+	return FromXMLParsers::symbolParser.parseRankedSymbol(input);
+}
+
+std::list<sax::Token> api<alphabet::RankedSymbol>::compose(const alphabet::RankedSymbol& data) {
+	return ToXMLComposers::symbolComposer.compose(data);
+}
+
+alphabet::BarSymbol api<alphabet::BarSymbol>::parse(std::list<sax::Token>& input) {
+	return FromXMLParsers::symbolParser.parseBarSymbol(input);
+}
+
+std::list<sax::Token> api<alphabet::BarSymbol>::compose(const alphabet::BarSymbol& data) {
+	return ToXMLComposers::symbolComposer.compose(data);
+}
+
 
 automaton::Automaton api<automaton::Automaton>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::automatonParser.parseAutomaton(input);
@@ -572,6 +588,14 @@ void ToXMLComposers::Visit(void* data, const alphabet::EndSymbol& symbol) const
 	*((std::list<sax::Token>*) data) = std::move(api<alphabet::EndSymbol>::compose(symbol));
 }
 
+void ToXMLComposers::Visit(void* data, const alphabet::RankedSymbol& symbol) const {
+	*((std::list<sax::Token>*) data) = std::move(api<alphabet::RankedSymbol>::compose(symbol));
+}
+
+void ToXMLComposers::Visit(void* data, const alphabet::BarSymbol& symbol) const {
+	*((std::list<sax::Token>*) data) = std::move(api<alphabet::BarSymbol>::compose(symbol));
+}
+
 void ToXMLComposers::Visit(void* data, const alphabet::LabeledSymbol& symbol) const {
 	*((std::list<sax::Token>*) data) = std::move(api<alphabet::LabeledSymbol>::compose(symbol));
 }
diff --git a/alib2data/src/Api.hpp b/alib2data/src/Api.hpp
index 36881e004e9dce7b20995d80c6698454c1f34e07..7d5b11d276bc05346922852a016935afad2e306f 100644
--- a/alib2data/src/Api.hpp
+++ b/alib2data/src/Api.hpp
@@ -138,6 +138,18 @@ struct api<alphabet::EndSymbol> {
 };
 
 
+template<>
+struct api<alphabet::RankedSymbol> {
+	static alphabet::RankedSymbol parse(std::list<sax::Token>& input);
+	static std::list<sax::Token> compose(const alphabet::RankedSymbol& data);
+};
+
+template<>
+struct api<alphabet::BarSymbol> {
+	static alphabet::BarSymbol parse(std::list<sax::Token>& input);
+	static std::list<sax::Token> compose(const alphabet::BarSymbol& data);
+};
+
 template<>
 struct api<automaton::Automaton> {
 	static automaton::Automaton parse(std::list<sax::Token>& input);
@@ -478,6 +490,8 @@ class ToXMLComposers : public VisitableObjectBase::const_visitor_type {
 	void Visit(void*, const alphabet::BlankSymbol& symbol) const;
 	void Visit(void*, const alphabet::BottomOfTheStackSymbol& symbol) const;
 	void Visit(void*, const alphabet::EndSymbol& symbol) const;
+	void Visit(void*, const alphabet::RankedSymbol& symbol) const;
+	void Visit(void*, const alphabet::BarSymbol& symbol) const;
 
 	void Visit(void*, const automaton::EpsilonNFA& automaton) const;
 	void Visit(void*, const automaton::MultiInitialStateNFA& automaton) const;
diff --git a/alib2data/src/alphabet/BarSymbol.cpp b/alib2data/src/alphabet/BarSymbol.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e147bc3c3d5bd621e8e77e00a840fb1898aaceee
--- /dev/null
+++ b/alib2data/src/alphabet/BarSymbol.cpp
@@ -0,0 +1,47 @@
+#include "BarSymbol.h"
+
+namespace alphabet {
+
+BarSymbol::BarSymbol() {
+
+}
+
+SymbolBase* BarSymbol::clone() const {
+	return new BarSymbol(*this);
+}
+
+SymbolBase* BarSymbol::plunder() && {
+	return new BarSymbol(std::move(*this));
+}
+
+bool BarSymbol::operator <(const ObjectBase& other) const {
+	return other > *this;
+}
+
+bool BarSymbol::operator ==(const ObjectBase& other) const {
+	return other == *this;
+}
+
+bool BarSymbol::operator >(const ObjectBase& other) const {
+	return other < *this;
+}
+
+bool BarSymbol::operator ==(const BarSymbol&) const {
+	return true;
+}
+
+bool BarSymbol::operator <(const BarSymbol&) const {
+	return false;
+}
+
+void BarSymbol::operator>>(std::ostream& out) const {
+	out << "(Bar symbol)";
+}
+
+BarSymbol::operator std::string () const {
+	return "|";
+}
+
+BarSymbol BarSymbol::BAR = BarSymbol();
+
+} /* namespace alphabet */
diff --git a/alib2data/src/alphabet/BarSymbol.h b/alib2data/src/alphabet/BarSymbol.h
new file mode 100644
index 0000000000000000000000000000000000000000..a6512759d84b61c49def436ad6380b579d606f79
--- /dev/null
+++ b/alib2data/src/alphabet/BarSymbol.h
@@ -0,0 +1,42 @@
+#ifndef BAR_SYMBOL_H_
+#define BAR_SYMBOL_H_
+
+#include "Symbol.h"
+
+namespace alphabet {
+
+/**
+ * Represents bar symbol for tree linearization.
+ */
+class BarSymbol : public std::acceptor<BarSymbol, VisitableSymbolBase, std::acceptor<BarSymbol, alib::VisitableObjectBase, SymbolBase> > {
+public:
+	/**
+	 * Creates a bar symbol.
+	 * @param symbol name of the symbol
+	 */
+	explicit BarSymbol();
+
+	virtual SymbolBase* clone() const;
+	virtual SymbolBase* plunder() &&;
+
+	virtual bool operator <(const alib::ObjectBase& other) const;
+	virtual bool operator ==(const alib::ObjectBase& other) const;
+	virtual bool operator >(const alib::ObjectBase& other) const;
+
+	virtual bool operator ==(const BarSymbol& other) const;
+	virtual bool operator <(const BarSymbol& other) const;
+
+	virtual void operator>>(std::ostream& out) const;
+
+	virtual operator std::string () const;
+
+	virtual int selfTypeId() const {
+		return typeId<BarSymbol>();
+	}
+
+	static BarSymbol BAR;
+};
+
+} /* namespace alphabet */
+
+#endif /* BAR_SYMBOL_H_ */
diff --git a/alib2data/src/alphabet/RankedSymbol.cpp b/alib2data/src/alphabet/RankedSymbol.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a5320a7408bd12c419c1389bd6d27c3c5512d96b
--- /dev/null
+++ b/alib2data/src/alphabet/RankedSymbol.cpp
@@ -0,0 +1,72 @@
+#include "RankedSymbol.h"
+
+namespace alphabet {
+
+RankedSymbol::RankedSymbol(int number, int rank) : label(label::labelFrom(number)), rank(rank) {
+
+}
+
+RankedSymbol::RankedSymbol(char character, int rank) : label(label::labelFrom(character)), rank(rank) {
+
+}
+
+RankedSymbol::RankedSymbol(const std::string& label, int rank) : label(label::labelFrom(label)), rank(rank) {
+
+}
+
+RankedSymbol::RankedSymbol(const label::Label& label, int rank) : label(label), rank(rank) {
+
+}
+
+RankedSymbol::RankedSymbol(label::Label&& label, int rank) : label(std::move(label)), rank(rank) {
+
+}
+
+SymbolBase* RankedSymbol::clone() const {
+	return new RankedSymbol(*this);
+}
+
+SymbolBase* RankedSymbol::plunder() && {
+	return new RankedSymbol(std::move(*this));
+}
+
+const label::Label& RankedSymbol::getLabel() const {
+	return label;
+}
+
+int RankedSymbol::getRank() const {
+	return rank;
+}
+
+bool RankedSymbol::operator <(const ObjectBase& other) const {
+	return other > *this;
+}
+
+bool RankedSymbol::operator ==(const ObjectBase& other) const {
+	return other == *this;
+}
+
+bool RankedSymbol::operator >(const ObjectBase& other) const {
+	return other < *this;
+}
+
+bool RankedSymbol::operator ==(const RankedSymbol& other) const {
+	return this->label == other.label && this -> rank == other.rank;
+}
+
+bool RankedSymbol::operator <(const RankedSymbol& other) const {
+	if (this->label < other.label) return true;
+	else if (this -> label == other.label) return this -> rank < other.rank;
+	else return false;
+}
+
+void RankedSymbol::operator>>(std::ostream& out) const {
+	out << "(RankedSymbol " << this->label << " #" << rank << ")";
+}
+
+RankedSymbol::operator std::string () const {
+	return (std::string) label + "_" + std::to_string(rank);
+}
+
+} /* namespace alphabet */
+
diff --git a/alib2data/src/alphabet/RankedSymbol.h b/alib2data/src/alphabet/RankedSymbol.h
new file mode 100644
index 0000000000000000000000000000000000000000..bda49d7815fa323d1b12636f00142cd3d98d0512
--- /dev/null
+++ b/alib2data/src/alphabet/RankedSymbol.h
@@ -0,0 +1,62 @@
+#ifndef RANKED_SYMBOL_H_
+#define RANKED_SYMBOL_H_
+
+#include "../label/Label.h"
+#include "SymbolBase.h"
+#include <ostream>
+
+namespace alphabet {
+
+/**
+ * Represents symbol in an alphabet.
+ */
+class RankedSymbol : public std::acceptor<RankedSymbol, VisitableSymbolBase, std::acceptor<RankedSymbol, alib::VisitableObjectBase, SymbolBase> > {
+protected:
+	label::Label label;
+	int rank;
+	
+public:
+	explicit RankedSymbol(int number, int rank);
+	explicit RankedSymbol(char character, int rank);
+	explicit RankedSymbol(const std::string& label, int rank);
+
+	/**
+	 * Creates new symbol with given name and rank.
+	 * @param symbol name of the symbol
+	 * @param rank of the symbol
+	 */
+	explicit RankedSymbol(const label::Label& label, int rank);
+	explicit RankedSymbol(label::Label&& label, int rank);
+
+	virtual SymbolBase* clone() const;
+	virtual SymbolBase* plunder() &&;
+
+	/**
+	 * @return name of the symbol
+	 */
+	const label::Label& getLabel() const;
+
+	/**
+	 * @return rank of the symbol
+	 */
+	int getRank() const;
+
+	virtual bool operator <(const alib::ObjectBase& other) const;
+	virtual bool operator ==(const alib::ObjectBase& other) const;
+	virtual bool operator >(const alib::ObjectBase& other) const;
+
+	virtual bool operator ==(const RankedSymbol& other) const;
+	virtual bool operator <(const RankedSymbol& other) const;
+
+	virtual void operator>>(std::ostream& out) const;
+
+	virtual operator std::string () const;
+
+	virtual int selfTypeId() const {
+		return typeId<RankedSymbol>();
+	}
+};
+
+} /* namespace alphabet */
+
+#endif /* RANKED_SYMBOL_H_ */
diff --git a/alib2data/src/alphabet/SymbolBase.h b/alib2data/src/alphabet/SymbolBase.h
index 18027e6451d69f9f2e1fcfb60010a0aee86982a4..de06282c45f04dfe15790e3a5a74b9f89e707139 100644
--- a/alib2data/src/alphabet/SymbolBase.h
+++ b/alib2data/src/alphabet/SymbolBase.h
@@ -16,7 +16,7 @@ namespace alphabet {
 class SymbolBase;
 
 typedef std::acceptor_base<SymbolBase,
-			LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol
+			LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, RankedSymbol, BarSymbol
 	> VisitableSymbolBase;
 
 /**
diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.cpp b/alib2data/src/alphabet/SymbolFromXMLParser.cpp
index aae1577e6381888fe70b20bd4fc126a59e7618a8..a2769e28962d5d591fccfcb4a1e5959e8e0c2e9d 100644
--- a/alib2data/src/alphabet/SymbolFromXMLParser.cpp
+++ b/alib2data/src/alphabet/SymbolFromXMLParser.cpp
@@ -37,7 +37,7 @@ Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std:
 }
 
 bool SymbolFromXMLParser::first(std::list<sax::Token>& input) const {
-	if(isToken(input, sax::Token::TokenType::START_ELEMENT, "LabeledSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "BlankSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "BottomOfTheStackSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "EndSymbol")) {
+	if(isToken(input, sax::Token::TokenType::START_ELEMENT, "LabeledSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "BlankSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "BottomOfTheStackSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "EndSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "RankedSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "BarSymbol")) {
 		return true;
 	} else {
 		return false;
@@ -69,4 +69,18 @@ EndSymbol SymbolFromXMLParser::parseEndSymbol(std::list<sax::Token>& input) cons
 	return EndSymbol();
 }
 
+RankedSymbol SymbolFromXMLParser::parseRankedSymbol(std::list<sax::Token>& input) const {
+	popToken(input, sax::Token::TokenType::START_ELEMENT, "RankedSymbol");
+	label::Label data = alib::api<label::Label>::parse(input);
+	int rank = std::stoi(popTokenData(input, sax::Token::TokenType::CHARACTER));
+	popToken(input, sax::Token::TokenType::END_ELEMENT, "RankedSymbol");
+	return RankedSymbol(data, rank);
+}
+
+BarSymbol SymbolFromXMLParser::parseBarSymbol(std::list<sax::Token>& input) const {
+	popToken(input, sax::Token::TokenType::START_ELEMENT, "BarSymbol");
+	popToken(input, sax::Token::TokenType::END_ELEMENT, "BarSymbol");
+	return BarSymbol();
+}
+
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.h b/alib2data/src/alphabet/SymbolFromXMLParser.h
index 2dafe3a60460de877c58e6f56ae24b1d2c42bb1a..add3c29373423542bf9c33f6dd3adf412d2efbf5 100644
--- a/alib2data/src/alphabet/SymbolFromXMLParser.h
+++ b/alib2data/src/alphabet/SymbolFromXMLParser.h
@@ -20,6 +20,8 @@
 #include "BottomOfTheStackSymbol.h"
 #include "EndSymbol.h"
 #include "LabeledSymbol.h"
+#include "RankedSymbol.h"
+#include "BarSymbol.h"
 
 namespace alib {
 
@@ -41,6 +43,8 @@ class SymbolFromXMLParser : public sax::FromXMLParserHelper {
 	BlankSymbol parseBlankSymbol(std::list<sax::Token>& input) const;
 	BottomOfTheStackSymbol parseBottomOfTheStackSymbol(std::list<sax::Token>& input) const;
 	EndSymbol parseEndSymbol(std::list<sax::Token>& input) const;
+	RankedSymbol parseRankedSymbol(std::list<sax::Token>& input) const;
+	BarSymbol parseBarSymbol(std::list<sax::Token>& input) const;
 
 	template<typename T> friend class alib::api;
 public:
diff --git a/alib2data/src/alphabet/SymbolToStringComposer.cpp b/alib2data/src/alphabet/SymbolToStringComposer.cpp
index eacdda14b0b68ac4b6f03a4a71fdba8c99d552d8..3b365ce9a6180dfe15b3e242f84de6b031d667cb 100644
--- a/alib2data/src/alphabet/SymbolToStringComposer.cpp
+++ b/alib2data/src/alphabet/SymbolToStringComposer.cpp
@@ -9,6 +9,7 @@
 #include "../label/LabelToStringComposer.h"
 #include <algorithm>
 #include "LabeledSymbol.h"
+#include "RankedSymbol.h"
 
 namespace alphabet {
 
@@ -37,6 +38,20 @@ void SymbolToStringComposer::Visit(void* userData, const EndSymbol&) {
 	out << "#E";
 }
 
+void SymbolToStringComposer::Visit(void* userData, const RankedSymbol& symbol) {
+	std::stringstream &out = *((std::stringstream*) userData);
+
+	label::LabelToStringComposer composer;
+	out << composer.compose(symbol.getLabel());
+	out << std::to_string(symbol.getRank());
+}
+
+void SymbolToStringComposer::Visit(void* userData, const BarSymbol&) {
+	std::stringstream &out = *((std::stringstream*) userData);
+
+	out << "#|";
+}
+
 std::string SymbolToStringComposer::compose(const Symbol& symbol) {
 	std::stringstream out;
 	symbol.getData().Accept((void*) &out, *this);
diff --git a/alib2data/src/alphabet/SymbolToStringComposer.h b/alib2data/src/alphabet/SymbolToStringComposer.h
index 66b1db2b5751d4ed888d8741456182d3e0e0343f..8d00e6c4ab7fdfb04da40a7cece61cd12471a4c8 100644
--- a/alib2data/src/alphabet/SymbolToStringComposer.h
+++ b/alib2data/src/alphabet/SymbolToStringComposer.h
@@ -23,6 +23,8 @@ class SymbolToStringComposer : public VisitableSymbolBase::visitor_type {
 	void Visit(void*, const BlankSymbol& symbol);
 	void Visit(void*, const BottomOfTheStackSymbol& symbol);
 	void Visit(void*, const EndSymbol& symbol);
+	void Visit(void*, const RankedSymbol& symbol);
+	void Visit(void*, const BarSymbol& symbol);
 
 public:
 	/**
diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.cpp b/alib2data/src/alphabet/SymbolToXMLComposer.cpp
index 76f674fb8e966274f4d4295f3725433e0168d1a1..d3a4e07231beb549e2c4c8a1c06c3bbf9d00063e 100644
--- a/alib2data/src/alphabet/SymbolToXMLComposer.cpp
+++ b/alib2data/src/alphabet/SymbolToXMLComposer.cpp
@@ -52,4 +52,20 @@ std::list<sax::Token> SymbolToXMLComposer::compose(const EndSymbol&) const {
 	return out;
 }
 
+std::list<sax::Token> SymbolToXMLComposer::compose(const RankedSymbol& symbol) const {
+	std::list<sax::Token> out;
+	out.push_back(sax::Token("RankedSymbol", sax::Token::TokenType::START_ELEMENT));
+	out.splice(out.end(), alib::api<label::Label>::compose(symbol.getLabel()));
+	out.push_back(sax::Token(std::to_string(symbol.getRank()), sax::Token::TokenType::CHARACTER));
+	out.push_back(sax::Token("RankedSymbol", sax::Token::TokenType::END_ELEMENT));
+	return out;
+}
+
+std::list<sax::Token> SymbolToXMLComposer::compose(const BarSymbol&) const {
+	std::list<sax::Token> out;
+	out.push_back(sax::Token("BarSymbol", sax::Token::TokenType::START_ELEMENT));
+	out.push_back(sax::Token("BarSymbol", sax::Token::TokenType::END_ELEMENT));
+	return out;
+}
+
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.h b/alib2data/src/alphabet/SymbolToXMLComposer.h
index dff6166b3bfc3ed3cdc78b044fddb6cbd8ec22ce..664340592e97a2d64f9208ce46eed38f802f16fb 100644
--- a/alib2data/src/alphabet/SymbolToXMLComposer.h
+++ b/alib2data/src/alphabet/SymbolToXMLComposer.h
@@ -44,6 +44,8 @@ class SymbolToXMLComposer {
 	std::list<sax::Token> compose(const BlankSymbol& symbol) const;
 	std::list<sax::Token> compose(const BottomOfTheStackSymbol& symbol) const;
 	std::list<sax::Token> compose(const EndSymbol& symbol) const;
+	std::list<sax::Token> compose(const RankedSymbol& symbol) const;
+	std::list<sax::Token> compose(const BarSymbol& symbol) const;
 
 	template<typename T> friend class alib::api;
 };
diff --git a/alib2data/src/object/ObjectBase.h b/alib2data/src/object/ObjectBase.h
index 0a99bd83e8ccc3a30a4869c895e515ecb6749650..17b35d24574a31ee1dcada6d79beefdabcd0ccca 100644
--- a/alib2data/src/object/ObjectBase.h
+++ b/alib2data/src/object/ObjectBase.h
@@ -93,6 +93,8 @@ class LabeledSymbol;
 class BlankSymbol;
 class BottomOfTheStackSymbol;
 class EndSymbol;
+class RankedSymbol;
+class BarSymbol;
 
 }
 
@@ -125,7 +127,7 @@ typedef std::acceptor_base<ObjectBase,
 			label::PrimitiveLabel, label::HexavigesimalLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel,
 			regexp::UnboundedRegExp, regexp::FormalRegExp,
 			string::Epsilon, string::LinearString, string::CyclicString,
-			alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol,
+			alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol,
 			container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap,
 			primitive::String, primitive::Integer, primitive::Character
 	> VisitableObjectBase;
@@ -140,7 +142,7 @@ class ObjectBase :
 			label::PrimitiveLabel, label::HexavigesimalLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel,
 			regexp::UnboundedRegExp, regexp::FormalRegExp,
 			string::Epsilon, string::LinearString, string::CyclicString,
-			alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol,
+			alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol,
 			container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap,
 			primitive::String, primitive::Integer, primitive::Character
 	>, public VisitableObjectBase {