From 2d4ee215a667ca47a94de42184fac5c7d2d6c99b Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Wed, 13 Aug 2014 11:00:40 +0200 Subject: [PATCH] unify parsers --- .../src/alphabet/SymbolFromXMLParser.cpp | 28 +++---- alib2data/src/alphabet/SymbolFromXMLParser.h | 14 +++- alib2data/src/label/LabelFromXMLParser.cpp | 36 ++++++--- alib2data/src/label/LabelFromXMLParser.h | 4 + alib2data/src/regexp/RegExpFromXMLParser.cpp | 54 +++++++------ alib2data/src/regexp/RegExpFromXMLParser.h | 3 + alib2data/src/string/StringFromXMLParser.cpp | 77 ++++++++++--------- alib2data/src/string/StringFromXMLParser.h | 5 +- 8 files changed, 128 insertions(+), 93 deletions(-) diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.cpp b/alib2data/src/alphabet/SymbolFromXMLParser.cpp index cb1e5b438c..fd42a9b2d4 100644 --- a/alib2data/src/alphabet/SymbolFromXMLParser.cpp +++ b/alib2data/src/alphabet/SymbolFromXMLParser.cpp @@ -8,10 +8,6 @@ #include "SymbolFromXMLParser.h" #include "../sax/ParserException.h" -#include "BlankSymbol.h" -#include "BottomOfTheStackSymbol.h" -#include "EndSymbol.h" -#include "LabeledSymbol.h" #include "../label/Label.h" #include "../FromXMLParsers.h" @@ -25,44 +21,44 @@ Symbol SymbolFromXMLParser::parse(std::list<sax::Token>& input) const { Symbol SymbolFromXMLParser::parse(std::list<sax::Token>& input, const std::set<FEATURES>& features) const { if(isToken(input, sax::Token::TokenType::START_ELEMENT, "LabeledSymbol")) { if(!features.count(FEATURES::LABELED)) throw exception::AlibException(); - return parseLabeledSymbol(input); + return Symbol(parseLabeledSymbol(input)); } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "BlankSymbol")) { if(!features.count(FEATURES::BLANK)) throw exception::AlibException(); - return parseBlankSymbol(input); + return Symbol(parseBlankSymbol(input)); } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "BottomOfTheStackSymbol")) { if(!features.count(FEATURES::BOTTOM)) throw exception::AlibException(); - return parseBlankSymbol(input); + return Symbol(parseBlankSymbol(input)); } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "EndSymbol")) { if(!features.count(FEATURES::END)) throw exception::AlibException(); - return parseEndSymbol(input); + return Symbol(parseEndSymbol(input)); } else { throw sax::ParserException(sax::Token("LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol", sax::Token::TokenType::START_ELEMENT), input.front()); } } -Symbol SymbolFromXMLParser::parseLabeledSymbol(std::list<sax::Token>& input) const { +LabeledSymbol SymbolFromXMLParser::parseLabeledSymbol(std::list<sax::Token>& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, "LabeledSymbol"); label::Label data = alib::FromXMLParsers::labelParser.parse(input); popToken(input, sax::Token::TokenType::END_ELEMENT, "LabeledSymbol"); - return Symbol(LabeledSymbol(data)); + return LabeledSymbol(data); } -Symbol SymbolFromXMLParser::parseBlankSymbol(std::list<sax::Token>& input) const { +BlankSymbol SymbolFromXMLParser::parseBlankSymbol(std::list<sax::Token>& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, "BlankSymbol"); popToken(input, sax::Token::TokenType::END_ELEMENT, "BlankSymbol"); - return Symbol(BlankSymbol()); + return BlankSymbol(); } -Symbol SymbolFromXMLParser::parseBottomOfTheStackSymbol(std::list<sax::Token>& input) const { +BottomOfTheStackSymbol SymbolFromXMLParser::parseBottomOfTheStackSymbol(std::list<sax::Token>& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, "BottomOfTheStackSymbol"); popToken(input, sax::Token::TokenType::END_ELEMENT, "BottomOfTheStackSymbol"); - return Symbol(BottomOfTheStackSymbol()); + return BottomOfTheStackSymbol(); } -Symbol SymbolFromXMLParser::parseEndSymbol(std::list<sax::Token>& input) const { +EndSymbol SymbolFromXMLParser::parseEndSymbol(std::list<sax::Token>& input) const { popToken(input, sax::Token::TokenType::START_ELEMENT, "EndSymbol"); popToken(input, sax::Token::TokenType::END_ELEMENT, "EndSymbol"); - return Symbol(EndSymbol()); + return EndSymbol(); } bool SymbolFromXMLParser::first(std::list<sax::Token>& input) const { diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.h b/alib2data/src/alphabet/SymbolFromXMLParser.h index 7f4b4d305a..0d2b17b75f 100644 --- a/alib2data/src/alphabet/SymbolFromXMLParser.h +++ b/alib2data/src/alphabet/SymbolFromXMLParser.h @@ -16,6 +16,11 @@ #include "../sax/Token.h" #include "../label/Label.h" +#include "BlankSymbol.h" +#include "BottomOfTheStackSymbol.h" +#include "EndSymbol.h" +#include "LabeledSymbol.h" + namespace string { class StringFromXMLParser; @@ -49,13 +54,14 @@ class SymbolFromXMLParser : public alib::FromXMLParser<Symbol, FEATURES> { virtual Symbol parse(std::list<sax::Token>& input) const; virtual Symbol parse(std::list<sax::Token>& input, const std::set<FEATURES>& features) const; - Symbol parseLabeledSymbol(std::list<sax::Token>& input) const; - Symbol parseBlankSymbol(std::list<sax::Token>& input) const; - Symbol parseBottomOfTheStackSymbol(std::list<sax::Token>& input) const; - Symbol parseEndSymbol(std::list<sax::Token>& input) const; public: virtual bool first(std::list<sax::Token>& input) const; + LabeledSymbol parseLabeledSymbol(std::list<sax::Token>& input) const; + BlankSymbol parseBlankSymbol(std::list<sax::Token>& input) const; + BottomOfTheStackSymbol parseBottomOfTheStackSymbol(std::list<sax::Token>& input) const; + EndSymbol parseEndSymbol(std::list<sax::Token>& input) const; + friend class string::StringFromXMLParser; friend class regexp::RegExpFromXMLParser; friend class automaton::AutomatonFromXMLParser; diff --git a/alib2data/src/label/LabelFromXMLParser.cpp b/alib2data/src/label/LabelFromXMLParser.cpp index 8728880c4f..4de7bb1f90 100644 --- a/alib2data/src/label/LabelFromXMLParser.cpp +++ b/alib2data/src/label/LabelFromXMLParser.cpp @@ -21,22 +21,13 @@ Label LabelFromXMLParser::parse(std::list<sax::Token>& input) const { Label LabelFromXMLParser::parse(std::list<sax::Token>& input, const std::set<FEATURES>& features) const { if(isToken(input, sax::Token::TokenType::START_ELEMENT, "IntegerLabel")) { if(!features.count(FEATURES::INTEGER)) throw exception::AlibException(); - popToken(input, sax::Token::TokenType::START_ELEMENT, "IntegerLabel"); - Label data(IntegerLabel(std::stoi(popTokenData(input, sax::Token::TokenType::CHARACTER)))); - popToken(input, sax::Token::TokenType::END_ELEMENT, "IntegerLabel"); - return data; + return Label(parseIntegerLabel(input)); } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "StringLabel")) { if(!features.count(FEATURES::STRING)) throw exception::AlibException(); - popToken(input, sax::Token::TokenType::START_ELEMENT, "StringLabel"); - Label data(StringLabel(popTokenData(input, sax::Token::TokenType::CHARACTER))); - popToken(input, sax::Token::TokenType::END_ELEMENT, "StringLabel"); - return data; + return Label(parseStringLabel(input)); } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "CharacterLabel")) { if(!features.count(FEATURES::CHAR)) throw exception::AlibException(); - popToken(input, sax::Token::TokenType::START_ELEMENT, "CharacterLabel"); - Label data(CharacterLabel(popTokenData(input, sax::Token::TokenType::CHARACTER)[0])); - popToken(input, sax::Token::TokenType::END_ELEMENT, "CharacterLabel"); - return data; + return Label(parseCharacterLabel(input)); } else { throw sax::ParserException(sax::Token("IntegerLabel, StringLabel, CharacterLabel", sax::Token::TokenType::START_ELEMENT), input.front()); } @@ -50,4 +41,25 @@ bool LabelFromXMLParser::first(std::list<sax::Token>& input) const { } } +IntegerLabel LabelFromXMLParser::parseIntegerLabel(std::list<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, "IntegerLabel"); + IntegerLabel data(std::stoi(popTokenData(input, sax::Token::TokenType::CHARACTER))); + popToken(input, sax::Token::TokenType::END_ELEMENT, "IntegerLabel"); + return data; +} + +CharacterLabel LabelFromXMLParser::parseCharacterLabel(std::list<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, "CharacterLabel"); + CharacterLabel data(popTokenData(input, sax::Token::TokenType::CHARACTER)[0]); + popToken(input, sax::Token::TokenType::END_ELEMENT, "CharacterLabel"); + return data; +} + +StringLabel LabelFromXMLParser::parseStringLabel(std::list<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, "StringLabel"); + StringLabel data(popTokenData(input, sax::Token::TokenType::CHARACTER)); + popToken(input, sax::Token::TokenType::END_ELEMENT, "StringLabel"); + return data; +} + } /* namespace label */ diff --git a/alib2data/src/label/LabelFromXMLParser.h b/alib2data/src/label/LabelFromXMLParser.h index 84cf19ecab..3001253d63 100644 --- a/alib2data/src/label/LabelFromXMLParser.h +++ b/alib2data/src/label/LabelFromXMLParser.h @@ -41,6 +41,10 @@ class LabelFromXMLParser : public alib::FromXMLParser<Label, FEATURES> { public: virtual bool first(std::list<sax::Token>& input) const; + IntegerLabel parseIntegerLabel(std::list<sax::Token>& input) const; + CharacterLabel parseCharacterLabel(std::list<sax::Token>& input) const; + StringLabel parseStringLabel(std::list<sax::Token>& input) const; + friend class alphabet::SymbolFromXMLParser; friend class automaton::AutomatonFromXMLParser; diff --git a/alib2data/src/regexp/RegExpFromXMLParser.cpp b/alib2data/src/regexp/RegExpFromXMLParser.cpp index 2399549d00..cfb0641132 100644 --- a/alib2data/src/regexp/RegExpFromXMLParser.cpp +++ b/alib2data/src/regexp/RegExpFromXMLParser.cpp @@ -20,32 +20,10 @@ RegExp RegExpFromXMLParser::parse(std::list<sax::Token>& input) const { RegExp RegExpFromXMLParser::parse(std::list<sax::Token>& input, const std::set<FEATURES>& features) const { if(isToken(input, sax::Token::TokenType::START_ELEMENT, "unboundedRegexp")) { if(!features.count(FEATURES::UNBOUNDED)) throw exception::AlibException(); - popToken(input, sax::Token::TokenType::START_ELEMENT, "unboundedRegexp"); - - UnboundedRegExp regexp; - parseAlphabet(input, regexp); - - UnboundedRegExpElement* element = parseUnboundedRegExpElement(input); - regexp.setRegExp(std::move(*element)); - delete element; - - popToken(input, sax::Token::TokenType::END_ELEMENT, "unboundedRegexp"); - - return RegExp { regexp }; + return RegExp(parseUnboundedRegExp(input)); } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "formalRegexp")) { if(!features.count(FEATURES::UNBOUNDED)) throw exception::AlibException(); - popToken(input, sax::Token::TokenType::START_ELEMENT, "formalRegexp"); - - FormalRegExp regexp; - parseAlphabet(input, regexp); - - FormalRegExpElement* element = parseFormalRegExpElement(input); - regexp.setRegExp(std::move(*element)); - delete element; - - popToken(input, sax::Token::TokenType::END_ELEMENT, "formalRegexp"); - - return RegExp { regexp }; + return RegExp(parseFormalRegExp(input)); } throw exception::AlibException(); } @@ -58,6 +36,34 @@ bool RegExpFromXMLParser::first(std::list<sax::Token>& input) const { } } +UnboundedRegExp RegExpFromXMLParser::parseUnboundedRegExp(std::list<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, "unboundedRegexp"); + + UnboundedRegExp regexp; + parseAlphabet(input, regexp); + + UnboundedRegExpElement* element = parseUnboundedRegExpElement(input); + regexp.setRegExp(std::move(*element)); + delete element; + + popToken(input, sax::Token::TokenType::END_ELEMENT, "unboundedRegexp"); + return regexp; +} + +FormalRegExp RegExpFromXMLParser::parseFormalRegExp(std::list<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, "formalRegexp"); + + FormalRegExp regexp; + parseAlphabet(input, regexp); + + FormalRegExpElement* element = parseFormalRegExpElement(input); + regexp.setRegExp(std::move(*element)); + delete element; + + popToken(input, sax::Token::TokenType::END_ELEMENT, "formalRegexp"); + return regexp; +} + void RegExpFromXMLParser::parseAlphabet(std::list<sax::Token> &input, UnboundedRegExp& regexp) const { popToken(input, sax::Token::TokenType::START_ELEMENT, "alphabet"); while (isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { diff --git a/alib2data/src/regexp/RegExpFromXMLParser.h b/alib2data/src/regexp/RegExpFromXMLParser.h index d124145c37..919a78dbe8 100644 --- a/alib2data/src/regexp/RegExpFromXMLParser.h +++ b/alib2data/src/regexp/RegExpFromXMLParser.h @@ -52,6 +52,9 @@ class RegExpFromXMLParser : public alib::FromXMLParser<RegExp, FEATURES> { public: virtual bool first(std::list<sax::Token>& input) const; + UnboundedRegExp parseUnboundedRegExp(std::list<sax::Token>& input) const; + FormalRegExp parseFormalRegExp(std::list<sax::Token>& input) const; + friend class automaton::AutomatonFromXMLParser; }; diff --git a/alib2data/src/string/StringFromXMLParser.cpp b/alib2data/src/string/StringFromXMLParser.cpp index ffe2e61ac9..529c4e37b2 100644 --- a/alib2data/src/string/StringFromXMLParser.cpp +++ b/alib2data/src/string/StringFromXMLParser.cpp @@ -20,52 +20,57 @@ String StringFromXMLParser::parse(std::list<sax::Token>& input) const { } String StringFromXMLParser::parse(std::list<sax::Token>& input, const std::set<FEATURES>& features) const { - String string { Epsilon {} }; - parseContent(input, string, features); - - return string; -} - -void StringFromXMLParser::parseContent(std::list<sax::Token>& input, String& string, const std::set<FEATURES>& features) const { if(isToken(input, sax::Token::TokenType::START_ELEMENT, "Epsilon")) { if(!features.count(FEATURES::EPSILON)) throw exception::AlibException(); - popToken(input, sax::Token::TokenType::START_ELEMENT, "Epsilon"); - - Epsilon epsilon; - std::set<alphabet::Symbol> alphabet = parseAlphabet(input); - epsilon.setAlphabet(alphabet); - - popToken(input, sax::Token::TokenType::END_ELEMENT, "Epsilon"); - string.setData(epsilon); + return String(parseEpsilon(input)); } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "LinearString")) { if(!features.count(FEATURES::LINEAR)) throw exception::AlibException(); - popToken(input, sax::Token::TokenType::START_ELEMENT, "LinearString"); + return String(parseLinearString(input)); + } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "CyclicString")) { + if(!features.count(FEATURES::CYCLIC)) throw exception::AlibException(); + return String(parseCyclicString(input)); + } else { + throw sax::ParserException(sax::Token("Epsilon, LinearString, CyclicString", sax::Token::TokenType::START_ELEMENT), input.front()); + } +} - LinearString linearString; - std::set<alphabet::Symbol> alphabet = parseAlphabet(input); - linearString.setAlphabet(alphabet); +LinearString StringFromXMLParser::parseLinearString(std::list<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, "LinearString"); - std::vector<alphabet::Symbol> data = parseContentData(input); - linearString.setContent(data); + LinearString string; + std::set<alphabet::Symbol> alphabet = parseAlphabet(input); + string.setAlphabet(alphabet); - popToken(input, sax::Token::TokenType::END_ELEMENT, "LinearString"); - string.setData(linearString); - } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "CyclicString")) { - if(!features.count(FEATURES::CYCLIC)) throw exception::AlibException(); - popToken(input, sax::Token::TokenType::START_ELEMENT, "CyclicString"); + std::vector<alphabet::Symbol> data = parseContentData(input); + string.setContent(data); - CyclicString cyclicString; - std::set<alphabet::Symbol> alphabet = parseAlphabet(input); - cyclicString.setAlphabet(alphabet); + popToken(input, sax::Token::TokenType::END_ELEMENT, "LinearString"); + return string; +} - std::vector<alphabet::Symbol> data = parseContentData(input); - cyclicString.setContent(data); +CyclicString StringFromXMLParser::parseCyclicString(std::list<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, "CyclicString"); - string.setData(cyclicString); - popToken(input, sax::Token::TokenType::END_ELEMENT, "CyclicString"); - } else { - throw sax::ParserException(sax::Token("Epsilon, LinearString, CyclicString", sax::Token::TokenType::START_ELEMENT), input.front()); - } + CyclicString string; + std::set<alphabet::Symbol> alphabet = parseAlphabet(input); + string.setAlphabet(alphabet); + + std::vector<alphabet::Symbol> data = parseContentData(input); + string.setContent(data); + + popToken(input, sax::Token::TokenType::END_ELEMENT, "CyclicString"); + return string; +} + +Epsilon StringFromXMLParser::parseEpsilon(std::list<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, "Epsilon"); + + Epsilon epsilon; + std::set<alphabet::Symbol> alphabet = parseAlphabet(input); + epsilon.setAlphabet(alphabet); + + popToken(input, sax::Token::TokenType::END_ELEMENT, "Epsilon"); + return epsilon; } std::set<alphabet::Symbol> StringFromXMLParser::parseAlphabet(std::list<sax::Token> &input) const { diff --git a/alib2data/src/string/StringFromXMLParser.h b/alib2data/src/string/StringFromXMLParser.h index a1eb7fcc1e..b56a38afe8 100644 --- a/alib2data/src/string/StringFromXMLParser.h +++ b/alib2data/src/string/StringFromXMLParser.h @@ -28,7 +28,6 @@ namespace string { * Parser used to get String from XML parsed into list of tokens. */ class StringFromXMLParser : public alib::FromXMLParser<String, FEATURES> { - void parseContent(std::list<sax::Token>& input, String& string, const std::set<FEATURES>& features) const; std::vector<alphabet::Symbol> parseContentData(std::list<sax::Token>& input) const; std::set<alphabet::Symbol> parseAlphabet(std::list<sax::Token> &input) const; @@ -37,6 +36,10 @@ class StringFromXMLParser : public alib::FromXMLParser<String, FEATURES> { public: virtual bool first(std::list<sax::Token>& input) const; + LinearString parseLinearString(std::list<sax::Token>& input) const; + CyclicString parseCyclicString(std::list<sax::Token>& input) const; + Epsilon parseEpsilon(std::list<sax::Token>& input) const; + friend class automaton::AutomatonFromXMLParser; }; -- GitLab