From 173fbcadd4d78c0df431e01264ca74e353c16c99 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Sat, 27 Sep 2014 16:07:39 +0200 Subject: [PATCH] add ObjectLabel -- wrapper of anything as Label --- alib2data/src/Api.cpp | 12 ++++ alib2data/src/Api.hpp | 7 +++ alib2data/src/label/LabelBase.h | 2 +- alib2data/src/label/LabelFeatures.h | 1 + alib2data/src/label/LabelFromStringParser.cpp | 3 +- alib2data/src/label/LabelFromXMLParser.cpp | 17 +++++- alib2data/src/label/LabelFromXMLParser.h | 2 + alib2data/src/label/LabelToStringComposer.cpp | 6 ++ alib2data/src/label/LabelToStringComposer.h | 1 + alib2data/src/label/LabelToXMLComposer.cpp | 11 +++- alib2data/src/label/LabelToXMLComposer.h | 1 + alib2data/src/label/NextLabel.cpp | 4 ++ alib2data/src/label/NextLabel.h | 1 + alib2data/src/label/ObjectLabel.cpp | 57 +++++++++++++++++ alib2data/src/label/ObjectLabel.h | 61 +++++++++++++++++++ alib2data/src/object/ObjectBase.h | 5 +- 16 files changed, 181 insertions(+), 10 deletions(-) create mode 100644 alib2data/src/label/ObjectLabel.cpp create mode 100644 alib2data/src/label/ObjectLabel.h diff --git a/alib2data/src/Api.cpp b/alib2data/src/Api.cpp index 39901ba263..2234b408bd 100644 --- a/alib2data/src/Api.cpp +++ b/alib2data/src/Api.cpp @@ -404,6 +404,14 @@ std::list<sax::Token> api<label::CharacterLabel>::compose(const label::Character return ToXMLComposers::labelComposer.compose(data); } +label::ObjectLabel api<label::ObjectLabel>::parse(std::list<sax::Token>& input) { + return FromXMLParsers::labelParser.parseObjectLabel(input); +} + +std::list<sax::Token> api<label::ObjectLabel>::compose(const label::ObjectLabel& data) { + return ToXMLComposers::labelComposer.compose(data); +} + label::LabelSetLabel api<label::LabelSetLabel>::parse(std::list<sax::Token>& input) { return FromXMLParsers::labelParser.parseLabelSetLabel(input); } @@ -668,6 +676,10 @@ void ToXMLComposers::Visit(void* data, const label::CharacterLabel& label) const *((std::list<sax::Token>*) data) = std::move(api<label::CharacterLabel>::compose(label)); } +void ToXMLComposers::Visit(void* data, const label::ObjectLabel& label) const { + *((std::list<sax::Token>*) data) = std::move(api<label::ObjectLabel>::compose(label)); +} + void ToXMLComposers::Visit(void* data, const label::LabelSetLabel& label) const { *((std::list<sax::Token>*) data) = std::move(api<label::LabelSetLabel>::compose(label)); } diff --git a/alib2data/src/Api.hpp b/alib2data/src/Api.hpp index fd58922caa..1207d0cabb 100644 --- a/alib2data/src/Api.hpp +++ b/alib2data/src/Api.hpp @@ -338,6 +338,12 @@ struct api<label::CharacterLabel> { static std::list<sax::Token> compose(const label::CharacterLabel& data); }; +template<> +struct api<label::ObjectLabel> { + static label::ObjectLabel parse(std::list<sax::Token>& input); + static std::list<sax::Token> compose(const label::ObjectLabel& data); +}; + template<> struct api<label::LabelSetLabel> { static label::LabelSetLabel parse(std::list<sax::Token>& input); @@ -493,6 +499,7 @@ class ToXMLComposers : public VisitableObjectBase::const_visitor_type { void Visit(void*, const label::StringLabel& label) const; void Visit(void*, const label::IntegerLabel& label) const; void Visit(void*, const label::CharacterLabel& label) const; + void Visit(void*, const label::ObjectLabel& label) const; void Visit(void*, const label::LabelSetLabel& label) const; void Visit(void*, const label::LabelPairLabel& label) const; diff --git a/alib2data/src/label/LabelBase.h b/alib2data/src/label/LabelBase.h index 708a41f71d..6ac8e84349 100644 --- a/alib2data/src/label/LabelBase.h +++ b/alib2data/src/label/LabelBase.h @@ -14,7 +14,7 @@ namespace label { typedef std::acceptor_base< - label::StringLabel, label::IntegerLabel, label::CharacterLabel, label::LabelSetLabel, label::LabelPairLabel + label::StringLabel, label::IntegerLabel, label::CharacterLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel > VisitableLabelBase; /** diff --git a/alib2data/src/label/LabelFeatures.h b/alib2data/src/label/LabelFeatures.h index 0e9ddc62c0..b6e49feaad 100644 --- a/alib2data/src/label/LabelFeatures.h +++ b/alib2data/src/label/LabelFeatures.h @@ -14,6 +14,7 @@ enum class FEATURES { STRING, CHAR, INTEGER, + OBJECT, LABEL_SET, LABEL_PAIR }; diff --git a/alib2data/src/label/LabelFromStringParser.cpp b/alib2data/src/label/LabelFromStringParser.cpp index bd74f08cb7..41475b38cd 100644 --- a/alib2data/src/label/LabelFromStringParser.cpp +++ b/alib2data/src/label/LabelFromStringParser.cpp @@ -10,6 +10,7 @@ #include "StringLabel.h" #include "IntegerLabel.h" #include "CharacterLabel.h" +#include "ObjectLabel.h" #include "LabelSetLabel.h" #include "LabelPairLabel.h" #include <algorithm> @@ -21,7 +22,7 @@ LabelFromStringParser::LabelFromStringParser(std::istream& input) : m_Lexer(inpu } Label LabelFromStringParser::parse() { - return parse(std::set<FEATURES>({FEATURES::STRING, FEATURES::CHAR, FEATURES::INTEGER, FEATURES::LABEL_SET, FEATURES::LABEL_PAIR})); + return parse(std::set<FEATURES>({FEATURES::STRING, FEATURES::CHAR, FEATURES::INTEGER, FEATURES::OBJECT, FEATURES::LABEL_SET, FEATURES::LABEL_PAIR})); } Label LabelFromStringParser::parse(const std::set<FEATURES>& features) { diff --git a/alib2data/src/label/LabelFromXMLParser.cpp b/alib2data/src/label/LabelFromXMLParser.cpp index e17fd7453a..dc18f1e036 100644 --- a/alib2data/src/label/LabelFromXMLParser.cpp +++ b/alib2data/src/label/LabelFromXMLParser.cpp @@ -7,12 +7,13 @@ #include "LabelFromXMLParser.h" #include "../sax/ParserException.h" +#include "../Api.hpp" #include <algorithm> namespace label { Label LabelFromXMLParser::parseLabel(std::list<sax::Token>& input) const { - return parseLabel(input, std::set<FEATURES>({FEATURES::STRING, FEATURES::CHAR, FEATURES::INTEGER, FEATURES::LABEL_SET, FEATURES::LABEL_PAIR})); + return parseLabel(input, std::set<FEATURES>({FEATURES::STRING, FEATURES::CHAR, FEATURES::INTEGER, FEATURES::OBJECT, FEATURES::LABEL_SET, FEATURES::LABEL_PAIR})); } Label LabelFromXMLParser::parseLabel(std::list<sax::Token>& input, const std::set<FEATURES>& features) const { @@ -25,6 +26,9 @@ Label LabelFromXMLParser::parseLabel(std::list<sax::Token>& input, const std::se } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "CharacterLabel")) { if(!features.count(FEATURES::CHAR)) throw exception::AlibException(); return Label(parseCharacterLabel(input)); + } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "ObjectLabel")) { + if(!features.count(FEATURES::OBJECT)) throw exception::AlibException(); + return Label(parseObjectLabel(input)); } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "LabelSetLabel")) { if(!features.count(FEATURES::LABEL_SET)) throw exception::AlibException(); return Label(parseLabelSetLabel(input)); @@ -32,12 +36,12 @@ Label LabelFromXMLParser::parseLabel(std::list<sax::Token>& input, const std::se if(!features.count(FEATURES::LABEL_PAIR)) throw exception::AlibException(); return Label(parseLabelPairLabel(input)); } else { - throw sax::ParserException(sax::Token("IntegerLabel, StringLabel, CharacterLabel, LabelSetLabel, LabelPairLabel", sax::Token::TokenType::START_ELEMENT), input.front()); + throw sax::ParserException(sax::Token("IntegerLabel, StringLabel, CharacterLabel, ObjectLabel, LabelSetLabel, LabelPairLabel", sax::Token::TokenType::START_ELEMENT), input.front()); } } bool LabelFromXMLParser::first(std::list<sax::Token>& input) const { - if(isToken(input, sax::Token::TokenType::START_ELEMENT, "IntegerLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "StringLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "CharacterLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "LabelSetLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "LabelPairLabel")) { + if(isToken(input, sax::Token::TokenType::START_ELEMENT, "IntegerLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "StringLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "CharacterLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "ObjectLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "LabelSetLabel") || isToken(input, sax::Token::TokenType::START_ELEMENT, "LabelPairLabel")) { return true; } else { return false; @@ -65,6 +69,13 @@ StringLabel LabelFromXMLParser::parseStringLabel(std::list<sax::Token>& input) c return data; } +ObjectLabel LabelFromXMLParser::parseObjectLabel(std::list<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, "ObjectLabel"); + ObjectLabel data(alib::api<alib::Object>::parse(input)); + popToken(input, sax::Token::TokenType::END_ELEMENT, "ObjectLabel"); + return data; +} + LabelSetLabel LabelFromXMLParser::parseLabelSetLabel(std::list<sax::Token>& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, "LabelSetLabel"); std::set<Label> labels; diff --git a/alib2data/src/label/LabelFromXMLParser.h b/alib2data/src/label/LabelFromXMLParser.h index 6aed29fc63..6452b69067 100644 --- a/alib2data/src/label/LabelFromXMLParser.h +++ b/alib2data/src/label/LabelFromXMLParser.h @@ -16,6 +16,7 @@ #include "StringLabel.h" #include "IntegerLabel.h" #include "CharacterLabel.h" +#include "ObjectLabel.h" #include "LabelSetLabel.h" #include "LabelPairLabel.h" #include "../sax/Token.h" @@ -39,6 +40,7 @@ class LabelFromXMLParser : public sax::FromXMLParserHelper { IntegerLabel parseIntegerLabel(std::list<sax::Token>& input) const; CharacterLabel parseCharacterLabel(std::list<sax::Token>& input) const; StringLabel parseStringLabel(std::list<sax::Token>& input) const; + ObjectLabel parseObjectLabel(std::list<sax::Token>& input) const; LabelSetLabel parseLabelSetLabel(std::list<sax::Token>& input) const; LabelPairLabel parseLabelPairLabel(std::list<sax::Token>& input) const; diff --git a/alib2data/src/label/LabelToStringComposer.cpp b/alib2data/src/label/LabelToStringComposer.cpp index 9023693bfa..97f8f7df93 100644 --- a/alib2data/src/label/LabelToStringComposer.cpp +++ b/alib2data/src/label/LabelToStringComposer.cpp @@ -13,6 +13,8 @@ #include "LabelSetLabel.h" #include "LabelPairLabel.h" +#include "../exception/AlibException.h" + namespace label { void LabelToStringComposer::Visit(void* userData, const label::StringLabel& label) { @@ -43,6 +45,10 @@ void LabelToStringComposer::Visit(void* userData, const IntegerLabel& label) { out << label.getData(); } +void LabelToStringComposer::Visit(void*, const ObjectLabel&) { + throw exception::AlibException("Unsupported type in conversion to string (ObjectLabel)"); +} + void LabelToStringComposer::Visit(void* userData, const LabelSetLabel& label) { std::stringstream &out = *((std::stringstream*) userData); diff --git a/alib2data/src/label/LabelToStringComposer.h b/alib2data/src/label/LabelToStringComposer.h index ea86b8e058..361289bdec 100644 --- a/alib2data/src/label/LabelToStringComposer.h +++ b/alib2data/src/label/LabelToStringComposer.h @@ -21,6 +21,7 @@ class LabelToStringComposer : public VisitableLabelBase::visitor_type { void Visit(void*, const IntegerLabel& label); void Visit(void*, const StringLabel& label); void Visit(void*, const CharacterLabel& label); + void Visit(void*, const ObjectLabel& label); void Visit(void*, const LabelSetLabel& label); void Visit(void*, const LabelPairLabel& label); public: diff --git a/alib2data/src/label/LabelToXMLComposer.cpp b/alib2data/src/label/LabelToXMLComposer.cpp index ba7131b9b4..7376275be3 100644 --- a/alib2data/src/label/LabelToXMLComposer.cpp +++ b/alib2data/src/label/LabelToXMLComposer.cpp @@ -6,9 +6,6 @@ */ #include "LabelToXMLComposer.h" -#include "IntegerLabel.h" -#include "StringLabel.h" -#include "CharacterLabel.h" #include "../std/itos.h" #include "../Api.hpp" @@ -51,6 +48,14 @@ std::list<sax::Token> LabelToXMLComposer::compose(const StringLabel& label) cons return out; } +std::list<sax::Token> LabelToXMLComposer::compose(const ObjectLabel& label) const { + std::list<sax::Token> out; + out.push_back(sax::Token("ObjectLabel", sax::Token::TokenType::START_ELEMENT)); + out.splice(out.end(), alib::api<alib::Object>::compose(label.getData())); + out.push_back(sax::Token("ObjectLabel", sax::Token::TokenType::END_ELEMENT)); + return out; +} + std::list<sax::Token> LabelToXMLComposer::compose(const LabelSetLabel& label) const { std::list<sax::Token> out; out.push_back(sax::Token("LabelSetLabel", sax::Token::TokenType::START_ELEMENT)); diff --git a/alib2data/src/label/LabelToXMLComposer.h b/alib2data/src/label/LabelToXMLComposer.h index 7259b30c4e..7a1b9f2b7c 100644 --- a/alib2data/src/label/LabelToXMLComposer.h +++ b/alib2data/src/label/LabelToXMLComposer.h @@ -42,6 +42,7 @@ class LabelToXMLComposer { std::list<sax::Token> compose(const StringLabel& label) const; std::list<sax::Token> compose(const IntegerLabel& label) const; std::list<sax::Token> compose(const CharacterLabel& label) const; + std::list<sax::Token> compose(const ObjectLabel& label) const; std::list<sax::Token> compose(const LabelSetLabel& label) const; std::list<sax::Token> compose(const LabelPairLabel& label) const; diff --git a/alib2data/src/label/NextLabel.cpp b/alib2data/src/label/NextLabel.cpp index 377ff424f3..ad56b2774c 100644 --- a/alib2data/src/label/NextLabel.cpp +++ b/alib2data/src/label/NextLabel.cpp @@ -32,6 +32,10 @@ void NextLabel::Visit(void* userData, const StringLabel& label) { out = new Label(StringLabel(label.getData() + '\'')); } +void NextLabel::Visit(void*, const ObjectLabel&) { + throw exception::AlibException("LabelSet has no next Label."); +} + void NextLabel::Visit(void*, const LabelSetLabel&) { throw exception::AlibException("LabelSet has no next Label."); } diff --git a/alib2data/src/label/NextLabel.h b/alib2data/src/label/NextLabel.h index 67a4fdc610..6e47e85164 100644 --- a/alib2data/src/label/NextLabel.h +++ b/alib2data/src/label/NextLabel.h @@ -21,6 +21,7 @@ class NextLabel : public VisitableLabelBase::visitor_type { void Visit(void*, const StringLabel& label); void Visit(void*, const IntegerLabel& label); void Visit(void*, const CharacterLabel& label); + void Visit(void*, const ObjectLabel& label); void Visit(void*, const LabelSetLabel& label); void Visit(void*, const LabelPairLabel& label); diff --git a/alib2data/src/label/ObjectLabel.cpp b/alib2data/src/label/ObjectLabel.cpp new file mode 100644 index 0000000000..a4dedcf4d4 --- /dev/null +++ b/alib2data/src/label/ObjectLabel.cpp @@ -0,0 +1,57 @@ +/* + * ObjectLabel.cpp + * + * Created on: Mar 26, 2013 + * Author:Jan Travnicek + */ + +#include "ObjectLabel.h" + +namespace label { + +ObjectLabel::ObjectLabel(const alib::Object& label) : label(label) { + +} + +LabelBase* ObjectLabel::clone() const { + return new ObjectLabel(*this); +} + +LabelBase* ObjectLabel::plunder() && { + return new ObjectLabel(std::move(*this)); +} + +const alib::Object& ObjectLabel::getData() const { + return label; +} + +bool ObjectLabel::operator <(const alib::ObjectBase& other) const { + return other > *this; +} + +bool ObjectLabel::operator ==(const alib::ObjectBase& other) const { + return other == *this; +} + +bool ObjectLabel::operator >(const alib::ObjectBase& other) const { + return other < *this; +} + +bool ObjectLabel::operator <(const ObjectLabel& other) const { + return label < other.label; +} + +bool ObjectLabel::operator ==(const ObjectLabel& other) const { + return label == other.label; +} + +void ObjectLabel::operator>>(std::ostream& out) const { + out << "(ObjectLabel " << label << ")"; +} + +ObjectLabel::operator std::string() const { + return (std::string) label; +} + +} /* namespace label */ + diff --git a/alib2data/src/label/ObjectLabel.h b/alib2data/src/label/ObjectLabel.h new file mode 100644 index 0000000000..c5f9f2fe62 --- /dev/null +++ b/alib2data/src/label/ObjectLabel.h @@ -0,0 +1,61 @@ +/* + * ObjectLabel.h + * + * Created on: Mar 26, 2013 + * Author: Jan Travnicek + */ + +#ifndef OBJECT_LABEL_H_ +#define OBJECT_LABEL_H_ + +#include <ostream> + +#include "LabelBase.h" +#include "../object/Object.h" + +namespace label { + +/** + * Represents symbol in an alphabet. + */ +class ObjectLabel : public std::acceptor<ObjectLabel, VisitableLabelBase, std::acceptor<ObjectLabel, alib::VisitableObjectBase, LabelBase> > { +protected: + alib::Object label; +public: + virtual LabelBase* clone() const; + + virtual LabelBase* plunder() &&; + + /** + * Creates new symbol with given name. + * @param symbol name of the symbol + */ + explicit ObjectLabel(const alib::Object& label); + + virtual bool operator<(const alib::ObjectBase& other) const; + + virtual bool operator>(const alib::ObjectBase& other) const; + + virtual bool operator==(const alib::ObjectBase& other) const; + + /** + * @return name of the symbol + */ + const alib::Object& getData() const; + + virtual bool operator <(const ObjectLabel& other) const; + + virtual bool operator ==(const ObjectLabel& other) const; + + virtual void operator>>(std::ostream&) const; + + virtual operator std::string() const; + + virtual int selfTypeId() const { + return typeId(*this); + } +}; + +} /* namespace label */ + +#endif /* OBJECT_LABEL_H_ */ diff --git a/alib2data/src/object/ObjectBase.h b/alib2data/src/object/ObjectBase.h index 9116b8c38f..b9c9b95391 100644 --- a/alib2data/src/object/ObjectBase.h +++ b/alib2data/src/object/ObjectBase.h @@ -60,6 +60,7 @@ namespace label { class StringLabel; class IntegerLabel; class CharacterLabel; +class ObjectLabel; class LabelSetLabel; class LabelPairLabel; @@ -112,7 +113,7 @@ typedef std::acceptor_base< exception::AlibException, automaton::UnknownAutomaton, automaton::DFA, automaton::NFA, automaton::EpsilonNFA, automaton::CompactNFA, automaton::ExtendedNFA, automaton::DPDA, automaton::SinglePopDPDA, automaton::InputDrivenNPDA, automaton::VisiblyPushdownNPDA, automaton::RealTimeHeightDeterministicNPDA, automaton::NPDA, automaton::SinglePopNPDA, automaton::OneTapeDTM, grammar::UnknownGrammar, grammar::LeftLG, grammar::LeftRG, grammar::RightLG, grammar::RightRG, grammar::LG, grammar::CFG, grammar::EpsilonFreeCFG, grammar::CNF, grammar::GNF, grammar::CSG, grammar::NonContractingGrammar, grammar::ContextPreservingUnrestrictedGrammar, grammar::UnrestrictedGrammar, - label::StringLabel, label::IntegerLabel, label::CharacterLabel, label::LabelSetLabel, label::LabelPairLabel, + label::StringLabel, label::IntegerLabel, label::CharacterLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel, regexp::UnboundedRegExp, regexp::FormalRegExp, string::Epsilon, string::LinearString, string::CyclicString, alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, @@ -126,7 +127,7 @@ class ObjectBase : exception::AlibException, automaton::UnknownAutomaton, automaton::DFA, automaton::NFA, automaton::EpsilonNFA, automaton::CompactNFA, automaton::ExtendedNFA, automaton::DPDA, automaton::SinglePopDPDA, automaton::InputDrivenNPDA, automaton::VisiblyPushdownNPDA, automaton::RealTimeHeightDeterministicNPDA, automaton::NPDA, automaton::SinglePopNPDA, automaton::OneTapeDTM, grammar::UnknownGrammar, grammar::LeftLG, grammar::LeftRG, grammar::RightLG, grammar::RightRG, grammar::LG, grammar::CFG, grammar::EpsilonFreeCFG, grammar::CNF, grammar::GNF, grammar::CSG, grammar::NonContractingGrammar, grammar::ContextPreservingUnrestrictedGrammar, grammar::UnrestrictedGrammar, - label::StringLabel, label::IntegerLabel, label::CharacterLabel, label::LabelSetLabel, label::LabelPairLabel, + label::StringLabel, label::IntegerLabel, label::CharacterLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel, regexp::UnboundedRegExp, regexp::FormalRegExp, string::Epsilon, string::LinearString, string::CyclicString, alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, -- GitLab