diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.cpp b/alib2data/src/alphabet/SymbolFromXMLParser.cpp index cb1e5b438c0b1bd9b4544c9101f1670c7550c4b7..fd42a9b2d4bcf937a415f0b08917dd528553adb6 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 7f4b4d305a73b5475a20019e879afa42c26b148b..0d2b17b75fbc9ba49a60ea882777aad1fe04cab7 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 8728880c4f1ccc375c5b7bcd006f51291b837b37..4de7bb1f90288c72aa7382b5ba6a3954b62654e6 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 84cf19ecab387dbcd04d0291a4c1f1752f1b82db..3001253d63f7d63a2ca70a2440570e2427e4822e 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 2399549d0057cc1dacd0eb929f3136c3b426808c..cfb06411321af4b69ce03e3ffc241888ba3971df 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 d124145c379f13b2ed1864cb1cee4c4812fa7e63..919a78dbe8ac89ff3fc157eebf51d66968eb54fd 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 ffe2e61ac9a54e36e7ce2eb21a1a420c1b0908c2..529c4e37b200ae5eb2f95f240884f2296162a3c2 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 a1eb7fcc1ea9584ef064f69f3eb05e59b2f83981..b56a38afe83b9b517b7bbd983fc3bdeaddeee00d 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; };