diff --git a/alib2/src/regexp/Alternation.cpp b/alib2/src/regexp/Alternation.cpp index 4c9fa359f101299e963c28123714bce1e9353726..1e37e3544600d96874fbec007ed0240be70aff49 100644 --- a/alib2/src/regexp/Alternation.cpp +++ b/alib2/src/regexp/Alternation.cpp @@ -15,7 +15,7 @@ Alternation::Alternation() { Alternation::Alternation(const Alternation& other) { for (const auto& element : other.elements) { - elements.push_back(element->clone()); + elements.insert(element->clone()); } } @@ -46,11 +46,11 @@ Alternation::~Alternation() noexcept { elements.clear(); } -std::vector<RegExpElement*>& Alternation::getElements() { +std::set<RegExpElement*, RegExpElement::PointerLess>& Alternation::getElements() { return elements; } -const std::vector<RegExpElement*>& Alternation::getElements() const { +const std::set<RegExpElement*, RegExpElement::PointerLess>& Alternation::getElements() const { return elements; } diff --git a/alib2/src/regexp/Alternation.h b/alib2/src/regexp/Alternation.h index f26963cab25f4e08853f87253f16d6f2894f0817..f417d3ad9eab91ab0fac33a29366dfadc9fffc27 100644 --- a/alib2/src/regexp/Alternation.h +++ b/alib2/src/regexp/Alternation.h @@ -8,7 +8,7 @@ #ifndef ALTERNATION_H_ #define ALTERNATION_H_ -#include <vector> +#include <set> #include "RegExpElement.h" namespace regexp { @@ -24,7 +24,7 @@ protected: */ virtual RegExpElement* clone() const; - std::vector<RegExpElement*> elements; + std::set<RegExpElement*, RegExpElement::PointerLess> elements; public: Alternation(); Alternation(const Alternation& other); @@ -36,12 +36,12 @@ public: /** * @return list of operands */ - std::vector<RegExpElement*>& getElements(); + std::set<RegExpElement*, RegExpElement::PointerLess>& getElements(); /** * @return list of operands */ - const std::vector<RegExpElement*>& getElements() const; + const std::set<RegExpElement*, RegExpElement::PointerLess>& getElements() const; virtual bool operator<(const RegExpElement&) const; virtual bool operator==(const RegExpElement&) const; diff --git a/alib2/src/regexp/Concatenation.cpp b/alib2/src/regexp/Concatenation.cpp index bc0db201f3db261677fbb4b801380c50bd73b159..b7a1e29bb48d77950aa82746786774fd9589fdd3 100644 --- a/alib2/src/regexp/Concatenation.cpp +++ b/alib2/src/regexp/Concatenation.cpp @@ -49,7 +49,7 @@ std::vector<RegExpElement*>& Concatenation::getElements() { return elements; } -const std::vector<const RegExpElement*>& Concatenation::getElements() const { +const std::vector<RegExpElement*>& Concatenation::getElements() const { return elements; } diff --git a/alib2/src/regexp/Concatenation.h b/alib2/src/regexp/Concatenation.h index de3b3c086bbbfba725f75993f2cce608d6f17493..648e45b1f871e9a78f6d3257aed634e3a17a8c20 100644 --- a/alib2/src/regexp/Concatenation.h +++ b/alib2/src/regexp/Concatenation.h @@ -41,7 +41,7 @@ public: /** * @return list of operands */ - const std::vector<const RegExpElement*>& getElements() const; + const std::vector<RegExpElement*>& getElements() const; virtual bool operator<(const RegExpElement&) const; virtual bool operator==(const RegExpElement&) const; diff --git a/alib2/src/regexp/RegExpElement.h b/alib2/src/regexp/RegExpElement.h index 57207bf229c808e5e443a1be9ae4d58c6a26defe..2cea01515bb32547dc617602301eca14ff3982d1 100644 --- a/alib2/src/regexp/RegExpElement.h +++ b/alib2/src/regexp/RegExpElement.h @@ -25,6 +25,13 @@ class RegExpEpsilon; * Abstract class representing element in the regular expression. Can be operator or symbol. */ class RegExpElement : virtual public std::elementBase<std::visitor<Alternation, Concatenation, Iteration, RegExpSymbol, RegExpEmpty, RegExpEpsilon> > { +protected: + class PointerLess { + public: + bool operator()(const RegExpElement* a, const RegExpElement* b) { + return *a < *b; + } + }; public: /** * Creates copy of the element. diff --git a/alib2/src/regexp/RegExpFromXMLParser.cpp b/alib2/src/regexp/RegExpFromXMLParser.cpp index a7a55400b7a21cb80830278ca8854ffea3686bff..d811fb692ab0f4137e356cbbf42dad7c7b481e5d 100644 --- a/alib2/src/regexp/RegExpFromXMLParser.cpp +++ b/alib2/src/regexp/RegExpFromXMLParser.cpp @@ -41,7 +41,11 @@ Alternation* RegExpFromXMLParser::parseAlternation(std::list<sax::Token>& input) popToken(input, sax::Token::START_ELEMENT, "alternation"); Alternation* alternation = new Alternation; - parseContent(input, alternation->getElements()); + while (true) { + RegExpElement* element = parseElement(input); + if(!element) break; + alternation->getElements().insert(element); + } popToken(input, sax::Token::END_ELEMENT, "alternation"); return alternation; @@ -51,7 +55,11 @@ Concatenation* RegExpFromXMLParser::parseConcatenation(std::list<sax::Token>& in popToken(input, sax::Token::START_ELEMENT, "concatenation"); Concatenation* concatenation = new Concatenation(); - parseContent(input, concatenation->getElements()); + while (true) { + RegExpElement* element = parseElement(input); + if(!element) break; + concatenation->getElements().push_back(element); + } popToken(input, sax::Token::END_ELEMENT, "concatenation"); return concatenation; @@ -70,14 +78,6 @@ Iteration* RegExpFromXMLParser::parseIteration(std::list<sax::Token>& input) { return iteration; } -void RegExpFromXMLParser::parseContent(std::list<sax::Token>& input, std::list<RegExpElement*>& elements) { - while (true) { - RegExpElement* element = parseElement(input); - if(!element) return; - elements.push_back(element); - } -} - RegExpEpsilon* RegExpFromXMLParser::parseEpsilon(std::list<sax::Token>& input) { popToken(input, sax::Token::START_ELEMENT, "epsilon"); diff --git a/alib2/src/regexp/RegExpFromXMLParser.h b/alib2/src/regexp/RegExpFromXMLParser.h index a6cbac18d6b3af9398267bc0404e35deff8e547f..7fa76433981735c508936a468dee5b2ced3d361d 100644 --- a/alib2/src/regexp/RegExpFromXMLParser.h +++ b/alib2/src/regexp/RegExpFromXMLParser.h @@ -18,7 +18,6 @@ namespace regexp { * Parser used to get RegExp from XML parsed into list of tokens. */ class RegExpFromXMLParser { - void parseContent(std::list<sax::Token>& input, std::list<RegExpElement*>& elements); RegExpElement* parseElement(std::list<sax::Token>& input); RegExpEpsilon* parseEpsilon(std::list<sax::Token>& input);