From 6d18c231007034967bdbf1e9c5900456bfcebb82 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Mon, 20 Oct 2014 14:27:58 +0200 Subject: [PATCH] implementation of RankedSymbol and BarSymbol --- alib2data/src/Api.cpp | 24 +++++++ alib2data/src/Api.hpp | 14 ++++ alib2data/src/alphabet/BarSymbol.cpp | 47 ++++++++++++ alib2data/src/alphabet/BarSymbol.h | 42 +++++++++++ alib2data/src/alphabet/RankedSymbol.cpp | 72 +++++++++++++++++++ alib2data/src/alphabet/RankedSymbol.h | 62 ++++++++++++++++ alib2data/src/alphabet/SymbolBase.h | 2 +- .../src/alphabet/SymbolFromXMLParser.cpp | 16 ++++- alib2data/src/alphabet/SymbolFromXMLParser.h | 4 ++ .../src/alphabet/SymbolToStringComposer.cpp | 15 ++++ .../src/alphabet/SymbolToStringComposer.h | 2 + .../src/alphabet/SymbolToXMLComposer.cpp | 16 +++++ alib2data/src/alphabet/SymbolToXMLComposer.h | 2 + alib2data/src/object/ObjectBase.h | 6 +- 14 files changed, 320 insertions(+), 4 deletions(-) create mode 100644 alib2data/src/alphabet/BarSymbol.cpp create mode 100644 alib2data/src/alphabet/BarSymbol.h create mode 100644 alib2data/src/alphabet/RankedSymbol.cpp create mode 100644 alib2data/src/alphabet/RankedSymbol.h diff --git a/alib2data/src/Api.cpp b/alib2data/src/Api.cpp index 1a7dba0475..9935a06342 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 36881e004e..7d5b11d276 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 0000000000..e147bc3c3d --- /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 0000000000..a6512759d8 --- /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 0000000000..a5320a7408 --- /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 0000000000..bda49d7815 --- /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 18027e6451..de06282c45 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 aae1577e63..a2769e2896 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 2dafe3a604..add3c29373 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 eacdda14b0..3b365ce9a6 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 66b1db2b57..8d00e6c4ab 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 76f674fb8e..d3a4e07231 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 dff6166b3b..664340592e 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 0a99bd83e8..17b35d2457 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 { -- GitLab