Skip to content
Snippets Groups Projects
Commit ffd1d6b6 authored by Jan Trávníček's avatar Jan Trávníček
Browse files

prepare regexp refactoring

parent a18364fe
No related branches found
No related tags found
No related merge requests found
...@@ -43,11 +43,10 @@ bool RegExpFromXMLParser::first(const std::deque<sax::Token>::const_iterator& in ...@@ -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 { UnboundedRegExp RegExpFromXMLParser::parseUnboundedRegExp(std::deque<sax::Token>::iterator& input) const {
popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::REGEXP_UNBOUNDED_REGEXP); popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::REGEXP_UNBOUNDED_REGEXP);
   
UnboundedRegExp regexp; std::set<alphabet::Symbol> alphabet = parseAlphabet(input);
parseAlphabet(input, regexp);
   
UnboundedRegExpElement* element = parseUnboundedRegExpElement(input); UnboundedRegExpElement* element = parseUnboundedRegExpElement(input);
regexp.setRegExp(std::move(*element)); UnboundedRegExp regexp(std::move(alphabet), std::move(*element));
delete element; delete element;
   
popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::REGEXP_UNBOUNDED_REGEXP); popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::REGEXP_UNBOUNDED_REGEXP);
...@@ -57,31 +56,23 @@ UnboundedRegExp RegExpFromXMLParser::parseUnboundedRegExp(std::deque<sax::Token> ...@@ -57,31 +56,23 @@ UnboundedRegExp RegExpFromXMLParser::parseUnboundedRegExp(std::deque<sax::Token>
FormalRegExp RegExpFromXMLParser::parseFormalRegExp(std::deque<sax::Token>::iterator& input) const { FormalRegExp RegExpFromXMLParser::parseFormalRegExp(std::deque<sax::Token>::iterator& input) const {
popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::REGEXP_FORMAL_REGEXP); popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::REGEXP_FORMAL_REGEXP);
   
FormalRegExp regexp; std::set<alphabet::Symbol> alphabet = parseAlphabet(input);
parseAlphabet(input, regexp);
FormalRegExpElement* element = parseFormalRegExpElement(input); FormalRegExpElement* element = parseFormalRegExpElement(input);
regexp.setRegExp(std::move(*element)); FormalRegExp regexp(std::move(alphabet), std::move(*element));
delete element; delete element;
   
popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::REGEXP_FORMAL_REGEXP); popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::REGEXP_FORMAL_REGEXP);
return regexp; return regexp;
} }
   
void RegExpFromXMLParser::parseAlphabet(std::deque<sax::Token>::iterator& input, UnboundedRegExp& regexp) const { std::set<alphabet::Symbol> RegExpFromXMLParser::parseAlphabet(std::deque<sax::Token>::iterator& input) const {
popToken(input, sax::Token::TokenType::START_ELEMENT, "alphabet"); std::set<alphabet::Symbol> 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 {
popToken(input, sax::Token::TokenType::START_ELEMENT, "alphabet"); popToken(input, sax::Token::TokenType::START_ELEMENT, "alphabet");
while (isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { 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"); popToken(input, sax::Token::TokenType::END_ELEMENT, "alphabet");
return alphabet;
} }
   
UnboundedRegExpElement* RegExpFromXMLParser::parseUnboundedRegExpElement(std::deque<sax::Token>::iterator& input) const { UnboundedRegExpElement* RegExpFromXMLParser::parseUnboundedRegExpElement(std::deque<sax::Token>::iterator& input) const {
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "../sax/FromXMLParserHelper.h" #include "../sax/FromXMLParserHelper.h"
#include <set> #include <set>
#include "RegExpFeatures.h" #include "RegExpFeatures.h"
#include "../alphabet/SymbolFeatures.h"
#include "../XmlApiBase.h" #include "../XmlApiBase.h"
   
namespace regexp { namespace regexp {
...@@ -23,8 +24,7 @@ public: ...@@ -23,8 +24,7 @@ public:
RegExpFromXMLParser() {} RegExpFromXMLParser() {}
   
private: private:
void parseAlphabet(std::deque<sax::Token>::iterator& input, UnboundedRegExp& regexp) const; std::set<alphabet::Symbol> parseAlphabet(std::deque<sax::Token>::iterator& input) const;
void parseAlphabet(std::deque<sax::Token>::iterator& input, FormalRegExp& regexp) const;
   
UnboundedRegExpElement* parseUnboundedRegExpElement(std::deque<sax::Token>::iterator& input) const; UnboundedRegExpElement* parseUnboundedRegExpElement(std::deque<sax::Token>::iterator& input) const;
   
......
...@@ -120,28 +120,24 @@ void RegExpToXMLComposer::compose(std::deque<sax::Token>& out, const RegExpBase& ...@@ -120,28 +120,24 @@ void RegExpToXMLComposer::compose(std::deque<sax::Token>& out, const RegExpBase&
regexp.Accept((void*) &out, alib::ToXMLComposers::toXMLComposers); 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 { 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(alib::Names::REGEXP_UNBOUNDED_REGEXP, sax::Token::TokenType::START_ELEMENT);
{ composeAlphabet(out, regexp.getAlphabet());
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);
}
regexp.getRegExp().Accept((void*) &out, *this); regexp.getRegExp().Accept((void*) &out, *this);
out.emplace_back(alib::Names::REGEXP_UNBOUNDED_REGEXP, sax::Token::TokenType::END_ELEMENT); 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 { 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(alib::Names::REGEXP_FORMAL_REGEXP, sax::Token::TokenType::START_ELEMENT);
{ composeAlphabet(out, regexp.getAlphabet());
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);
}
regexp.getRegExp().Accept((void*) &out, *this); regexp.getRegExp().Accept((void*) &out, *this);
out.emplace_back(alib::Names::REGEXP_FORMAL_REGEXP, sax::Token::TokenType::END_ELEMENT); out.emplace_back(alib::Names::REGEXP_FORMAL_REGEXP, sax::Token::TokenType::END_ELEMENT);
} }
......
...@@ -40,6 +40,7 @@ private: ...@@ -40,6 +40,7 @@ private:
void Visit(void*, const FormalRegExpEpsilon& epsilon) const; void Visit(void*, const FormalRegExpEpsilon& epsilon) const;
void Visit(void*, const FormalRegExpEmpty& empty) 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. * Composes XML token representation of RegExp.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment