diff --git a/alib2data/src/XmlApi.cpp b/alib2data/src/XmlApi.cpp index 9315f048d6e0b2b94844bde58a7900ccfac86589..2598b4b38fd4b46f48dee9b8be9125a6504c8767 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 32b6e07f82ca0be9fa5f3b7257ef1e3a2a37e8c9..e2f1fdefda89634f0edc6ded28a070c7a072b7c5 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 7e44b3f31f913e34df6c86068361ccce3d249b07..49784c554b8f3d5cba5e361abadf0ca56f46cb3b 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 c3e7bf51f0d7ea52df36431a0b7ddcdf6f0927cc..cfdd8efada2db9bf212f46c4ffc42f9e602f4456 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 670faf1358834121077f26a67b93cdcaf6a8211e..6b7b586b81e843ddb2748beb3c715c9f7ab2822e 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 c37d1a98be14a69a5b6ba0f54e073d7d44cdbbfa..22ed3b9ddea97825495d86ebaec486c5cf1c5d98 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 0dfa598c3a3f2a44063c3d05d36933f7f3537880..2fce739895c63ecf72c1bf7a387808a3820a5d85 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 6da95cc6107a61628bd9d1f9bb094ec599fc67b2..12eda41d0c909fc8bebc1abfa33a66b5c83ca953 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 55af7382964dc1c7b43aacaf8eb09c9e849beefc..a576f650ca57a2eaf28fe51f3f675fc5a13d6f78 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 7685dbe54548053443521bdcdc9a2144606857f1..b21e0b423c2ab9171c8c7d375c2f990d9b03df4d 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 15642f74ed920e92f8daedf4cb8f112c9c14e7a4..cf8701a3c112069552d6aaf6eac03f1d061634a1 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 0000000000000000000000000000000000000000..faeaeb03587fcafe29c0723fb9393be7219081ad --- /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 0000000000000000000000000000000000000000..f1ed01f07dc90bf1cbb135abf23116e1d95284d2 --- /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 3b48ca0e6bee183e2cb53e1f9d4ec65014aaf358..f6649b1100bc5956834dd3fae82ae6457c831c0a 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