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 {