From 440630946e3e2ff79f8ef4dde3ae08127647137c Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Mon, 1 Dec 2014 09:11:02 +0100 Subject: [PATCH] Add SymbolSetSymbol and SymbolPairSymbol --- alib2data/src/Api.cpp | 34 +++++++++ alib2data/src/Api.hpp | 19 +++++ alib2data/src/alphabet/SymbolBase.h | 2 +- alib2data/src/alphabet/SymbolFeatures.h | 4 +- .../src/alphabet/SymbolFromStringParser.cpp | 2 +- .../src/alphabet/SymbolFromXMLParser.cpp | 34 ++++++++- alib2data/src/alphabet/SymbolFromXMLParser.h | 4 + alib2data/src/alphabet/SymbolPairSymbol.cpp | 55 ++++++++++++++ alib2data/src/alphabet/SymbolPairSymbol.h | 74 +++++++++++++++++++ alib2data/src/alphabet/SymbolSetSymbol.cpp | 59 +++++++++++++++ alib2data/src/alphabet/SymbolSetSymbol.h | 74 +++++++++++++++++++ .../src/alphabet/SymbolToStringComposer.cpp | 27 +++++++ .../src/alphabet/SymbolToStringComposer.h | 2 + .../src/alphabet/SymbolToXMLComposer.cpp | 19 +++++ alib2data/src/alphabet/SymbolToXMLComposer.h | 2 + alib2data/src/object/ObjectBase.h | 6 +- 16 files changed, 409 insertions(+), 8 deletions(-) create mode 100644 alib2data/src/alphabet/SymbolPairSymbol.cpp create mode 100644 alib2data/src/alphabet/SymbolPairSymbol.h create mode 100644 alib2data/src/alphabet/SymbolSetSymbol.cpp create mode 100644 alib2data/src/alphabet/SymbolSetSymbol.h diff --git a/alib2data/src/Api.cpp b/alib2data/src/Api.cpp index 59cfca4931..bb2d9c18d4 100644 --- a/alib2data/src/Api.cpp +++ b/alib2data/src/Api.cpp @@ -47,6 +47,8 @@ const std::string Names::ALPHABET_RANKED_SYMBOL = "RankedSymbol"; const std::string Names::ALPHABET_BAR_SYMBOL = "BarSymbol"; 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::AUTOMATON_EPSILON_NFA = "EpsilonNFA"; const std::string Names::AUTOMATON_MULTI_INITIAL_STATE_NFA = "MultiInitialStateNFA"; const std::string Names::AUTOMATON_NFA = "NFA"; @@ -299,6 +301,30 @@ std::list<sax::Token> api<alphabet::SubtreeWildcardSymbol>::compose(const alphab return ToXMLComposers::symbolComposer.compose(data); } +alphabet::SymbolSetSymbol api<alphabet::SymbolSetSymbol>::parse(std::list<sax::Token>& input) { + return FromXMLParsers::symbolParser.parseSymbolSetSymbol(input); +} + +bool api<alphabet::SymbolSetSymbol>::first(const std::list<sax::Token>& input) { + return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::ALPHABET_SYMBOL_SET_SYMBOL); +} + +std::list<sax::Token> api<alphabet::SymbolSetSymbol>::compose(const alphabet::SymbolSetSymbol& data) { + return ToXMLComposers::symbolComposer.compose(data); +} + +alphabet::SymbolPairSymbol api<alphabet::SymbolPairSymbol>::parse(std::list<sax::Token>& input) { + return FromXMLParsers::symbolParser.parseSymbolPairSymbol(input); +} + +bool api<alphabet::SymbolPairSymbol>::first(const std::list<sax::Token>& input) { + return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::ALPHABET_SYMBOL_PAIR_SYMBOL); +} + +std::list<sax::Token> api<alphabet::SymbolPairSymbol>::compose(const alphabet::SymbolPairSymbol& data) { + return ToXMLComposers::symbolComposer.compose(data); +} + automaton::Automaton api<automaton::Automaton>::parse(std::list<sax::Token>& input) { return FromXMLParsers::automatonParser.parseAutomaton(input); @@ -1021,6 +1047,14 @@ 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::SymbolPairSymbol& label) const { + *((std::list<sax::Token>*) data) = std::move(api<alphabet::SymbolPairSymbol>::compose(label)); +} + void ToXMLComposers::Visit(void* data, const automaton::EpsilonNFA& automaton) const { *((std::list<sax::Token>*) data) = std::move(api<automaton::EpsilonNFA>::compose(automaton)); } diff --git a/alib2data/src/Api.hpp b/alib2data/src/Api.hpp index 20e0a9b0c6..1a908f2881 100644 --- a/alib2data/src/Api.hpp +++ b/alib2data/src/Api.hpp @@ -48,6 +48,8 @@ public: const static std::string ALPHABET_BAR_SYMBOL; const static std::string ALPHABET_RANKED_BAR_SYMBOL; 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 AUTOMATON_EPSILON_NFA; const static std::string AUTOMATON_MULTI_INITIAL_STATE_NFA; const static std::string AUTOMATON_NFA; @@ -261,6 +263,21 @@ struct api<alphabet::SubtreeWildcardSymbol> { static std::list<sax::Token> compose(const alphabet::SubtreeWildcardSymbol& data); }; +template<> +struct api<alphabet::SymbolSetSymbol> { + static alphabet::SymbolSetSymbol parse(std::list<sax::Token>& input); + static bool first(const std::list<sax::Token>& input); + static std::list<sax::Token> compose(const alphabet::SymbolSetSymbol& data); +}; + +template<> +struct api<alphabet::SymbolPairSymbol> { + static alphabet::SymbolPairSymbol parse(std::list<sax::Token>& input); + static bool first(const std::list<sax::Token>& input); + static std::list<sax::Token> compose(const alphabet::SymbolPairSymbol& data); +}; + + template<> struct api<automaton::Automaton> { static automaton::Automaton parse(std::list<sax::Token>& input); @@ -697,6 +714,8 @@ class ToXMLComposers : public VisitableObjectBase::const_visitor_type { void Visit(void*, const alphabet::BarSymbol& symbol) const; void Visit(void*, const alphabet::RankedBarSymbol& symbol) const; 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 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 45dd60bf9d..9c0e18661c 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 + LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, RankedSymbol, BarSymbol, RankedBarSymbol, SubtreeWildcardSymbol, SymbolSetSymbol, SymbolPairSymbol > VisitableSymbolBase; /** diff --git a/alib2data/src/alphabet/SymbolFeatures.h b/alib2data/src/alphabet/SymbolFeatures.h index 3d6c840d4e..b1957bbdc8 100644 --- a/alib2data/src/alphabet/SymbolFeatures.h +++ b/alib2data/src/alphabet/SymbolFeatures.h @@ -18,7 +18,9 @@ enum class FEATURES { RANKED, BAR, RANKED_BAR, - SUBTREE_WILDCARD + SUBTREE_WILDCARD, + SYMBOL_SET_SYMBOL, + SYMBOL_PAIR_SYMBOL }; } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/SymbolFromStringParser.cpp b/alib2data/src/alphabet/SymbolFromStringParser.cpp index bf6164b922..59d7e71f0b 100644 --- a/alib2data/src/alphabet/SymbolFromStringParser.cpp +++ b/alib2data/src/alphabet/SymbolFromStringParser.cpp @@ -19,7 +19,7 @@ SymbolFromStringParser::SymbolFromStringParser(std::istream& input) : m_SymbolLe } Symbol SymbolFromStringParser::parse() { - return parse(std::set<FEATURES>({FEATURES::LABELED, FEATURES::BLANK, FEATURES::BOTTOM, FEATURES::END})); + return parse(std::set<FEATURES>({FEATURES::LABELED, FEATURES::BLANK, FEATURES::BOTTOM, FEATURES::END, FEATURES::BAR, FEATURES::SUBTREE_WILDCARD})); } Symbol SymbolFromStringParser::parse(const std::set<FEATURES>& features) { diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.cpp b/alib2data/src/alphabet/SymbolFromXMLParser.cpp index 2faa352f87..d054189e5d 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})); + 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})); } Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std::set<FEATURES>& features) const { @@ -43,13 +43,19 @@ Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std: } else if(alib::api<SubtreeWildcardSymbol>::first(input)) { if(!features.count(FEATURES::SUBTREE_WILDCARD)) throw exception::AlibException(); return Symbol(parseSubtreeWildcardSymbol(input)); + } else if(alib::api<SymbolPairSymbol>::first(input)) { + if(!features.count(FEATURES::SYMBOL_PAIR_SYMBOL)) throw exception::AlibException(); + return Symbol(parseSymbolPairSymbol(input)); + } else if(alib::api<SymbolSetSymbol>::first(input)) { + if(!features.count(FEATURES::SYMBOL_SET_SYMBOL)) throw exception::AlibException(); + return Symbol(parseSymbolSetSymbol(input)); } else { - throw sax::ParserException(sax::Token("LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, RankedSymbol, BarSymbol, RankedBarSymbol, SubtreeWildcardSymbol", sax::Token::TokenType::START_ELEMENT), input.front()); + throw sax::ParserException(sax::Token("LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, RankedSymbol, BarSymbol, RankedBarSymbol, SubtreeWildcardSymbol, SymbolPairSymbol, SymbolSetSymbol", sax::Token::TokenType::START_ELEMENT), input.front()); } } bool SymbolFromXMLParser::first(const std::list<sax::Token>& input) const { - if(alib::api<LabeledSymbol>::first(input) || alib::api<BlankSymbol>::first(input) || alib::api<BottomOfTheStackSymbol>::first(input) || alib::api<EndSymbol>::first(input) || alib::api<RankedSymbol>::first(input) || alib::api<BarSymbol>::first(input) || alib::api<RankedBarSymbol>::first(input) || alib::api<SubtreeWildcardSymbol>::first(input)) { + if(alib::api<LabeledSymbol>::first(input) || alib::api<BlankSymbol>::first(input) || alib::api<BottomOfTheStackSymbol>::first(input) || alib::api<EndSymbol>::first(input) || alib::api<RankedSymbol>::first(input) || alib::api<BarSymbol>::first(input) || alib::api<RankedBarSymbol>::first(input) || alib::api<SubtreeWildcardSymbol>::first(input) || alib::api<SymbolPairSymbol>::first(input) || alib::api<SymbolSetSymbol>::first(input)) { return true; } else { return false; @@ -108,4 +114,26 @@ SubtreeWildcardSymbol SymbolFromXMLParser::parseSubtreeWildcardSymbol(std::list< return SubtreeWildcardSymbol(); } +SymbolSetSymbol SymbolFromXMLParser::parseSymbolSetSymbol(std::list<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::ALPHABET_SYMBOL_SET_SYMBOL); + std::set<Symbol> labels; + while(isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { + labels.insert(parseSymbol(input)); + } + SymbolSetSymbol data(labels); + popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::ALPHABET_SYMBOL_SET_SYMBOL); + return data; +} + +SymbolPairSymbol SymbolFromXMLParser::parseSymbolPairSymbol(std::list<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::ALPHABET_SYMBOL_PAIR_SYMBOL); + + Symbol firstSymbol = parseSymbol(input); + Symbol secondSymbol = parseSymbol(input); + + SymbolPairSymbol data(std::make_pair(firstSymbol, secondSymbol)); + popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::ALPHABET_SYMBOL_PAIR_SYMBOL); + return data; +} + } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.h b/alib2data/src/alphabet/SymbolFromXMLParser.h index c0b6d20db1..05d260e2e6 100644 --- a/alib2data/src/alphabet/SymbolFromXMLParser.h +++ b/alib2data/src/alphabet/SymbolFromXMLParser.h @@ -24,6 +24,8 @@ #include "BarSymbol.h" #include "RankedBarSymbol.h" #include "SubtreeWildcardSymbol.h" +#include "SymbolPairSymbol.h" +#include "SymbolSetSymbol.h" namespace alib { @@ -49,6 +51,8 @@ class SymbolFromXMLParser : public sax::FromXMLParserHelper { BarSymbol parseBarSymbol(std::list<sax::Token>& input) const; RankedBarSymbol parseRankedBarSymbol(std::list<sax::Token>& input) const; SubtreeWildcardSymbol parseSubtreeWildcardSymbol(std::list<sax::Token>& input) const; + SymbolPairSymbol parseSymbolPairSymbol(std::list<sax::Token>& input) const; + SymbolSetSymbol parseSymbolSetSymbol(std::list<sax::Token>& input) const; template<typename T> friend class alib::api; public: diff --git a/alib2data/src/alphabet/SymbolPairSymbol.cpp b/alib2data/src/alphabet/SymbolPairSymbol.cpp new file mode 100644 index 0000000000..2b920d7052 --- /dev/null +++ b/alib2data/src/alphabet/SymbolPairSymbol.cpp @@ -0,0 +1,55 @@ +/* + * SymbolPairSymbol.cpp + * + * Created on: Mar 26, 2013 + * Author: Jan Travicek + */ + +#include "SymbolPairSymbol.h" +#include "../std/pair.hpp" +#include <sstream> + +namespace alphabet { + +SymbolPairSymbol::SymbolPairSymbol(const std::pair<Symbol, Symbol>& symbol) : symbol(std::move(symbol)) { + +} + +SymbolPairSymbol::SymbolPairSymbol(std::pair<Symbol, Symbol>&& symbol) : symbol(std::move(symbol)) { + +} + +SymbolBase* SymbolPairSymbol::clone() const { + return new SymbolPairSymbol(*this); +} + +SymbolBase* SymbolPairSymbol::plunder() && { + return new SymbolPairSymbol(std::move(*this)); +} + +const std::pair<Symbol, Symbol>& SymbolPairSymbol::getData() const { + return symbol; +} + +int SymbolPairSymbol::compare(const SymbolPairSymbol& other) const { + int res = symbol.first.getData().compare(other.symbol.first.getData()); + if(res == 0) res = symbol.second.getData().compare(other.symbol.second.getData()); + return res; +} + +void SymbolPairSymbol::operator>>(std::ostream& out) const { + out << "(SymbolPairSymbol " << symbol << ")"; +} + +SymbolPairSymbol::operator std::string() const { + std::stringstream ss; + ss << "<"; + ss << (std::string) symbol.first; + ss << ","; + ss << (std::string) symbol.second; + ss << "}"; + return std::move(ss).str(); +} + +} /* namespace alphabet */ + diff --git a/alib2data/src/alphabet/SymbolPairSymbol.h b/alib2data/src/alphabet/SymbolPairSymbol.h new file mode 100644 index 0000000000..80f435d04f --- /dev/null +++ b/alib2data/src/alphabet/SymbolPairSymbol.h @@ -0,0 +1,74 @@ +/* + * SymbolPairSymbol.h + * + * Created on: Mar 26, 2013 + * Author: Jan Travnicek + */ + +#ifndef SYMBOL_PAIR_SYMBOL_H_ +#define SYMBOL_PAIR_SYMBOL_H_ + +#include <string> +#include <ostream> + +#include "Symbol.h" +#include "SymbolBase.h" +#include <set> + +namespace alphabet { + +/** + * Represents symbol in an alphabet. + */ +class SymbolPairSymbol : public std::acceptor<SymbolPairSymbol, VisitableSymbolBase, std::acceptor<SymbolPairSymbol, alib::VisitableObjectBase, SymbolBase> > { +protected: + std::pair<Symbol, Symbol> symbol; + +public: + /** + * Creates new symbol with given name. + * @param symbol name of the symbol + */ + explicit SymbolPairSymbol(const std::pair<Symbol, Symbol>& symbol); + + explicit SymbolPairSymbol(std::pair<Symbol, Symbol>&& symbol); + + virtual SymbolBase* clone() const; + + virtual SymbolBase* plunder() &&; + + /** + * @return name of the symbol + */ + const std::pair<Symbol, Symbol>& getData() const; + + virtual int compare(const ObjectBase& other) const { + return -other.compare(*this); + } + + virtual int compare(const SymbolPairSymbol& other) const; + + virtual void operator>>(std::ostream&) const; + + virtual operator std::string () const; + + virtual int selfTypeId() const { + return typeId<SymbolPairSymbol>(); + } +}; + +} /* namespace alphabet */ + +namespace std { + +template<> +struct compare<alphabet::SymbolPairSymbol> { + int operator()(const alphabet::SymbolPairSymbol& first, const alphabet::SymbolPairSymbol& second) const { + return first.compare(second); + } +}; + +} /* namespace std */ + +#endif /* SYMBOL_PAIR_SYMBOL_H_ */ + diff --git a/alib2data/src/alphabet/SymbolSetSymbol.cpp b/alib2data/src/alphabet/SymbolSetSymbol.cpp new file mode 100644 index 0000000000..179bb9d6be --- /dev/null +++ b/alib2data/src/alphabet/SymbolSetSymbol.cpp @@ -0,0 +1,59 @@ +/* + * SymbolSetSymbol.cpp + * + * Created on: Mar 26, 2013 + * Author: Jan Travicek + */ + +#include "SymbolSetSymbol.h" +#include "../std/set.hpp" +#include <sstream> + +namespace alphabet { + +SymbolSetSymbol::SymbolSetSymbol(const std::set<Symbol>& symbol) : symbol(symbol) { + +} + +SymbolSetSymbol::SymbolSetSymbol(std::set<Symbol>&& symbol) : symbol(std::move(symbol)) { + +} + +SymbolBase* SymbolSetSymbol::clone() const { + return new SymbolSetSymbol(*this); +} + +SymbolBase* SymbolSetSymbol::plunder() && { + return new SymbolSetSymbol(std::move(*this)); +} + +const std::set<Symbol>& SymbolSetSymbol::getData() const { + return symbol; +} + +int SymbolSetSymbol::compare(const SymbolSetSymbol& other) const { + std::compare<std::set<Symbol>> comp; + return comp(symbol, other.symbol); +} + +void SymbolSetSymbol::operator>>(std::ostream& out) const { + out << "(SymbolSetSymbol " << symbol << ")"; +} + +SymbolSetSymbol::operator std::string() const { + std::stringstream ss; + ss << "{"; + bool first = true; + for(const Symbol& subSymbol : symbol) { + if(!first) + ss << ", "; + else + first = false; + ss << (std::string) subSymbol; + } + ss << "}"; + return std::move(ss).str(); +} + +} /* namespace alphabet */ + diff --git a/alib2data/src/alphabet/SymbolSetSymbol.h b/alib2data/src/alphabet/SymbolSetSymbol.h new file mode 100644 index 0000000000..a07cebf680 --- /dev/null +++ b/alib2data/src/alphabet/SymbolSetSymbol.h @@ -0,0 +1,74 @@ +/* + * SymbolSetSymbol.h + * + * Created on: Mar 26, 2013 + * Author: Jan Travnicek + */ + +#ifndef SYMBOL_SET_SYMBOL_H_ +#define SYMBOL_SET_SYMBOL_H_ + +#include <string> +#include <ostream> + +#include "Symbol.h" +#include "SymbolBase.h" +#include <set> + +namespace alphabet { + +/** + * Represents symbol in an alphabet. + */ +class SymbolSetSymbol : public std::acceptor<SymbolSetSymbol, VisitableSymbolBase, std::acceptor<SymbolSetSymbol, alib::VisitableObjectBase, SymbolBase> > { +protected: + std::set<Symbol> symbol; + +public: + /** + * Creates new symbol with given name. + * @param symbol name of the symbol + */ + explicit SymbolSetSymbol(const std::set<Symbol>& symbol); + + explicit SymbolSetSymbol(std::set<Symbol>&& symbol); + + virtual SymbolBase* clone() const; + + virtual SymbolBase* plunder() &&; + + /** + * @return name of the symbol + */ + const std::set<Symbol>& getData() const; + + virtual int compare(const ObjectBase& other) const { + return -other.compare(*this); + } + + virtual int compare(const SymbolSetSymbol& other) const; + + virtual void operator>>(std::ostream&) const; + + virtual operator std::string () const; + + virtual int selfTypeId() const { + return typeId<SymbolSetSymbol>(); + } +}; + +} /* namespace alphabet */ + +namespace std { + +template<> +struct compare<alphabet::SymbolSetSymbol> { + int operator()(const alphabet::SymbolSetSymbol& first, const alphabet::SymbolSetSymbol& second) const { + return first.compare(second); + } +}; + +} /* namespace std */ + +#endif /* SYMBOL_SET_SYMBOL_H_ */ + diff --git a/alib2data/src/alphabet/SymbolToStringComposer.cpp b/alib2data/src/alphabet/SymbolToStringComposer.cpp index a3edb6a536..1929dcbc39 100644 --- a/alib2data/src/alphabet/SymbolToStringComposer.cpp +++ b/alib2data/src/alphabet/SymbolToStringComposer.cpp @@ -12,6 +12,8 @@ #include "LabeledSymbol.h" #include "RankedSymbol.h" #include "RankedBarSymbol.h" +#include "SymbolPairSymbol.h" +#include "SymbolSetSymbol.h" namespace alphabet { @@ -69,6 +71,31 @@ void SymbolToStringComposer::Visit(void* userData, const SubtreeWildcardSymbol&) out << "#S"; } +void SymbolToStringComposer::Visit(void* userData, const SymbolSetSymbol& symbol) { + std::stringstream &out = *((std::stringstream*) userData); + + out << '['; + bool first = true; + for(const Symbol& innerSymbol : symbol.getData()) { + if(!first) + out << ", "; + else + first = false; + innerSymbol.getData().Accept(userData, *this); + } + out << ']'; +} + +void SymbolToStringComposer::Visit(void* userData, const SymbolPairSymbol& symbol) { + std::stringstream &out = *((std::stringstream*) userData); + + out << '<'; + symbol.getData().first.getData().Accept(userData, *this); + out << ", "; + symbol.getData().second.getData().Accept(userData, *this); + 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 bd40f2e172..84cc336fb7 100644 --- a/alib2data/src/alphabet/SymbolToStringComposer.h +++ b/alib2data/src/alphabet/SymbolToStringComposer.h @@ -27,6 +27,8 @@ class SymbolToStringComposer : public VisitableSymbolBase::visitor_type { void Visit(void*, const BarSymbol& symbol); void Visit(void*, const RankedBarSymbol& symbol); void Visit(void*, const SubtreeWildcardSymbol& symbol); + void Visit(void*, const SymbolPairSymbol& symbol); + void Visit(void*, const SymbolSetSymbol& symbol); public: /** diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.cpp b/alib2data/src/alphabet/SymbolToXMLComposer.cpp index b3ef0a2025..7bf62d747f 100644 --- a/alib2data/src/alphabet/SymbolToXMLComposer.cpp +++ b/alib2data/src/alphabet/SymbolToXMLComposer.cpp @@ -83,4 +83,23 @@ std::list<sax::Token> SymbolToXMLComposer::compose(const SubtreeWildcardSymbol&) return out; } +std::list<sax::Token> SymbolToXMLComposer::compose(const SymbolSetSymbol& symbol) const { + std::list<sax::Token> out; + out.push_back(sax::Token(alib::Names::ALPHABET_SYMBOL_SET_SYMBOL, sax::Token::TokenType::START_ELEMENT)); + for(const Symbol& innerSymbol : symbol.getData()) { + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(innerSymbol)); + } + out.push_back(sax::Token(alib::Names::ALPHABET_SYMBOL_SET_SYMBOL, sax::Token::TokenType::END_ELEMENT)); + return out; +} + +std::list<sax::Token> SymbolToXMLComposer::compose(const SymbolPairSymbol& symbol) const { + std::list<sax::Token> out; + out.push_back(sax::Token(alib::Names::ALPHABET_SYMBOL_PAIR_SYMBOL, sax::Token::TokenType::START_ELEMENT)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol.getData().first)); + out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol.getData().second)); + out.push_back(sax::Token(alib::Names::ALPHABET_SYMBOL_PAIR_SYMBOL, sax::Token::TokenType::END_ELEMENT)); + return out; +} + } /* namespace alphabet */ diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.h b/alib2data/src/alphabet/SymbolToXMLComposer.h index 9403cacac1..6db563aec2 100644 --- a/alib2data/src/alphabet/SymbolToXMLComposer.h +++ b/alib2data/src/alphabet/SymbolToXMLComposer.h @@ -48,6 +48,8 @@ class SymbolToXMLComposer { std::list<sax::Token> compose(const BarSymbol& symbol) const; std::list<sax::Token> compose(const RankedBarSymbol& symbol) const; 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; template<typename T> friend class alib::api; }; diff --git a/alib2data/src/object/ObjectBase.h b/alib2data/src/object/ObjectBase.h index 797e5ae18a..c4a21b2acc 100644 --- a/alib2data/src/object/ObjectBase.h +++ b/alib2data/src/object/ObjectBase.h @@ -99,6 +99,8 @@ class RankedSymbol; class BarSymbol; class RankedBarSymbol; class SubtreeWildcardSymbol; +class SymbolSetSymbol; +class SymbolPairSymbol; } @@ -131,7 +133,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::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol, alphabet::SubtreeWildcardSymbol, alphabet::SymbolPairSymbol, alphabet::SymbolSetSymbol, container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap, primitive::String, primitive::Integer, primitive::Character > VisitableObjectBase; @@ -146,7 +148,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::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol, alphabet::SubtreeWildcardSymbol, alphabet::SymbolPairSymbol, alphabet::SymbolSetSymbol, container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap, primitive::String, primitive::Integer, primitive::Character >, public VisitableObjectBase { -- GitLab