diff --git a/alib2data/src/Api.cpp b/alib2data/src/Api.cpp index 39901ba263cf9847d2965792aafe2496af18a2af..2234b408bd4d6946de91f6cf24001783a16e5bdd 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 fd58922caa2bf7cbfe42720b1f5ca0d9c9fa04d4..1207d0cabbaf86e9cc3808f491ac5b28bf27d3f7 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 708a41f71de4d645df182be9e28ce673e8d5b2f0..6ac8e84349b5cb0691304a15f9f297ed3fbce5db 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 0e9ddc62c071e91c40998aac71afe9c677dac8ce..b6e49feaad67c9d82298e55658113454c2a0fc64 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 bd74f08cb7ab9890177a6ba558cb5ffea16f6adb..41475b38cdc29338e5ef1d67a704b064e13784e4 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 e17fd7453afd6765727b5a853bbd91adc57f17d4..dc18f1e036905653901075221473550c0ef28f4a 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 6aed29fc638233743bd1231e1e07ba23467c990c..6452b690676f04eed7cf1c3378c17f1c3105adfd 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 9023693bfa8ecdce7c2a5dd66ba611338a4de027..97f8f7df938ef5eeaad8b7c511874198a8cea375 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 ea86b8e05817bb446fd381bf0b3e9706b964ce35..361289bdec2b59ef7d1b5662a0858e90d075dc51 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 ba7131b9b46c44ec58ac03e817ff47a798a214a1..7376275be3f7e422bdade100dfac4d793b123a0e 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 7259b30c4e8f0af6b163f43e10c775f866a5fc08..7a1b9f2b7c4a016275938ddd30947e47b5dc7682 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 377ff424f38de32a0d93ed7240d2ef0002f57fdb..ad56b2774ce5b41617f95dfc66ac23cf6b014f5e 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 67a4fdc61045457721f24cff187c15e182fcce50..6e47e851643ed1838271cbc29b26b12be5d29ab1 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 0000000000000000000000000000000000000000..a4dedcf4d47a6cec5b8d6d5ab94c168b45a8d492 --- /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 0000000000000000000000000000000000000000..c5f9f2fe621d18b7b8d139d048210bb13c43f1fd --- /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 9116b8c38f6490e58f042c36b428be22a3ee5a61..b9c9b95391be9d2a11c44b2f367feb779194f9d1 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,