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