From ffd1d6b6c7e320046889fff9db9dfc974194387c Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Wed, 22 Jul 2015 16:41:44 +0200 Subject: [PATCH] prepare regexp refactoring --- alib2data/src/regexp/RegExpFromXMLParser.cpp | 25 +++++++------------- alib2data/src/regexp/RegExpFromXMLParser.h | 4 ++-- alib2data/src/regexp/RegExpToXMLComposer.cpp | 24 ++++++++----------- alib2data/src/regexp/RegExpToXMLComposer.h | 1 + 4 files changed, 21 insertions(+), 33 deletions(-) diff --git a/alib2data/src/regexp/RegExpFromXMLParser.cpp b/alib2data/src/regexp/RegExpFromXMLParser.cpp index 0924675f56..36fd319c9c 100644 --- a/alib2data/src/regexp/RegExpFromXMLParser.cpp +++ b/alib2data/src/regexp/RegExpFromXMLParser.cpp @@ -43,11 +43,10 @@ bool RegExpFromXMLParser::first(const std::deque<sax::Token>::const_iterator& in UnboundedRegExp RegExpFromXMLParser::parseUnboundedRegExp(std::deque<sax::Token>::iterator& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::REGEXP_UNBOUNDED_REGEXP); - UnboundedRegExp regexp; - parseAlphabet(input, regexp); + std::set<alphabet::Symbol> alphabet = parseAlphabet(input); UnboundedRegExpElement* element = parseUnboundedRegExpElement(input); - regexp.setRegExp(std::move(*element)); + UnboundedRegExp regexp(std::move(alphabet), std::move(*element)); delete element; popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::REGEXP_UNBOUNDED_REGEXP); @@ -57,31 +56,23 @@ UnboundedRegExp RegExpFromXMLParser::parseUnboundedRegExp(std::deque<sax::Token> FormalRegExp RegExpFromXMLParser::parseFormalRegExp(std::deque<sax::Token>::iterator& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::REGEXP_FORMAL_REGEXP); - FormalRegExp regexp; - parseAlphabet(input, regexp); - + std::set<alphabet::Symbol> alphabet = parseAlphabet(input); FormalRegExpElement* element = parseFormalRegExpElement(input); - regexp.setRegExp(std::move(*element)); + FormalRegExp regexp(std::move(alphabet), std::move(*element)); delete element; popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::REGEXP_FORMAL_REGEXP); return regexp; } -void RegExpFromXMLParser::parseAlphabet(std::deque<sax::Token>::iterator& input, UnboundedRegExp& regexp) const { - popToken(input, sax::Token::TokenType::START_ELEMENT, "alphabet"); - while (isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { - regexp.addSymbolToAlphabet(alib::xmlApi<alphabet::Symbol>::parse(input)); - } - popToken(input, sax::Token::TokenType::END_ELEMENT, "alphabet"); -} - -void RegExpFromXMLParser::parseAlphabet(std::deque<sax::Token>::iterator& input, FormalRegExp& regexp) const { +std::set<alphabet::Symbol> RegExpFromXMLParser::parseAlphabet(std::deque<sax::Token>::iterator& input) const { + std::set<alphabet::Symbol> alphabet; popToken(input, sax::Token::TokenType::START_ELEMENT, "alphabet"); while (isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { - regexp.addSymbolToAlphabet(alib::xmlApi<alphabet::Symbol>::parse(input)); + alphabet.insert(alib::xmlApi<alphabet::Symbol>::parse(input)); } popToken(input, sax::Token::TokenType::END_ELEMENT, "alphabet"); + return alphabet; } UnboundedRegExpElement* RegExpFromXMLParser::parseUnboundedRegExpElement(std::deque<sax::Token>::iterator& input) const { diff --git a/alib2data/src/regexp/RegExpFromXMLParser.h b/alib2data/src/regexp/RegExpFromXMLParser.h index 4fd2a20189..70e107f60d 100644 --- a/alib2data/src/regexp/RegExpFromXMLParser.h +++ b/alib2data/src/regexp/RegExpFromXMLParser.h @@ -11,6 +11,7 @@ #include "../sax/FromXMLParserHelper.h" #include <set> #include "RegExpFeatures.h" +#include "../alphabet/SymbolFeatures.h" #include "../XmlApiBase.h" namespace regexp { @@ -23,8 +24,7 @@ public: RegExpFromXMLParser() {} private: - void parseAlphabet(std::deque<sax::Token>::iterator& input, UnboundedRegExp& regexp) const; - void parseAlphabet(std::deque<sax::Token>::iterator& input, FormalRegExp& regexp) const; + std::set<alphabet::Symbol> parseAlphabet(std::deque<sax::Token>::iterator& input) const; UnboundedRegExpElement* parseUnboundedRegExpElement(std::deque<sax::Token>::iterator& input) const; diff --git a/alib2data/src/regexp/RegExpToXMLComposer.cpp b/alib2data/src/regexp/RegExpToXMLComposer.cpp index d9b6ccb8c2..782db018be 100644 --- a/alib2data/src/regexp/RegExpToXMLComposer.cpp +++ b/alib2data/src/regexp/RegExpToXMLComposer.cpp @@ -120,28 +120,24 @@ void RegExpToXMLComposer::compose(std::deque<sax::Token>& out, const RegExpBase& regexp.Accept((void*) &out, alib::ToXMLComposers::toXMLComposers); } +void RegExpToXMLComposer::composeAlphabet(std::deque<sax::Token>& out, const std::set<alphabet::Symbol>& alphabet) const { + out.emplace_back("alphabet", sax::Token::TokenType::START_ELEMENT); + for (const auto& symbol : alphabet) { + alib::xmlApi<alphabet::Symbol>::compose(out, symbol); + } + out.emplace_back("alphabet", sax::Token::TokenType::END_ELEMENT); +} + void RegExpToXMLComposer::compose(std::deque<sax::Token>& out, const UnboundedRegExp& regexp) const { out.emplace_back(alib::Names::REGEXP_UNBOUNDED_REGEXP, sax::Token::TokenType::START_ELEMENT); - { - out.emplace_back("alphabet", sax::Token::TokenType::START_ELEMENT); - for (const auto& symbol: regexp.getAlphabet()) { - alib::xmlApi<alphabet::Symbol>::compose(out, symbol); - } - out.emplace_back("alphabet", sax::Token::TokenType::END_ELEMENT); - } + composeAlphabet(out, regexp.getAlphabet()); regexp.getRegExp().Accept((void*) &out, *this); out.emplace_back(alib::Names::REGEXP_UNBOUNDED_REGEXP, sax::Token::TokenType::END_ELEMENT); } void RegExpToXMLComposer::compose(std::deque<sax::Token>& out, const FormalRegExp& regexp) const { out.emplace_back(alib::Names::REGEXP_FORMAL_REGEXP, sax::Token::TokenType::START_ELEMENT); - { - out.emplace_back("alphabet", sax::Token::TokenType::START_ELEMENT); - for (const auto& symbol: regexp.getAlphabet()) { - alib::xmlApi<alphabet::Symbol>::compose(out, symbol); - } - out.emplace_back("alphabet", sax::Token::TokenType::END_ELEMENT); - } + composeAlphabet(out, regexp.getAlphabet()); regexp.getRegExp().Accept((void*) &out, *this); out.emplace_back(alib::Names::REGEXP_FORMAL_REGEXP, sax::Token::TokenType::END_ELEMENT); } diff --git a/alib2data/src/regexp/RegExpToXMLComposer.h b/alib2data/src/regexp/RegExpToXMLComposer.h index ed7fd90b0b..9d2f5ce8a0 100644 --- a/alib2data/src/regexp/RegExpToXMLComposer.h +++ b/alib2data/src/regexp/RegExpToXMLComposer.h @@ -40,6 +40,7 @@ private: void Visit(void*, const FormalRegExpEpsilon& epsilon) const; void Visit(void*, const FormalRegExpEmpty& empty) const; + void composeAlphabet(std::deque<sax::Token>& out, const std::set<alphabet::Symbol>& alphabet) const; /** * Composes XML token representation of RegExp. -- GitLab