From a62ccb5b7135cfeedef34e8b451239e54d64532d Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Wed, 27 May 2015 10:45:19 +0200 Subject: [PATCH] +variablesBarSymbol --- alib2data/src/XmlApi.cpp | 17 ++++++ alib2data/src/XmlApi.hpp | 9 +++ alib2data/src/alphabet/NextSymbol.cpp | 8 +++ alib2data/src/alphabet/NextSymbol.h | 1 + alib2data/src/alphabet/SymbolFeatures.h | 1 + .../src/alphabet/SymbolFromXMLParser.cpp | 15 ++++- alib2data/src/alphabet/SymbolFromXMLParser.h | 2 + .../src/alphabet/SymbolToStringComposer.cpp | 6 ++ .../src/alphabet/SymbolToStringComposer.h | 1 + .../src/alphabet/SymbolToXMLComposer.cpp | 5 ++ alib2data/src/alphabet/SymbolToXMLComposer.h | 1 + alib2data/src/alphabet/VariablesBarSymbol.cpp | 38 ++++++++++++ alib2data/src/alphabet/VariablesBarSymbol.h | 59 +++++++++++++++++++ alib2data/src/object/ObjectBase.h | 3 +- 14 files changed, 162 insertions(+), 4 deletions(-) create mode 100644 alib2data/src/alphabet/VariablesBarSymbol.cpp create mode 100644 alib2data/src/alphabet/VariablesBarSymbol.h diff --git a/alib2data/src/XmlApi.cpp b/alib2data/src/XmlApi.cpp index 9315f048d6..2598b4b38f 100644 --- a/alib2data/src/XmlApi.cpp +++ b/alib2data/src/XmlApi.cpp @@ -49,6 +49,7 @@ const std::string Names::ALPHABET_BOTTOM_OF_THE_STACK_SYMBOL = "BottomOfTheStack const std::string Names::ALPHABET_END_SYMBOL = "EndSymbol"; const std::string Names::ALPHABET_RANKED_SYMBOL = "RankedSymbol"; const std::string Names::ALPHABET_BAR_SYMBOL = "BarSymbol"; +const std::string Names::ALPHABET_VARIABLES_BAR_SYMBOL = "VariablesBarSymbol"; 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"; @@ -306,6 +307,18 @@ void xmlApi<alphabet::BarSymbol>::compose(std::deque<sax::Token>& output, const ToXMLComposers::symbolComposer.compose(output, data); } +alphabet::VariablesBarSymbol xmlApi<alphabet::VariablesBarSymbol>::parse(std::deque<sax::Token>& input) { + return FromXMLParsers::symbolParser.parseVariablesBarSymbol(input); +} + +bool xmlApi<alphabet::VariablesBarSymbol>::first(const std::deque<sax::Token>& input) { + return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::ALPHABET_VARIABLES_BAR_SYMBOL); +} + +void xmlApi<alphabet::VariablesBarSymbol>::compose(std::deque<sax::Token>& output, const alphabet::VariablesBarSymbol& data) { + ToXMLComposers::symbolComposer.compose(output, data); +} + alphabet::SubtreeWildcardSymbol xmlApi<alphabet::SubtreeWildcardSymbol>::parse(std::deque<sax::Token>& input) { return FromXMLParsers::symbolParser.parseSubtreeWildcardSymbol(input); } @@ -1273,6 +1286,10 @@ void ToXMLComposers::Visit(void* data, const alphabet::BarSymbol& symbol) const xmlApi<alphabet::BarSymbol>::compose(*((std::deque<sax::Token>*) data), symbol); } +void ToXMLComposers::Visit(void* data, const alphabet::VariablesBarSymbol& symbol) const { + xmlApi<alphabet::VariablesBarSymbol>::compose(*((std::deque<sax::Token>*) data), symbol); +} + void ToXMLComposers::Visit(void* data, const alphabet::SubtreeWildcardSymbol& symbol) const { xmlApi<alphabet::SubtreeWildcardSymbol>::compose(*((std::deque<sax::Token>*) data), symbol); } diff --git a/alib2data/src/XmlApi.hpp b/alib2data/src/XmlApi.hpp index 32b6e07f82..e2f1fdefda 100644 --- a/alib2data/src/XmlApi.hpp +++ b/alib2data/src/XmlApi.hpp @@ -50,6 +50,7 @@ public: const static std::string ALPHABET_END_SYMBOL; const static std::string ALPHABET_RANKED_SYMBOL; const static std::string ALPHABET_BAR_SYMBOL; + const static std::string ALPHABET_VARIABLES_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; @@ -272,6 +273,13 @@ struct xmlApi<alphabet::BarSymbol> { static void compose(std::deque<sax::Token>& output, const alphabet::BarSymbol& data); }; +template<> +struct xmlApi<alphabet::VariablesBarSymbol> { + static alphabet::VariablesBarSymbol parse(std::deque<sax::Token>& input); + static bool first(const std::deque<sax::Token>& input); + static void compose(std::deque<sax::Token>& output, const alphabet::VariablesBarSymbol& data); +}; + template<> struct xmlApi<alphabet::SubtreeWildcardSymbol> { static alphabet::SubtreeWildcardSymbol parse(std::deque<sax::Token>& input); @@ -861,6 +869,7 @@ private: void Visit(void*, const alphabet::EndSymbol& symbol) const; void Visit(void*, const alphabet::RankedSymbol& symbol) const; void Visit(void*, const alphabet::BarSymbol& symbol) const; + void Visit(void*, const alphabet::VariablesBarSymbol& 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; diff --git a/alib2data/src/alphabet/NextSymbol.cpp b/alib2data/src/alphabet/NextSymbol.cpp index 7e44b3f31f..49784c554b 100644 --- a/alib2data/src/alphabet/NextSymbol.cpp +++ b/alib2data/src/alphabet/NextSymbol.cpp @@ -18,6 +18,7 @@ #include "EndSymbol.h" #include "StartSymbol.h" #include "BarSymbol.h" +#include "VariablesBarSymbol.h" #include "SubtreeWildcardSymbol.h" namespace alphabet { @@ -71,6 +72,13 @@ void NextSymbol::Visit(void* userData, const BarSymbol& symbol) { out = new Symbol(UniqueSymbol(Symbol(symbol), newId)); } +void NextSymbol::Visit(void* userData, const VariablesBarSymbol& symbol) { + Symbol* &out = *((Symbol**) userData); + + primitive::Integer newId(0); + out = new Symbol(UniqueSymbol(Symbol(symbol), newId)); +} + void NextSymbol::Visit(void* userData, const SubtreeWildcardSymbol& symbol) { Symbol* &out = *((Symbol**) userData); diff --git a/alib2data/src/alphabet/NextSymbol.h b/alib2data/src/alphabet/NextSymbol.h index c3e7bf51f0..cfdd8efada 100644 --- a/alib2data/src/alphabet/NextSymbol.h +++ b/alib2data/src/alphabet/NextSymbol.h @@ -25,6 +25,7 @@ class NextSymbol : public VisitableSymbolBase::visitor_type { void Visit(void*, const StartSymbol& symbol); void Visit(void*, const RankedSymbol& symbol); void Visit(void*, const BarSymbol& symbol); + void Visit(void*, const VariablesBarSymbol& symbol); void Visit(void*, const SubtreeWildcardSymbol& symbol); void Visit(void*, const SymbolPairSymbol& symbol); void Visit(void*, const SymbolSetSymbol& symbol); diff --git a/alib2data/src/alphabet/SymbolFeatures.h b/alib2data/src/alphabet/SymbolFeatures.h index 670faf1358..6b7b586b81 100644 --- a/alib2data/src/alphabet/SymbolFeatures.h +++ b/alib2data/src/alphabet/SymbolFeatures.h @@ -17,6 +17,7 @@ enum class FEATURES { END, RANKED, BAR, + VARIABLES_BAR, SUBTREE_WILDCARD, SYMBOL_SET_SYMBOL, SYMBOL_PAIR_SYMBOL, diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.cpp b/alib2data/src/alphabet/SymbolFromXMLParser.cpp index c37d1a98be..22ed3b9dde 100644 --- a/alib2data/src/alphabet/SymbolFromXMLParser.cpp +++ b/alib2data/src/alphabet/SymbolFromXMLParser.cpp @@ -15,7 +15,7 @@ namespace alphabet { Symbol SymbolFromXMLParser::parseSymbol(std::deque<sax::Token>& input) const { - return parseSymbol(input, std::set<FEATURES>({FEATURES::LABELED, FEATURES::BLANK, FEATURES::BOTTOM, FEATURES::END, FEATURES::RANKED, FEATURES::BAR, FEATURES::SUBTREE_WILDCARD, FEATURES::SYMBOL_PAIR_SYMBOL, FEATURES::SYMBOL_SET_SYMBOL, FEATURES::UNIQUE_SYMBOL, FEATURES::START})); + return parseSymbol(input, std::set<FEATURES>({FEATURES::LABELED, FEATURES::BLANK, FEATURES::BOTTOM, FEATURES::END, FEATURES::RANKED, FEATURES::BAR, FEATURES::VARIABLES_BAR, FEATURES::SUBTREE_WILDCARD, FEATURES::SYMBOL_PAIR_SYMBOL, FEATURES::SYMBOL_SET_SYMBOL, FEATURES::UNIQUE_SYMBOL, FEATURES::START})); } Symbol SymbolFromXMLParser::parseSymbol(std::deque<sax::Token>& input, const std::set<FEATURES>& features) const { @@ -40,6 +40,9 @@ Symbol SymbolFromXMLParser::parseSymbol(std::deque<sax::Token>& input, const std } else if(alib::xmlApi<BarSymbol>::first(input)) { if(!features.count(FEATURES::BAR)) throw exception::AlibException(); return Symbol(parseBarSymbol(input)); + } else if(alib::xmlApi<VariablesBarSymbol>::first(input)) { + if(!features.count(FEATURES::VARIABLES_BAR)) throw exception::AlibException(); + return Symbol(parseVariablesBarSymbol(input)); } else if(alib::xmlApi<SubtreeWildcardSymbol>::first(input)) { if(!features.count(FEATURES::SUBTREE_WILDCARD)) throw exception::AlibException(); return Symbol(parseSubtreeWildcardSymbol(input)); @@ -53,12 +56,12 @@ Symbol SymbolFromXMLParser::parseSymbol(std::deque<sax::Token>& input, const std if(!features.count(FEATURES::UNIQUE_SYMBOL)) throw exception::AlibException(); return Symbol(parseUniqueSymbol(input)); } else { - throw sax::ParserException(sax::Token("LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, StartSymbol, RankedSymbol, BarSymbol, SubtreeWildcardSymbol, SymbolPairSymbol, SymbolSetSymbol, UniqueSymbol", sax::Token::TokenType::START_ELEMENT), input.front()); + throw sax::ParserException(sax::Token("LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, StartSymbol, RankedSymbol, BarSymbol, VariablesBar, SubtreeWildcardSymbol, SymbolPairSymbol, SymbolSetSymbol, UniqueSymbol", sax::Token::TokenType::START_ELEMENT), input.front()); } } bool SymbolFromXMLParser::first(const std::deque<sax::Token>& input) const { - if(alib::xmlApi<LabeledSymbol>::first(input) || alib::xmlApi<BlankSymbol>::first(input) || alib::xmlApi<BottomOfTheStackSymbol>::first(input) || alib::xmlApi<EndSymbol>::first(input) || alib::xmlApi<StartSymbol>::first(input) || alib::xmlApi<RankedSymbol>::first(input) || alib::xmlApi<BarSymbol>::first(input) || alib::xmlApi<SubtreeWildcardSymbol>::first(input) || alib::xmlApi<SymbolPairSymbol>::first(input) || alib::xmlApi<SymbolSetSymbol>::first(input)) { + if(alib::xmlApi<LabeledSymbol>::first(input) || alib::xmlApi<BlankSymbol>::first(input) || alib::xmlApi<BottomOfTheStackSymbol>::first(input) || alib::xmlApi<EndSymbol>::first(input) || alib::xmlApi<StartSymbol>::first(input) || alib::xmlApi<RankedSymbol>::first(input) || alib::xmlApi<BarSymbol>::first(input) || alib::xmlApi<VariablesBarSymbol>::first(input) || alib::xmlApi<SubtreeWildcardSymbol>::first(input) || alib::xmlApi<SymbolPairSymbol>::first(input) || alib::xmlApi<SymbolSetSymbol>::first(input)) { return true; } else { return false; @@ -110,6 +113,12 @@ BarSymbol SymbolFromXMLParser::parseBarSymbol(std::deque<sax::Token>& input) con return BarSymbol(); } +VariablesBarSymbol SymbolFromXMLParser::parseVariablesBarSymbol(std::deque<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::ALPHABET_BAR_SYMBOL); + popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::ALPHABET_BAR_SYMBOL); + return VariablesBarSymbol(); +} + SubtreeWildcardSymbol SymbolFromXMLParser::parseSubtreeWildcardSymbol(std::deque<sax::Token>& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::ALPHABET_SUBTREE_WILDCARD_SYMBOL); popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::ALPHABET_SUBTREE_WILDCARD_SYMBOL); diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.h b/alib2data/src/alphabet/SymbolFromXMLParser.h index 0dfa598c3a..2fce739895 100644 --- a/alib2data/src/alphabet/SymbolFromXMLParser.h +++ b/alib2data/src/alphabet/SymbolFromXMLParser.h @@ -23,6 +23,7 @@ #include "LabeledSymbol.h" #include "RankedSymbol.h" #include "BarSymbol.h" +#include "VariablesBarSymbol.h" #include "SubtreeWildcardSymbol.h" #include "SymbolPairSymbol.h" #include "SymbolSetSymbol.h" @@ -55,6 +56,7 @@ private: StartSymbol parseStartSymbol(std::deque<sax::Token>& input) const; RankedSymbol parseRankedSymbol(std::deque<sax::Token>& input) const; BarSymbol parseBarSymbol(std::deque<sax::Token>& input) const; + VariablesBarSymbol parseVariablesBarSymbol(std::deque<sax::Token>& input) const; SubtreeWildcardSymbol parseSubtreeWildcardSymbol(std::deque<sax::Token>& input) const; SymbolPairSymbol parseSymbolPairSymbol(std::deque<sax::Token>& input) const; SymbolSetSymbol parseSymbolSetSymbol(std::deque<sax::Token>& input) const; diff --git a/alib2data/src/alphabet/SymbolToStringComposer.cpp b/alib2data/src/alphabet/SymbolToStringComposer.cpp index 6da95cc610..12eda41d0c 100644 --- a/alib2data/src/alphabet/SymbolToStringComposer.cpp +++ b/alib2data/src/alphabet/SymbolToStringComposer.cpp @@ -59,6 +59,12 @@ void SymbolToStringComposer::Visit(void* userData, const BarSymbol&) const { out << "#|"; } +void SymbolToStringComposer::Visit(void* userData, const VariablesBarSymbol&) const { + std::ostream &out = *((std::ostream*) userData); + + out << "#/"; +} + void SymbolToStringComposer::Visit(void* userData, const SubtreeWildcardSymbol&) const { std::ostream &out = *((std::ostream*) userData); diff --git a/alib2data/src/alphabet/SymbolToStringComposer.h b/alib2data/src/alphabet/SymbolToStringComposer.h index 55af738296..a576f650ca 100644 --- a/alib2data/src/alphabet/SymbolToStringComposer.h +++ b/alib2data/src/alphabet/SymbolToStringComposer.h @@ -28,6 +28,7 @@ private: void Visit(void*, const StartSymbol& symbol) const; void Visit(void*, const RankedSymbol& symbol) const; void Visit(void*, const BarSymbol& symbol) const; + void Visit(void*, const VariablesBarSymbol& symbol) const; void Visit(void*, const SubtreeWildcardSymbol& symbol) const; void Visit(void*, const SymbolPairSymbol& symbol) const; void Visit(void*, const SymbolSetSymbol& symbol) const; diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.cpp b/alib2data/src/alphabet/SymbolToXMLComposer.cpp index 7685dbe545..b21e0b423c 100644 --- a/alib2data/src/alphabet/SymbolToXMLComposer.cpp +++ b/alib2data/src/alphabet/SymbolToXMLComposer.cpp @@ -57,6 +57,11 @@ void SymbolToXMLComposer::compose(std::deque<sax::Token>& out, const BarSymbol&) out.emplace_back(alib::Names::ALPHABET_BAR_SYMBOL, sax::Token::TokenType::END_ELEMENT); } +void SymbolToXMLComposer::compose(std::deque<sax::Token>& out, const VariablesBarSymbol&) const { + out.emplace_back(alib::Names::ALPHABET_VARIABLES_BAR_SYMBOL, sax::Token::TokenType::START_ELEMENT); + out.emplace_back(alib::Names::ALPHABET_VARIABLES_BAR_SYMBOL, sax::Token::TokenType::END_ELEMENT); +} + void SymbolToXMLComposer::compose(std::deque<sax::Token>& out, const SubtreeWildcardSymbol&) const { out.emplace_back(alib::Names::ALPHABET_SUBTREE_WILDCARD_SYMBOL, sax::Token::TokenType::START_ELEMENT); out.emplace_back(alib::Names::ALPHABET_SUBTREE_WILDCARD_SYMBOL, sax::Token::TokenType::END_ELEMENT); diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.h b/alib2data/src/alphabet/SymbolToXMLComposer.h index 15642f74ed..cf8701a3c1 100644 --- a/alib2data/src/alphabet/SymbolToXMLComposer.h +++ b/alib2data/src/alphabet/SymbolToXMLComposer.h @@ -51,6 +51,7 @@ private: void compose(std::deque<sax::Token>& output, const StartSymbol& symbol) const; void compose(std::deque<sax::Token>& output, const RankedSymbol& symbol) const; void compose(std::deque<sax::Token>& output, const BarSymbol& symbol) const; + void compose(std::deque<sax::Token>& output, const VariablesBarSymbol& symbol) const; void compose(std::deque<sax::Token>& output, const SubtreeWildcardSymbol& symbol) const; void compose(std::deque<sax::Token>& output, const SymbolPairSymbol& symbol) const; void compose(std::deque<sax::Token>& output, const SymbolSetSymbol& symbol) const; diff --git a/alib2data/src/alphabet/VariablesBarSymbol.cpp b/alib2data/src/alphabet/VariablesBarSymbol.cpp new file mode 100644 index 0000000000..faeaeb0358 --- /dev/null +++ b/alib2data/src/alphabet/VariablesBarSymbol.cpp @@ -0,0 +1,38 @@ +/* + * VariablesBarSymbol.h + * + * Created on: Apr 10, 2013 + * Author: Jan Travnicek + */ + +#include "VariablesBarSymbol.h" + +namespace alphabet { + +VariablesBarSymbol::VariablesBarSymbol() { + +} + +SymbolBase* VariablesBarSymbol::clone() const { + return new VariablesBarSymbol(*this); +} + +SymbolBase* VariablesBarSymbol::plunder() && { + return new VariablesBarSymbol(std::move(*this)); +} + +int VariablesBarSymbol::compare(const VariablesBarSymbol&) const { + return 0; +} + +void VariablesBarSymbol::operator>>(std::ostream& out) const { + out << "(Bar symbol)"; +} + +VariablesBarSymbol::operator std::string () const { + return "|"; +} + +VariablesBarSymbol VariablesBarSymbol::BAR = VariablesBarSymbol(); + +} /* namespace alphabet */ diff --git a/alib2data/src/alphabet/VariablesBarSymbol.h b/alib2data/src/alphabet/VariablesBarSymbol.h new file mode 100644 index 0000000000..f1ed01f07d --- /dev/null +++ b/alib2data/src/alphabet/VariablesBarSymbol.h @@ -0,0 +1,59 @@ +/* + * VariablesBarSymbol.h + * + * Created on: Apr 10, 2013 + * Author: Jan Travnicek + */ + +#ifndef VARIABLES_BAR_SYMBOL_H_ +#define VARIABLES_BAR_SYMBOL_H_ + +#include "Symbol.h" + +namespace alphabet { + +/** + * Represents bar symbol for tree linearization. + */ +class VariablesBarSymbol : public std::acceptor<VariablesBarSymbol, VisitableSymbolBase, std::acceptor<VariablesBarSymbol, alib::VisitableObjectBase, SymbolBase> > { +public: + /** + * Creates a bar symbol. + * @param symbol name of the symbol + */ + explicit VariablesBarSymbol(); + + virtual SymbolBase* clone() const; + virtual SymbolBase* plunder() &&; + + virtual int compare(const ObjectBase& other) const { + return -other.compare(*this); + } + + virtual int compare(const VariablesBarSymbol& other) const; + + virtual void operator>>(std::ostream& out) const; + + virtual explicit operator std::string () const; + + virtual int selfTypeId() const { + return typeId(*this); + } + + static VariablesBarSymbol BAR; +}; + +} /* namespace alphabet */ + +namespace std { + +template<> +struct compare<alphabet::VariablesBarSymbol> { + int operator()(const alphabet::VariablesBarSymbol& first, const alphabet::VariablesBarSymbol& second) const { + return first.compare(second); + } +}; + +} /* namespace std */ + +#endif /* VARIABLES_BAR_SYMBOL_H_ */ diff --git a/alib2data/src/object/ObjectBase.h b/alib2data/src/object/ObjectBase.h index 3b48ca0e6b..f6649b1100 100644 --- a/alib2data/src/object/ObjectBase.h +++ b/alib2data/src/object/ObjectBase.h @@ -108,6 +108,7 @@ class BlankSymbol; class BottomOfTheStackSymbol; class RankedSymbol; class BarSymbol; +class VariablesBarSymbol; class SubtreeWildcardSymbol; class SymbolSetSymbol; class SymbolPairSymbol; @@ -163,7 +164,7 @@ typedef std::tuple< primitive::String, primitive::Integer, primitive::Character, typedef std::tuple< container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap > ContainerTypes; -typedef std::tuple< alphabet::EndSymbol, alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::SubtreeWildcardSymbol, alphabet::SymbolPairSymbol, alphabet::SymbolSetSymbol, alphabet::UniqueSymbol, alphabet::StartSymbol +typedef std::tuple< alphabet::EndSymbol, alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::VariablesBarSymbol, alphabet::SubtreeWildcardSymbol, alphabet::SymbolPairSymbol, alphabet::SymbolSetSymbol, alphabet::UniqueSymbol, alphabet::StartSymbol > SymbolTypes; typedef std::tuple< string::Epsilon, string::LinearString, string::CyclicString -- GitLab