diff --git a/alib2data/src/Api.cpp b/alib2data/src/Api.cpp index bb2d9c18d421aab260f674ac8eab153f793301f1..1639aec82b78229976547a052d1e8cec1a6dbee8 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 1a908f28818984a75bf0b563caf98b7f9ee42690..18d041ce2f7ee0a94fa4bbdb66c723ba5e3ee6da 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 9c0e18661ccc45e09b0c74e6a224d11cb9fd7992..4692bfe85941751ea42f2a967904467563caa5c7 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 b1957bbdc8d5d7be75b9e15074136d6c68fb6fd5..2344e56daf79d1f358566de3218d7ab51a8a2752 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 d054189e5d83d9a9e56903a3fad8ee434d5d08dc..b00bdb3b8837ae0bdbb7d1a5d53b380827c6e187 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 05d260e2e6cea5b2f06e8209ea99339a2e8d2231..f661309e530d43ef8ccb8aacac335a795f9cc8b7 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 1929dcbc3999900b7632851f220430dfada4cf5f..d9f591869421957254ab0eba7ad06b78cdb481d0 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 84cc336fb7195257fd1c3798868a5bc1708cad67..64b3d2c07c2855ce2f42b88f7a16feb7fcf2dbf6 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 7bf62d747fdd7bf4f13ee9144f6fff3f109def0e..506034e1513fbae090b20f57feaf073cf1b6c80c 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 6db563aec2f20603e4e2c72bd012a045b4d60268..662137a9baeb9b49fb9c862c73ff509b2472fcb0 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 0000000000000000000000000000000000000000..185fa455795903ca87f6c2bb2bc74a31c0bf0e35 --- /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 0000000000000000000000000000000000000000..36b0cda21028833bdca2e6d4a79e2cadf67912e7 --- /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 c4a21b2acc8c49f179852136e231abbbf38e90e0..b9b8014be623d382ccd93b582f8c9bbf0cb6d178 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 {