From 170f9cfe4803831b15d4d0cc1aa50623608d9016 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Sun, 29 Jun 2014 12:59:56 +0200
Subject: [PATCH] String features

---
 alib2/src/string/StringFeatures.h           | 21 +++++++++++++++++++++
 alib2/src/string/StringFromStringParser.cpp |  7 +++++++
 alib2/src/string/StringFromStringParser.h   |  2 ++
 alib2/src/string/StringFromXMLParser.cpp    | 11 +++++++++--
 alib2/src/string/StringFromXMLParser.h      |  5 ++++-
 5 files changed, 43 insertions(+), 3 deletions(-)
 create mode 100644 alib2/src/string/StringFeatures.h

diff --git a/alib2/src/string/StringFeatures.h b/alib2/src/string/StringFeatures.h
new file mode 100644
index 0000000000..b3aba2adde
--- /dev/null
+++ b/alib2/src/string/StringFeatures.h
@@ -0,0 +1,21 @@
+/*
+ * StringFeatures.h
+ *
+ *  Created on: Jun 19, 2014
+ *      Author: Jan Travnicek
+ */
+
+#ifndef STRING_FEATURES_H_
+#define STRING_FEATURES_H_
+
+namespace string {
+
+enum class FEATURES {
+	LINEAR,
+	CYCLIC,
+	EPSILON
+};
+
+} /* namespace string */
+
+#endif /* STRING_FEATURES_H_ */
diff --git a/alib2/src/string/StringFromStringParser.cpp b/alib2/src/string/StringFromStringParser.cpp
index 84c127dffd..d57e0e8d36 100644
--- a/alib2/src/string/StringFromStringParser.cpp
+++ b/alib2/src/string/StringFromStringParser.cpp
@@ -14,10 +14,16 @@ StringFromStringParser::StringFromStringParser(std::stringstream& input) : m_Str
 }
 
 String StringFromStringParser::parse() {
+	return parse(std::set<FEATURES>({FEATURES::LINEAR, FEATURES::CYCLIC, FEATURES::EPSILON}));
+}
+
+String StringFromStringParser::parse(const std::set<FEATURES>& features) {
 	StringFromStringLexer::Token token = m_StringLexer.token();
 	if(token.type == StringFromStringLexer::TokenType::EPSILON) {
+		if(!features.count(FEATURES::EPSILON)) throw alib::AlibException();
 		return String(Epsilon());
 	} else if(token.type == StringFromStringLexer::TokenType::LESS) {
+		if(!features.count(FEATURES::CYCLIC)) throw alib::AlibException();
 		std::vector<alphabet::Symbol> data = parseContent();
 		if(token.type == StringFromStringLexer::TokenType::GREATER) {
 			return String(CyclicString(data));
@@ -25,6 +31,7 @@ String StringFromStringParser::parse() {
 			throw alib::AlibException();
 		}
 	} else if(token.type == StringFromStringLexer::TokenType::QUOTE) {
+		if(!features.count(FEATURES::LINEAR)) throw alib::AlibException();
 		std::vector<alphabet::Symbol> data = parseContent();
 		if(token.type == StringFromStringLexer::TokenType::QUOTE) {
 			return String(LinearString(data));
diff --git a/alib2/src/string/StringFromStringParser.h b/alib2/src/string/StringFromStringParser.h
index 04935b2121..9f1fc4e1c3 100644
--- a/alib2/src/string/StringFromStringParser.h
+++ b/alib2/src/string/StringFromStringParser.h
@@ -9,6 +9,7 @@
 #define STRING_FROM_STRING_PARSER_H_
 
 #include "String.h"
+#include "StringFeatures.h"
 #include <vector>
 #include "../alphabet/Symbol.h"
 
@@ -24,6 +25,7 @@ class StringFromStringParser {
 	alphabet::SymbolFromStringParser m_SymbolParser;
 
 	String parse();
+	String parse(const std::set<FEATURES>& features);
 	String* parsePointer();
 public:
 	StringFromStringParser(std::stringstream&);
diff --git a/alib2/src/string/StringFromXMLParser.cpp b/alib2/src/string/StringFromXMLParser.cpp
index 3da9e1b566..325f71b9fc 100644
--- a/alib2/src/string/StringFromXMLParser.cpp
+++ b/alib2/src/string/StringFromXMLParser.cpp
@@ -16,28 +16,35 @@
 namespace string {
 
 String StringFromXMLParser::parse(std::list<sax::Token>& input) const {
+	return parse(input, std::set<FEATURES>({FEATURES::LINEAR, FEATURES::CYCLIC, FEATURES::EPSILON}));
+}
+
+String StringFromXMLParser::parse(std::list<sax::Token>& input, const std::set<FEATURES>& features) const {
 	popToken(input, sax::Token::TokenType::START_ELEMENT, "string");
 	
 	String string;
 	parseAlphabet(input, string);
-	parseContent(input, string);
+	parseContent(input, string, features);
 	
 	popToken(input, sax::Token::TokenType::END_ELEMENT, "string");
 
 	return string;
 }
 
-void StringFromXMLParser::parseContent(std::list<sax::Token>& input, String& string) const {
+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 alib::AlibException();
 		popToken(input, sax::Token::TokenType::START_ELEMENT, "Epsilon");
 		popToken(input, sax::Token::TokenType::END_ELEMENT, "Epsilon");
 		string.setString(Epsilon());
 	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "LinearString")) {
+		if(!features.count(FEATURES::LINEAR)) throw alib::AlibException();
 		popToken(input, sax::Token::TokenType::START_ELEMENT, "LinearString");
 		std::vector<alphabet::Symbol> data = parseContentData(input);
 		popToken(input, sax::Token::TokenType::END_ELEMENT, "LinearString");
 		string.setString(LinearString(data));
 	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "CyclicString")) {
+		if(!features.count(FEATURES::CYCLIC)) throw alib::AlibException();
 		popToken(input, sax::Token::TokenType::START_ELEMENT, "CyclicString");
 		std::vector<alphabet::Symbol> data = parseContentData(input);
 		popToken(input, sax::Token::TokenType::END_ELEMENT, "CyclicString");
diff --git a/alib2/src/string/StringFromXMLParser.h b/alib2/src/string/StringFromXMLParser.h
index 66301d2863..9ed0008fa4 100644
--- a/alib2/src/string/StringFromXMLParser.h
+++ b/alib2/src/string/StringFromXMLParser.h
@@ -10,7 +10,9 @@
 
 #include "../sax/FromXMLParser.h"
 #include <vector>
+#include <set>
 #include "String.h"
+#include "StringFeatures.h"
 #include "../sax/Token.h"
 #include "../alphabet/Symbol.h"
 
@@ -20,11 +22,12 @@ namespace string {
  * Parser used to get String from XML parsed into list of tokens.
  */
 class StringFromXMLParser : public sax::FromXMLParser {
-	void parseContent(std::list<sax::Token>& input, String& string) const;
+	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;
 	void parseAlphabet(std::list<sax::Token> &input, String& string) const;
 
 	String parse(std::list<sax::Token>& input) const;
+	String parse(std::list<sax::Token>& input, const std::set<FEATURES>& features) const;
 	String* parsePointer(std::list<sax::Token>& input) const;
 public:
 	/**
-- 
GitLab