From 994e3f7a01a28fee21ae2d86dc4e86c8346e9164 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Thu, 30 Oct 2014 13:34:01 +0100 Subject: [PATCH] implementation of RankedBarSymbol --- alib2data/src/Api.cpp | 12 +++++ alib2data/src/Api.hpp | 7 +++ alib2data/src/alphabet/RankedBarSymbol.cpp | 53 +++++++++++++++++++ alib2data/src/alphabet/RankedBarSymbol.h | 48 +++++++++++++++++ alib2data/src/alphabet/SymbolBase.h | 2 +- alib2data/src/alphabet/SymbolFeatures.h | 3 +- .../src/alphabet/SymbolFromXMLParser.cpp | 16 ++++-- alib2data/src/alphabet/SymbolFromXMLParser.h | 2 + .../src/alphabet/SymbolToStringComposer.cpp | 9 ++++ .../src/alphabet/SymbolToStringComposer.h | 1 + .../src/alphabet/SymbolToXMLComposer.cpp | 8 +++ alib2data/src/alphabet/SymbolToXMLComposer.h | 1 + alib2data/src/object/ObjectBase.h | 5 +- 13 files changed, 160 insertions(+), 7 deletions(-) create mode 100644 alib2data/src/alphabet/RankedBarSymbol.cpp create mode 100644 alib2data/src/alphabet/RankedBarSymbol.h diff --git a/alib2data/src/Api.cpp b/alib2data/src/Api.cpp index 11eacfe239..6d9d2525ac 100644 --- a/alib2data/src/Api.cpp +++ b/alib2data/src/Api.cpp @@ -153,6 +153,14 @@ std::list<sax::Token> api<alphabet::BarSymbol>::compose(const alphabet::BarSymbo return ToXMLComposers::symbolComposer.compose(data); } +alphabet::RankedBarSymbol api<alphabet::RankedBarSymbol>::parse(std::list<sax::Token>& input) { + return FromXMLParsers::symbolParser.parseRankedBarSymbol(input); +} + +std::list<sax::Token> api<alphabet::RankedBarSymbol>::compose(const alphabet::RankedBarSymbol& data) { + return ToXMLComposers::symbolComposer.compose(data); +} + automaton::Automaton api<automaton::Automaton>::parse(std::list<sax::Token>& input) { return FromXMLParsers::automatonParser.parseAutomaton(input); @@ -635,6 +643,10 @@ 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::RankedBarSymbol& symbol) const { + *((std::list<sax::Token>*) data) = std::move(api<alphabet::RankedBarSymbol>::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 2a0e0acc79..0970cdfe69 100644 --- a/alib2data/src/Api.hpp +++ b/alib2data/src/Api.hpp @@ -150,6 +150,12 @@ struct api<alphabet::BarSymbol> { static std::list<sax::Token> compose(const alphabet::BarSymbol& data); }; +template<> +struct api<alphabet::RankedBarSymbol> { + static alphabet::RankedBarSymbol parse(std::list<sax::Token>& input); + static std::list<sax::Token> compose(const alphabet::RankedBarSymbol& data); +}; + template<> struct api<automaton::Automaton> { static automaton::Automaton parse(std::list<sax::Token>& input); @@ -522,6 +528,7 @@ class ToXMLComposers : public VisitableObjectBase::const_visitor_type { 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 alphabet::RankedBarSymbol& symbol) const; void Visit(void*, const automaton::EpsilonNFA& automaton) const; void Visit(void*, const automaton::MultiInitialStateNFA& automaton) const; diff --git a/alib2data/src/alphabet/RankedBarSymbol.cpp b/alib2data/src/alphabet/RankedBarSymbol.cpp new file mode 100644 index 0000000000..2ceef4f6be --- /dev/null +++ b/alib2data/src/alphabet/RankedBarSymbol.cpp @@ -0,0 +1,53 @@ +#include "RankedBarSymbol.h" + +namespace alphabet { + +RankedBarSymbol::RankedBarSymbol(int rank) : rank(primitive::Integer(rank)) { + +} + +RankedBarSymbol::RankedBarSymbol(const primitive::Integer& rank) : rank(rank) { + +} + +SymbolBase* RankedBarSymbol::clone() const { + return new RankedBarSymbol(*this); +} + +SymbolBase* RankedBarSymbol::plunder() && { + return new RankedBarSymbol(std::move(*this)); +} + +const primitive::Integer& RankedBarSymbol::getRank() const { + return rank; +} + +bool RankedBarSymbol::operator <(const ObjectBase& other) const { + return other > *this; +} + +bool RankedBarSymbol::operator ==(const ObjectBase& other) const { + return other == *this; +} + +bool RankedBarSymbol::operator >(const ObjectBase& other) const { + return other < *this; +} + +bool RankedBarSymbol::operator ==(const RankedBarSymbol&) const { + return true; +} + +bool RankedBarSymbol::operator <(const RankedBarSymbol&) const { + return false; +} + +void RankedBarSymbol::operator>>(std::ostream& out) const { + out << "(RankedBar symbol)"; +} + +RankedBarSymbol::operator std::string () const { + return "|"; +} + +} /* namespace alphabet */ diff --git a/alib2data/src/alphabet/RankedBarSymbol.h b/alib2data/src/alphabet/RankedBarSymbol.h new file mode 100644 index 0000000000..10a520f8e8 --- /dev/null +++ b/alib2data/src/alphabet/RankedBarSymbol.h @@ -0,0 +1,48 @@ +#ifndef RANKED_BAR_SYMBOL_H_ +#define RANKED_BAR_SYMBOL_H_ + +#include "Symbol.h" +#include "../primitive/Integer.h" + +namespace alphabet { + +/** + * Represents rankedBar symbol for tree linearization. + */ +class RankedBarSymbol : public std::acceptor<RankedBarSymbol, VisitableSymbolBase, std::acceptor<RankedBarSymbol, alib::VisitableObjectBase, SymbolBase> > { + primitive::Integer rank; +public: + /** + * Creates a rankedBar symbol. + * @param symbol name of the symbol + */ + explicit RankedBarSymbol(int rank); + explicit RankedBarSymbol(const primitive::Integer& rank); + + virtual SymbolBase* clone() const; + virtual SymbolBase* plunder() &&; + + /** + * @return rank of the symbol + */ + const primitive::Integer& 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 RankedBarSymbol& other) const; + virtual bool operator <(const RankedBarSymbol& other) const; + + virtual void operator>>(std::ostream& out) const; + + virtual operator std::string () const; + + virtual int selfTypeId() const { + return typeId<RankedBarSymbol>(); + } +}; + +} /* namespace alphabet */ + +#endif /* RANKED_BAR_SYMBOL_H_ */ diff --git a/alib2data/src/alphabet/SymbolBase.h b/alib2data/src/alphabet/SymbolBase.h index de06282c45..9450d51d84 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, RankedSymbol, BarSymbol + LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, RankedSymbol, BarSymbol, RankedBarSymbol > VisitableSymbolBase; /** diff --git a/alib2data/src/alphabet/SymbolFeatures.h b/alib2data/src/alphabet/SymbolFeatures.h index 23d2f2c799..f9a22e1ace 100644 --- a/alib2data/src/alphabet/SymbolFeatures.h +++ b/alib2data/src/alphabet/SymbolFeatures.h @@ -16,7 +16,8 @@ enum class FEATURES { BOTTOM, END, RANKED, - BAR + BAR, + RANKED_BAR }; } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.cpp b/alib2data/src/alphabet/SymbolFromXMLParser.cpp index 408d7b1002..9caeddef5d 100644 --- a/alib2data/src/alphabet/SymbolFromXMLParser.cpp +++ b/alib2data/src/alphabet/SymbolFromXMLParser.cpp @@ -15,7 +15,7 @@ namespace alphabet { Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input) const { - return parseSymbol(input, std::set<FEATURES>({FEATURES::LABELED, FEATURES::BLANK, FEATURES::BOTTOM, FEATURES::END, FEATURES::RANKED, FEATURES::BAR})); + return parseSymbol(input, std::set<FEATURES>({FEATURES::LABELED, FEATURES::BLANK, FEATURES::BOTTOM, FEATURES::END, FEATURES::RANKED, FEATURES::BAR, FEATURES::RANKED_BAR})); } Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std::set<FEATURES>& features) const { @@ -37,13 +37,16 @@ Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std: } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "BarSymbol")) { if(!features.count(FEATURES::BAR)) throw exception::AlibException(); return Symbol(parseBarSymbol(input)); + } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "RankedBarSymbol")) { + if(!features.count(FEATURES::RANKED_BAR)) throw exception::AlibException(); + return Symbol(parseRankedBarSymbol(input)); } else { - throw sax::ParserException(sax::Token("LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol", sax::Token::TokenType::START_ELEMENT), input.front()); + throw sax::ParserException(sax::Token("LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, RankedSymbol, BarSymbol, RankedBarSymbol", sax::Token::TokenType::START_ELEMENT), input.front()); } } 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") || isToken(input, sax::Token::TokenType::START_ELEMENT, "RankedSymbol") || isToken(input, sax::Token::TokenType::START_ELEMENT, "BarSymbol")) { + 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") || isToken(input, sax::Token::TokenType::START_ELEMENT, "RankedBarSymbol")) { return true; } else { return false; @@ -89,4 +92,11 @@ BarSymbol SymbolFromXMLParser::parseBarSymbol(std::list<sax::Token>& input) cons return BarSymbol(); } +RankedBarSymbol SymbolFromXMLParser::parseRankedBarSymbol(std::list<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, "RankedBarSymbol"); + primitive::Integer rank = alib::api<primitive::Integer>::parse(input); + popToken(input, sax::Token::TokenType::END_ELEMENT, "RankedBarSymbol"); + return RankedBarSymbol(rank); +} + } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.h b/alib2data/src/alphabet/SymbolFromXMLParser.h index add3c29373..c7ac2648b2 100644 --- a/alib2data/src/alphabet/SymbolFromXMLParser.h +++ b/alib2data/src/alphabet/SymbolFromXMLParser.h @@ -22,6 +22,7 @@ #include "LabeledSymbol.h" #include "RankedSymbol.h" #include "BarSymbol.h" +#include "RankedBarSymbol.h" namespace alib { @@ -45,6 +46,7 @@ class SymbolFromXMLParser : public sax::FromXMLParserHelper { EndSymbol parseEndSymbol(std::list<sax::Token>& input) const; RankedSymbol parseRankedSymbol(std::list<sax::Token>& input) const; BarSymbol parseBarSymbol(std::list<sax::Token>& input) const; + RankedBarSymbol parseRankedBarSymbol(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 651e4a3e53..3f8b61b498 100644 --- a/alib2data/src/alphabet/SymbolToStringComposer.cpp +++ b/alib2data/src/alphabet/SymbolToStringComposer.cpp @@ -11,6 +11,7 @@ #include <algorithm> #include "LabeledSymbol.h" #include "RankedSymbol.h" +#include "RankedBarSymbol.h" namespace alphabet { @@ -54,6 +55,14 @@ void SymbolToStringComposer::Visit(void* userData, const BarSymbol&) { out << "#|"; } +void SymbolToStringComposer::Visit(void* userData, const RankedBarSymbol& symbol) { + std::stringstream &out = *((std::stringstream*) userData); + + out << "#|"; + primitive::PrimitiveToStringComposer composer2; + out << composer2.compose(primitive::Primitive(symbol.getRank())); +} + 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 8d00e6c4ab..52080a3c13 100644 --- a/alib2data/src/alphabet/SymbolToStringComposer.h +++ b/alib2data/src/alphabet/SymbolToStringComposer.h @@ -25,6 +25,7 @@ class SymbolToStringComposer : public VisitableSymbolBase::visitor_type { void Visit(void*, const EndSymbol& symbol); void Visit(void*, const RankedSymbol& symbol); void Visit(void*, const BarSymbol& symbol); + void Visit(void*, const RankedBarSymbol& symbol); public: /** diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.cpp b/alib2data/src/alphabet/SymbolToXMLComposer.cpp index 263155c543..6012d948bf 100644 --- a/alib2data/src/alphabet/SymbolToXMLComposer.cpp +++ b/alib2data/src/alphabet/SymbolToXMLComposer.cpp @@ -68,4 +68,12 @@ std::list<sax::Token> SymbolToXMLComposer::compose(const BarSymbol&) const { return out; } +std::list<sax::Token> SymbolToXMLComposer::compose(const RankedBarSymbol& symbol) const { + std::list<sax::Token> out; + out.push_back(sax::Token("RankedBarSymbol", sax::Token::TokenType::START_ELEMENT)); + out.splice(out.end(), alib::api<primitive::Integer>::compose(symbol.getRank())); + out.push_back(sax::Token("RankedBarSymbol", sax::Token::TokenType::END_ELEMENT)); + return out; +} + } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.h b/alib2data/src/alphabet/SymbolToXMLComposer.h index 664340592e..cf2c837c08 100644 --- a/alib2data/src/alphabet/SymbolToXMLComposer.h +++ b/alib2data/src/alphabet/SymbolToXMLComposer.h @@ -46,6 +46,7 @@ class SymbolToXMLComposer { 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; + std::list<sax::Token> compose(const RankedBarSymbol& symbol) const; template<typename T> friend class alib::api; }; diff --git a/alib2data/src/object/ObjectBase.h b/alib2data/src/object/ObjectBase.h index 17b35d2457..b4115da1c8 100644 --- a/alib2data/src/object/ObjectBase.h +++ b/alib2data/src/object/ObjectBase.h @@ -95,6 +95,7 @@ class BottomOfTheStackSymbol; class EndSymbol; class RankedSymbol; class BarSymbol; +class RankedBarSymbol; } @@ -127,7 +128,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::RankedSymbol, alphabet::BarSymbol, + alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol, container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap, primitive::String, primitive::Integer, primitive::Character > VisitableObjectBase; @@ -142,7 +143,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::RankedSymbol, alphabet::BarSymbol, + alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol, container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap, primitive::String, primitive::Integer, primitive::Character >, public VisitableObjectBase { -- GitLab