From e1a504bd0f58ac410f1784634677804beeb505f1 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Mon, 1 Dec 2014 09:52:07 +0100 Subject: [PATCH] UniqueSymbol implementation --- alib2data/src/Api.cpp | 27 +++++-- alib2data/src/Api.hpp | 9 +++ alib2data/src/alphabet/SymbolBase.h | 2 +- alib2data/src/alphabet/SymbolFeatures.h | 3 +- .../src/alphabet/SymbolFromXMLParser.cpp | 18 ++++- alib2data/src/alphabet/SymbolFromXMLParser.h | 2 + .../src/alphabet/SymbolToStringComposer.cpp | 12 +++ .../src/alphabet/SymbolToStringComposer.h | 1 + .../src/alphabet/SymbolToXMLComposer.cpp | 9 +++ alib2data/src/alphabet/SymbolToXMLComposer.h | 1 + alib2data/src/alphabet/UniqueSymbol.cpp | 55 ++++++++++++++ alib2data/src/alphabet/UniqueSymbol.h | 76 +++++++++++++++++++ alib2data/src/object/ObjectBase.h | 5 +- 13 files changed, 209 insertions(+), 11 deletions(-) create mode 100644 alib2data/src/alphabet/UniqueSymbol.cpp create mode 100644 alib2data/src/alphabet/UniqueSymbol.h diff --git a/alib2data/src/Api.cpp b/alib2data/src/Api.cpp index bb2d9c18d4..1639aec82b 100644 --- a/alib2data/src/Api.cpp +++ b/alib2data/src/Api.cpp @@ -49,6 +49,7 @@ const std::string Names::ALPHABET_RANKED_BAR_SYMBOL = "RankedBarSymbol"; const std::string Names::ALPHABET_SUBTREE_WILDCARD_SYMBOL = "SubtreeWildcardSymbol"; const std::string Names::ALPHABET_SYMBOL_SET_SYMBOL = "SymbolSetSymbol"; const std::string Names::ALPHABET_SYMBOL_PAIR_SYMBOL = "SymbolPairSymbol"; +const std::string Names::ALPHABET_UNIQUE_SYMBOL = "UniqueSymbol"; const std::string Names::AUTOMATON_EPSILON_NFA = "EpsilonNFA"; const std::string Names::AUTOMATON_MULTI_INITIAL_STATE_NFA = "MultiInitialStateNFA"; const std::string Names::AUTOMATON_NFA = "NFA"; @@ -325,6 +326,18 @@ std::list<sax::Token> api<alphabet::SymbolPairSymbol>::compose(const alphabet::S return ToXMLComposers::symbolComposer.compose(data); } +alphabet::UniqueSymbol api<alphabet::UniqueSymbol>::parse(std::list<sax::Token>& input) { + return FromXMLParsers::symbolParser.parseUniqueSymbol(input); +} + +bool api<alphabet::UniqueSymbol>::first(const std::list<sax::Token>& input) { + return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::ALPHABET_UNIQUE_SYMBOL); +} + +std::list<sax::Token> api<alphabet::UniqueSymbol>::compose(const alphabet::UniqueSymbol& data) { + return ToXMLComposers::symbolComposer.compose(data); +} + automaton::Automaton api<automaton::Automaton>::parse(std::list<sax::Token>& input) { return FromXMLParsers::automatonParser.parseAutomaton(input); @@ -789,7 +802,7 @@ label::UniqueLabel api<label::UniqueLabel>::parse(std::list<sax::Token>& input) } bool api<label::UniqueLabel>::first(const std::list<sax::Token>& input) { - return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::LABEL_LABEL_PAIR_LABEL); + return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::LABEL_UNIQUE_LABEL); } std::list<sax::Token> api<label::UniqueLabel>::compose(const label::UniqueLabel& data) { @@ -1047,12 +1060,16 @@ void ToXMLComposers::Visit(void* data, const alphabet::LabeledSymbol& symbol) co *((std::list<sax::Token>*) data) = std::move(api<alphabet::LabeledSymbol>::compose(symbol)); } -void ToXMLComposers::Visit(void* data, const alphabet::SymbolSetSymbol& label) const { - *((std::list<sax::Token>*) data) = std::move(api<alphabet::SymbolSetSymbol>::compose(label)); +void ToXMLComposers::Visit(void* data, const alphabet::SymbolSetSymbol& symbol) const { + *((std::list<sax::Token>*) data) = std::move(api<alphabet::SymbolSetSymbol>::compose(symbol)); +} + +void ToXMLComposers::Visit(void* data, const alphabet::SymbolPairSymbol& symbol) const { + *((std::list<sax::Token>*) data) = std::move(api<alphabet::SymbolPairSymbol>::compose(symbol)); } -void ToXMLComposers::Visit(void* data, const alphabet::SymbolPairSymbol& label) const { - *((std::list<sax::Token>*) data) = std::move(api<alphabet::SymbolPairSymbol>::compose(label)); +void ToXMLComposers::Visit(void* data, const alphabet::UniqueSymbol& symbol) const { + *((std::list<sax::Token>*) data) = std::move(api<alphabet::UniqueSymbol>::compose(symbol)); } void ToXMLComposers::Visit(void* data, const automaton::EpsilonNFA& automaton) const { diff --git a/alib2data/src/Api.hpp b/alib2data/src/Api.hpp index 1a908f2881..18d041ce2f 100644 --- a/alib2data/src/Api.hpp +++ b/alib2data/src/Api.hpp @@ -50,6 +50,7 @@ public: const static std::string ALPHABET_SUBTREE_WILDCARD_SYMBOL; const static std::string ALPHABET_SYMBOL_PAIR_SYMBOL; const static std::string ALPHABET_SYMBOL_SET_SYMBOL; + const static std::string ALPHABET_UNIQUE_SYMBOL; const static std::string AUTOMATON_EPSILON_NFA; const static std::string AUTOMATON_MULTI_INITIAL_STATE_NFA; const static std::string AUTOMATON_NFA; @@ -277,6 +278,13 @@ struct api<alphabet::SymbolPairSymbol> { static std::list<sax::Token> compose(const alphabet::SymbolPairSymbol& data); }; +template<> +struct api<alphabet::UniqueSymbol> { + static alphabet::UniqueSymbol parse(std::list<sax::Token>& input); + static bool first(const std::list<sax::Token>& input); + static std::list<sax::Token> compose(const alphabet::UniqueSymbol& data); +}; + template<> struct api<automaton::Automaton> { @@ -716,6 +724,7 @@ class ToXMLComposers : public VisitableObjectBase::const_visitor_type { void Visit(void*, const alphabet::SubtreeWildcardSymbol& symbol) const; void Visit(void*, const alphabet::SymbolSetSymbol& label) const; void Visit(void*, const alphabet::SymbolPairSymbol& label) const; + void Visit(void*, const alphabet::UniqueSymbol& label) const; void Visit(void*, const automaton::EpsilonNFA& automaton) const; void Visit(void*, const automaton::MultiInitialStateNFA& automaton) const; diff --git a/alib2data/src/alphabet/SymbolBase.h b/alib2data/src/alphabet/SymbolBase.h index 9c0e18661c..4692bfe859 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, RankedBarSymbol, SubtreeWildcardSymbol, SymbolSetSymbol, SymbolPairSymbol + LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, RankedSymbol, BarSymbol, RankedBarSymbol, SubtreeWildcardSymbol, SymbolSetSymbol, SymbolPairSymbol, UniqueSymbol > VisitableSymbolBase; /** diff --git a/alib2data/src/alphabet/SymbolFeatures.h b/alib2data/src/alphabet/SymbolFeatures.h index b1957bbdc8..2344e56daf 100644 --- a/alib2data/src/alphabet/SymbolFeatures.h +++ b/alib2data/src/alphabet/SymbolFeatures.h @@ -20,7 +20,8 @@ enum class FEATURES { RANKED_BAR, SUBTREE_WILDCARD, SYMBOL_SET_SYMBOL, - SYMBOL_PAIR_SYMBOL + SYMBOL_PAIR_SYMBOL, + UNIQUE_SYMBOL }; } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.cpp b/alib2data/src/alphabet/SymbolFromXMLParser.cpp index d054189e5d..b00bdb3b88 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, FEATURES::RANKED_BAR, FEATURES::SUBTREE_WILDCARD, FEATURES::SYMBOL_PAIR_SYMBOL, FEATURES::SYMBOL_SET_SYMBOL})); + return parseSymbol(input, std::set<FEATURES>({FEATURES::LABELED, FEATURES::BLANK, FEATURES::BOTTOM, FEATURES::END, FEATURES::RANKED, FEATURES::BAR, FEATURES::RANKED_BAR, FEATURES::SUBTREE_WILDCARD, FEATURES::SYMBOL_PAIR_SYMBOL, FEATURES::SYMBOL_SET_SYMBOL, FEATURES::UNIQUE_SYMBOL})); } Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std::set<FEATURES>& features) const { @@ -49,8 +49,11 @@ Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std: } else if(alib::api<SymbolSetSymbol>::first(input)) { if(!features.count(FEATURES::SYMBOL_SET_SYMBOL)) throw exception::AlibException(); return Symbol(parseSymbolSetSymbol(input)); + } else if(alib::api<UniqueSymbol>::first(input)) { + if(!features.count(FEATURES::UNIQUE_SYMBOL)) throw exception::AlibException(); + return Symbol(parseUniqueSymbol(input)); } else { - throw sax::ParserException(sax::Token("LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, RankedSymbol, BarSymbol, RankedBarSymbol, SubtreeWildcardSymbol, SymbolPairSymbol, SymbolSetSymbol", sax::Token::TokenType::START_ELEMENT), input.front()); + throw sax::ParserException(sax::Token("LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, RankedSymbol, BarSymbol, RankedBarSymbol, SubtreeWildcardSymbol, SymbolPairSymbol, SymbolSetSymbol, UniqueSymbol", sax::Token::TokenType::START_ELEMENT), input.front()); } } @@ -136,4 +139,15 @@ SymbolPairSymbol SymbolFromXMLParser::parseSymbolPairSymbol(std::list<sax::Token return data; } +UniqueSymbol SymbolFromXMLParser::parseUniqueSymbol(std::list<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::ALPHABET_UNIQUE_SYMBOL); + + Symbol firstSymbol = parseSymbol(input); + primitive::Integer secondSymbol = alib::api<primitive::Integer>::parse(input); + + UniqueSymbol data(firstSymbol, secondSymbol); + popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::ALPHABET_UNIQUE_SYMBOL); + return data; +} + } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.h b/alib2data/src/alphabet/SymbolFromXMLParser.h index 05d260e2e6..f661309e53 100644 --- a/alib2data/src/alphabet/SymbolFromXMLParser.h +++ b/alib2data/src/alphabet/SymbolFromXMLParser.h @@ -26,6 +26,7 @@ #include "SubtreeWildcardSymbol.h" #include "SymbolPairSymbol.h" #include "SymbolSetSymbol.h" +#include "UniqueSymbol.h" namespace alib { @@ -53,6 +54,7 @@ class SymbolFromXMLParser : public sax::FromXMLParserHelper { SubtreeWildcardSymbol parseSubtreeWildcardSymbol(std::list<sax::Token>& input) const; SymbolPairSymbol parseSymbolPairSymbol(std::list<sax::Token>& input) const; SymbolSetSymbol parseSymbolSetSymbol(std::list<sax::Token>& input) const; + UniqueSymbol parseUniqueSymbol(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 1929dcbc39..d9f5918694 100644 --- a/alib2data/src/alphabet/SymbolToStringComposer.cpp +++ b/alib2data/src/alphabet/SymbolToStringComposer.cpp @@ -14,6 +14,7 @@ #include "RankedBarSymbol.h" #include "SymbolPairSymbol.h" #include "SymbolSetSymbol.h" +#include "UniqueSymbol.h" namespace alphabet { @@ -96,6 +97,17 @@ void SymbolToStringComposer::Visit(void* userData, const SymbolPairSymbol& symbo out << '>'; } +void SymbolToStringComposer::Visit(void* userData, const UniqueSymbol& symbol) { + std::stringstream &out = *((std::stringstream*) userData); + + out << '<'; + symbol.getSymbol().getData().Accept(userData, *this); + out << ", "; + primitive::PrimitiveToStringComposer composer; + symbol.getId().Accept(userData, composer); + 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 84cc336fb7..64b3d2c07c 100644 --- a/alib2data/src/alphabet/SymbolToStringComposer.h +++ b/alib2data/src/alphabet/SymbolToStringComposer.h @@ -29,6 +29,7 @@ class SymbolToStringComposer : public VisitableSymbolBase::visitor_type { void Visit(void*, const SubtreeWildcardSymbol& symbol); void Visit(void*, const SymbolPairSymbol& symbol); void Visit(void*, const SymbolSetSymbol& symbol); + void Visit(void*, const UniqueSymbol& symbol); public: /** diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.cpp b/alib2data/src/alphabet/SymbolToXMLComposer.cpp index 7bf62d747f..506034e151 100644 --- a/alib2data/src/alphabet/SymbolToXMLComposer.cpp +++ b/alib2data/src/alphabet/SymbolToXMLComposer.cpp @@ -102,4 +102,13 @@ std::list<sax::Token> SymbolToXMLComposer::compose(const SymbolPairSymbol& symbo return out; } +std::list<sax::Token> SymbolToXMLComposer::compose(const UniqueSymbol& symbol) const { + std::list<sax::Token> out; + out.push_back(sax::Token(alib::Names::LABEL_UNIQUE_LABEL, sax::Token::TokenType::START_ELEMENT)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol.getSymbol())); + out.splice(out.end(), alib::api<primitive::Integer>::compose(symbol.getId())); + out.push_back(sax::Token(alib::Names::LABEL_UNIQUE_LABEL, sax::Token::TokenType::END_ELEMENT)); + return out; +} + } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.h b/alib2data/src/alphabet/SymbolToXMLComposer.h index 6db563aec2..662137a9ba 100644 --- a/alib2data/src/alphabet/SymbolToXMLComposer.h +++ b/alib2data/src/alphabet/SymbolToXMLComposer.h @@ -50,6 +50,7 @@ class SymbolToXMLComposer { std::list<sax::Token> compose(const SubtreeWildcardSymbol& symbol) const; std::list<sax::Token> compose(const SymbolPairSymbol& symbol) const; std::list<sax::Token> compose(const SymbolSetSymbol& symbol) const; + std::list<sax::Token> compose(const UniqueSymbol& symbol) const; template<typename T> friend class alib::api; }; diff --git a/alib2data/src/alphabet/UniqueSymbol.cpp b/alib2data/src/alphabet/UniqueSymbol.cpp new file mode 100644 index 0000000000..185fa45579 --- /dev/null +++ b/alib2data/src/alphabet/UniqueSymbol.cpp @@ -0,0 +1,55 @@ +/* + * UniqueSymbol.cpp + * + * Created on: Mar 26, 2013 + * Author: Jan Travicek + */ + +#include "UniqueSymbol.h" +#include "../std/set.hpp" +#include <sstream> + +namespace alphabet { + +UniqueSymbol::UniqueSymbol(const Symbol& symbol, primitive::Integer& id) : symbol(symbol), id(id) { + +} + +SymbolBase* UniqueSymbol::clone() const { + return new UniqueSymbol(*this); +} + +SymbolBase* UniqueSymbol::plunder() && { + return new UniqueSymbol(std::move(*this)); +} + +const Symbol& UniqueSymbol::getSymbol() const { + return symbol; +} + +const primitive::Integer& UniqueSymbol::getId() const { + return id; +} + +int UniqueSymbol::compare(const UniqueSymbol& other) const { + int res = symbol.getData().compare(other.symbol.getData()); + if(res == 0) res = id.compare(other.id); + return res; +} + +void UniqueSymbol::operator>>(std::ostream& out) const { + out << "(UniqueSymbol " << symbol << ", " << id << ")"; +} + +UniqueSymbol::operator std::string() const { + std::stringstream ss; + ss << "{"; + ss << symbol; + ss << ", "; + ss << id; + ss << "}"; + return std::move(ss).str(); +} + +} /* namespace alphabet */ + diff --git a/alib2data/src/alphabet/UniqueSymbol.h b/alib2data/src/alphabet/UniqueSymbol.h new file mode 100644 index 0000000000..36b0cda210 --- /dev/null +++ b/alib2data/src/alphabet/UniqueSymbol.h @@ -0,0 +1,76 @@ +/* + * UniqueSymbol.h + * + * Created on: Mar 26, 2013 + * Author: Jan Travnicek + */ + +#ifndef SYMBOL_ID_SYMBOL_H_ +#define SYMBOL_ID_SYMBOL_H_ + +#include <string> +#include <ostream> + +#include "Symbol.h" +#include "SymbolBase.h" +#include <set> +#include "../primitive/Integer.h" + +namespace alphabet { + +/** + * Represents symbol in an alphabet. + */ +class UniqueSymbol : public std::acceptor<UniqueSymbol, VisitableSymbolBase, std::acceptor<UniqueSymbol, alib::VisitableObjectBase, SymbolBase> > { +protected: + Symbol symbol; + primitive::Integer id; + +public: + /** + * Creates new symbol with given name. + * @param symbol name of the symbol + */ + explicit UniqueSymbol(const Symbol& symbol, primitive::Integer& id); + + virtual SymbolBase* clone() const; + + virtual SymbolBase* plunder() &&; + + /** + * @return name of the symbol + */ + const Symbol& getSymbol() const; + + const primitive::Integer& getId() const; + + virtual int compare(const ObjectBase& other) const { + return -other.compare(*this); + } + + virtual int compare(const UniqueSymbol& other) const; + + virtual void operator>>(std::ostream&) const; + + virtual operator std::string () const; + + virtual int selfTypeId() const { + return typeId<UniqueSymbol>(); + } +}; + +} /* namespace alphabet */ + +namespace std { + +template<> +struct compare<alphabet::UniqueSymbol> { + int operator()(const alphabet::UniqueSymbol& first, const alphabet::UniqueSymbol& second) const { + return first.compare(second); + } +}; + +} /* namespace std */ + +#endif /* SYMBOL_ID_SYMBOL_H_ */ + diff --git a/alib2data/src/object/ObjectBase.h b/alib2data/src/object/ObjectBase.h index c4a21b2acc..b9b8014be6 100644 --- a/alib2data/src/object/ObjectBase.h +++ b/alib2data/src/object/ObjectBase.h @@ -101,6 +101,7 @@ class RankedBarSymbol; class SubtreeWildcardSymbol; class SymbolSetSymbol; class SymbolPairSymbol; +class UniqueSymbol; } @@ -133,7 +134,7 @@ typedef std::acceptor_base<ObjectBase, label::PrimitiveLabel, label::HexavigesimalLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel, label::UniqueLabel, regexp::UnboundedRegExp, regexp::FormalRegExp, string::Epsilon, string::LinearString, string::CyclicString, - alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol, alphabet::SubtreeWildcardSymbol, alphabet::SymbolPairSymbol, alphabet::SymbolSetSymbol, + alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol, alphabet::SubtreeWildcardSymbol, alphabet::SymbolPairSymbol, alphabet::SymbolSetSymbol, alphabet::UniqueSymbol, container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap, primitive::String, primitive::Integer, primitive::Character > VisitableObjectBase; @@ -148,7 +149,7 @@ class ObjectBase : label::PrimitiveLabel, label::HexavigesimalLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel, label::UniqueLabel, regexp::UnboundedRegExp, regexp::FormalRegExp, string::Epsilon, string::LinearString, string::CyclicString, - alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol, alphabet::SubtreeWildcardSymbol, alphabet::SymbolPairSymbol, alphabet::SymbolSetSymbol, + alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol, alphabet::SubtreeWildcardSymbol, alphabet::SymbolPairSymbol, alphabet::SymbolSetSymbol, alphabet::UniqueSymbol, container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap, primitive::String, primitive::Integer, primitive::Character >, public VisitableObjectBase { -- GitLab