diff --git a/alib2/src/automaton/AutomatonFromXMLParser.cpp b/alib2/src/automaton/AutomatonFromXMLParser.cpp index 0c2c1055b9dbd1f798b0219234973388bc001dc5..1909162229c7a4f095a0bafcb85f383e07c124df 100644 --- a/alib2/src/automaton/AutomatonFromXMLParser.cpp +++ b/alib2/src/automaton/AutomatonFromXMLParser.cpp @@ -8,6 +8,7 @@ #include "AutomatonFromXMLParser.h" #include "../sax/ParserException.h" +#include "../alphabet/Blank.h" namespace automaton { @@ -16,10 +17,8 @@ UnknownAutomaton AutomatonFromXMLParser::parse(std::list<sax::Token> &input) { popToken(input, sax::Token::START_ELEMENT, "automaton"); - while (true) { - if (isToken(input, sax::Token::END_ELEMENT, "automaton")) { - break; - } else if (isToken(input, sax::Token::START_ELEMENT, "states")) { + while (isTokenType(input, sax::Token::START_ELEMENT)) { + if (isToken(input, sax::Token::START_ELEMENT, "states")) { parseStates(input, automaton); } else if (isToken(input, sax::Token::START_ELEMENT, "inputAlphabet")) { parseInputAlphabet(input, automaton); @@ -105,12 +104,7 @@ void AutomatonFromXMLParser::parseTapeAlphabet(std::list<sax::Token>& input, Unk void AutomatonFromXMLParser::parseBlankSymbol(std::list<sax::Token>& input, UnknownAutomaton& automaton) { popToken(input, sax::Token::START_ELEMENT, "blankSymbol"); - if (input.front().getType() == sax::Token::CHARACTER) { - automaton.setBlankSymbol(alphabet::Symbol(input.front().getData())); - input.pop_front(); - } else { - throw sax::ParserException(sax::Token("", sax::Token::CHARACTER), input.front()); - } + automaton.setBlankSymbol(parseSymbol(input, "symbol")); popToken(input, sax::Token::END_ELEMENT, "blankSymbol"); } @@ -141,48 +135,44 @@ void AutomatonFromXMLParser::parsePush(std::list<sax::Token>& input, UnknownTran State AutomatonFromXMLParser::parseState(std::list<sax::Token> &input, std::string tagName) { popToken(input, sax::Token::START_ELEMENT, tagName); - if (input.front().getType() == sax::Token::CHARACTER) { - State state(input.front().getData()); - input.pop_front(); - popToken(input, sax::Token::END_ELEMENT, tagName); - return state; - } else { - throw sax::ParserException(sax::Token("", sax::Token::CHARACTER), input.front()); - } + State state(popTokenData(input, sax::Token::CHARACTER)); + popToken(input, sax::Token::END_ELEMENT, tagName); + return state; } alphabet::Symbol AutomatonFromXMLParser::parseSymbol(std::list<sax::Token>& input, std::string tagName) { popToken(input, sax::Token::START_ELEMENT, tagName); - if (input.front().getType() == sax::Token::CHARACTER) { - alphabet::Symbol symbol(input.front().getData()); - input.pop_front(); - popToken(input, sax::Token::END_ELEMENT, tagName); - return symbol; - } else if(isToken(input, sax::Token::END_ELEMENT, tagName)){ + alphabet::Symbol result(""); + if (isTokenType(input, sax::Token::CHARACTER)) { + result = alphabet::Symbol(popTokenData(input, sax::Token::CHARACTER)); + } else if(isToken(input, sax::Token::START_ELEMENT, "epsilon")) { + result = alphabet::Symbol(""); //TODO predelat na opravdovy epsilon input.pop_front(); - return alphabet::Symbol(""); - } else if(isToken(input, sax::Token::START_ELEMENT, "eps")) { + popToken(input, sax::Token::END_ELEMENT,"epsilon"); + } else if (isToken(input, sax::Token::START_ELEMENT, "blank")) { + result = alphabet::Blank(); input.pop_front(); - popToken(input, sax::Token::END_ELEMENT,"eps"); - popToken(input, sax::Token::END_ELEMENT, tagName); - return alphabet::Symbol(""); + popToken(input, sax::Token::END_ELEMENT,"blank"); } else { throw sax::ParserException(sax::Token("", sax::Token::CHARACTER), input.front()); } + popToken(input, sax::Token::END_ELEMENT, tagName); + return result; } Shift AutomatonFromXMLParser::parseShift(std::list<sax::Token>& input) { Shift shift; popToken(input, sax::Token::START_ELEMENT, "shift"); - if (input.front().getType() == sax::Token::CHARACTER) { - if (input.front().getData() == "left") - shift = LEFT; - if (input.front().getData() == "right") - shift = RIGHT; - if (input.front().getData() == "none") - shift = NONE; + if (isToken(input, sax::Token::CHARACTER, "left")) { + shift = LEFT; + input.pop_front(); + } else if (isToken(input, sax::Token::CHARACTER, "right")) { + shift = RIGHT; + input.pop_front(); + } else if (isToken(input, sax::Token::CHARACTER, "none")) { + shift = NONE; input.pop_front(); } else { throw sax::ParserException(sax::Token("", sax::Token::CHARACTER), input.front()); @@ -190,17 +180,14 @@ Shift AutomatonFromXMLParser::parseShift(std::list<sax::Token>& input) { popToken(input, sax::Token::END_ELEMENT, "shift"); return shift; - } UnknownTransition AutomatonFromXMLParser::parseTransition(std::list<sax::Token>& input) { UnknownTransition transition; popToken(input, sax::Token::START_ELEMENT, "transition"); - while (true) { - if (isToken(input, sax::Token::END_ELEMENT, "transition")) { - break; - } else if (isToken(input, sax::Token::START_ELEMENT, "from")) { + while (isTokenType(input, sax::Token::START_ELEMENT)) { + if (isToken(input, sax::Token::START_ELEMENT, "from")) { transition.setFrom(parseState(input, "from")); } else if (isToken(input, sax::Token::START_ELEMENT, "input")) { transition.setInput(parseSymbol(input, "input")); @@ -224,3 +211,4 @@ UnknownTransition AutomatonFromXMLParser::parseTransition(std::list<sax::Token>& } } /* namespace automaton */ + diff --git a/alib2/src/regexp/RegExpFromXMLParser.cpp b/alib2/src/regexp/RegExpFromXMLParser.cpp index bd22da901c80d37b85a4c7c14537723c8f7a6262..3769fe004e1324bd30ec74ebec1a38fe6009e0bd 100644 --- a/alib2/src/regexp/RegExpFromXMLParser.cpp +++ b/alib2/src/regexp/RegExpFromXMLParser.cpp @@ -16,10 +16,11 @@ RegExp RegExpFromXMLParser::parse(std::list<sax::Token>& input) { RegExp regexp; parseAlphabet(input, regexp); - RegExpElement* element = parseElement(input); - if(!element) throw sax::ParserException(sax::Token("", sax::Token::CHARACTER), input.front()); - regexp.setRegExp(std::move(*element)); - delete element; + if(isTokenType(input, sax::Token::START_ELEMENT)) { + RegExpElement* element = parseElement(input); + regexp.setRegExp(std::move(*element)); + delete element; + } popToken(input, sax::Token::END_ELEMENT, "regexp"); @@ -66,9 +67,8 @@ Alternation* RegExpFromXMLParser::parseAlternation(std::list<sax::Token>& input) delete element1; delete element2; - while (true) { + while (isTokenType(input, sax::Token::START_ELEMENT)) { RegExpElement* element = parseElement(input); - if(!element) break; alternation->appendElement(std::move(*element)); delete element; } @@ -89,9 +89,8 @@ Concatenation* RegExpFromXMLParser::parseConcatenation(std::list<sax::Token>& in delete element1; delete element2; - while (true) { + while (isTokenType(input, sax::Token::START_ELEMENT)) { RegExpElement* element = parseElement(input); - if(!element) break; concatenation->appendElement(std::move(*element)); delete element; } @@ -135,26 +134,9 @@ template <class T> T* RegExpFromXMLParser::parseSymbol(std::list<sax::Token>& input) { popToken(input, sax::Token::START_ELEMENT, "symbol"); - if (input.front().getType() == sax::Token::CHARACTER) { - T* symbol = new T(input.front().getData()); - input.pop_front(); - popToken(input, sax::Token::END_ELEMENT, "symbol"); - return symbol; - } else { - throw sax::ParserException(sax::Token("", sax::Token::CHARACTER), input.front()); - } -} - -bool RegExpFromXMLParser::isToken(std::list<sax::Token>& input, sax::Token::TokenType type, std::string data) { - return input.front().getType() == type && input.front().getData() == data; -} - -void RegExpFromXMLParser::popToken(std::list<sax::Token>& input, sax::Token::TokenType type, std::string data) { - if (isToken(input, type, data)) { - input.pop_front(); - } else { - throw sax::ParserException(sax::Token(data, type), input.front()); - } + T* symbol = new T(popTokenData(input, sax::Token::CHARACTER)); + popToken(input, sax::Token::END_ELEMENT, "symbol"); + return symbol; } } /* namespace regexp */ diff --git a/alib2/src/regexp/RegExpFromXMLParser.h b/alib2/src/regexp/RegExpFromXMLParser.h index 2a45f1ace8c55da13c8f5272a8294796b41eebe2..f1d29032034747163afc8241545d62a1065a8dc8 100644 --- a/alib2/src/regexp/RegExpFromXMLParser.h +++ b/alib2/src/regexp/RegExpFromXMLParser.h @@ -8,6 +8,7 @@ #ifndef REG_EXP_FROM_XML_PARSER_H_ #define REG_EXP_FROM_XML_PARSER_H_ +#include "../sax/FromXMLParser.h" #include "RegExp.h" #include "RegExpElements.h" #include "../sax/Token.h" @@ -18,7 +19,7 @@ namespace regexp { /** * Parser used to get RegExp from XML parsed into list of tokens. */ -class RegExpFromXMLParser { +class RegExpFromXMLParser : public sax::FromXMLParser { void parseAlphabet(std::list<sax::Token>& input, RegExp& regexp); RegExpElement* parseElement(std::list<sax::Token>& input); @@ -29,8 +30,6 @@ class RegExpFromXMLParser { Iteration* parseIteration(std::list<sax::Token> &input); Alternation* parseAlternation(std::list<sax::Token> &input); Concatenation* parseConcatenation(std::list<sax::Token> &input); - bool isToken(std::list<sax::Token> &input, sax::Token::TokenType type, std::string data); - void popToken(std::list<sax::Token> &input, sax::Token::TokenType type, std::string data); public: /** diff --git a/alib2/src/sax/FromXMLParser.cpp b/alib2/src/sax/FromXMLParser.cpp index 782b395a94a84dcb15680ddbeed76f2e32fd0c26..0f6c6e76b6a7810f5ef3d496ee32eb53cb4c4d98 100644 --- a/alib2/src/sax/FromXMLParser.cpp +++ b/alib2/src/sax/FromXMLParser.cpp @@ -26,7 +26,7 @@ void FromXMLParser::popToken(std::list<Token>& input, Token::TokenType type, std } } -std::string FromXMLParser::popTokenType(std::list<Token>& input, Token::TokenType type) { +std::string FromXMLParser::popTokenData(std::list<Token>& input, Token::TokenType type) { if(isTokenType(input, type)) { std::string result = input.front().getData(); input.pop_front(); diff --git a/alib2/src/sax/FromXMLParser.h b/alib2/src/sax/FromXMLParser.h index d6d55b0b4db577af570926f630eaedb9dd21fd02..c6f3c6c20ad1625d077c8c667aff437a81f1aca4 100644 --- a/alib2/src/sax/FromXMLParser.h +++ b/alib2/src/sax/FromXMLParser.h @@ -21,7 +21,7 @@ protected: bool isToken(std::list<Token> &input, Token::TokenType type, std::string data); bool isTokenType(std::list<Token>& input, Token::TokenType type); void popToken(std::list<Token> &input, Token::TokenType type, std::string data); - std::string popTokenType(std::list<Token>& input, Token::TokenType type); + std::string popTokenData(std::list<Token>& input, Token::TokenType type); }; diff --git a/alib2/src/string/StringFromXMLParser.cpp b/alib2/src/string/StringFromXMLParser.cpp index a879a16ca4c5ebdd17546d0431b81bb248843986..487f6267d9a595283e05468c2db92b24ab88536a 100644 --- a/alib2/src/string/StringFromXMLParser.cpp +++ b/alib2/src/string/StringFromXMLParser.cpp @@ -45,16 +45,4 @@ alphabet::Symbol StringFromXMLParser::parseSymbol(std::list<sax::Token>& input) } } -bool StringFromXMLParser::isToken(std::list<sax::Token>& input, sax::Token::TokenType type, std::string data) { - return input.front().getType() == type && input.front().getData() == data; -} - -void StringFromXMLParser::popToken(std::list<sax::Token>& input, sax::Token::TokenType type, std::string data) { - if (isToken(input, type, data)) { - input.pop_front(); - } else { - throw sax::ParserException(sax::Token(data, type), input.front()); - } -} - } /* namespace string */ diff --git a/alib2/src/string/StringFromXMLParser.h b/alib2/src/string/StringFromXMLParser.h index 03fe0e47d4dd12d4298db438834718f8a18a4d28..e5de9cb324e9b0e9c3049b23628dbf9c19515307 100644 --- a/alib2/src/string/StringFromXMLParser.h +++ b/alib2/src/string/StringFromXMLParser.h @@ -8,6 +8,7 @@ #ifndef STRING_FROM_XML_PARSER_H_ #define STRING_FROM_XML_PARSER_H_ +#include "../sax/FromXMLParser.h" #include <list> #include "String.h" #include "../sax/Token.h" @@ -17,11 +18,9 @@ namespace string { /** * Parser used to get String from XML parsed into list of tokens. */ -class StringFromXMLParser { +class StringFromXMLParser : public sax::FromXMLParser { std::vector<alphabet::Symbol> parseContent(std::list<sax::Token>& input); alphabet::Symbol parseSymbol(std::list<sax::Token>& input); - bool isToken(std::list<sax::Token> &input, sax::Token::TokenType type, std::string data); - void popToken(std::list<sax::Token> &input, sax::Token::TokenType type, std::string data); public: /**