From 4b3a76d15c3aa13236d9111585000406069624c2 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Sun, 15 Jun 2014 21:42:34 +0200
Subject: [PATCH] string representation of epsilon

---
 alib2/src/alphabet/SymbolFromStringLexer.cpp |  2 +-
 alib2/src/label/LabelFromStringLexer.cpp     |  2 +-
 alib2/src/string/StringFromStringLexer.cpp   | 20 +++++-
 alib2/src/string/StringFromStringLexer.h     |  1 +
 alib2/src/string/StringFromStringParser.cpp  |  2 +-
 alib2/src/string/StringToStringComposer.cpp  |  2 +-
 alib2/test-src/string/StringTest.cpp         | 66 +++++++++++++++-----
 7 files changed, 76 insertions(+), 19 deletions(-)

diff --git a/alib2/src/alphabet/SymbolFromStringLexer.cpp b/alib2/src/alphabet/SymbolFromStringLexer.cpp
index d95336efb6..281064ae2a 100644
--- a/alib2/src/alphabet/SymbolFromStringLexer.cpp
+++ b/alib2/src/alphabet/SymbolFromStringLexer.cpp
@@ -12,8 +12,8 @@ SymbolFromStringLexer& SymbolFromStringLexer::next() {
 	char character;
 	m_Current.value = "";
 
-L0:
 	std::streampos pos = m_In.tellg();
+L0:
 	character = m_In.get();
 	if(m_In.eof()) {
 		m_In.seekg(pos);
diff --git a/alib2/src/label/LabelFromStringLexer.cpp b/alib2/src/label/LabelFromStringLexer.cpp
index 7ee00a3d7d..f4e25929ee 100644
--- a/alib2/src/label/LabelFromStringLexer.cpp
+++ b/alib2/src/label/LabelFromStringLexer.cpp
@@ -11,8 +11,8 @@ LabelFromStringLexer& LabelFromStringLexer::next() {
 	char character;
 	m_Current.value = "";
 
-L0:
 	std::streampos pos = m_In.tellg();
+L0:
 	character = m_In.get();
 	if(m_In.eof()) {
 		m_In.seekg(pos);
diff --git a/alib2/src/string/StringFromStringLexer.cpp b/alib2/src/string/StringFromStringLexer.cpp
index 79874cd89b..2e1a32a806 100644
--- a/alib2/src/string/StringFromStringLexer.cpp
+++ b/alib2/src/string/StringFromStringLexer.cpp
@@ -11,9 +11,11 @@ StringFromStringLexer& StringFromStringLexer::next() {
 	char character;
 	m_Current.value = "";
 
+	std::streampos pos = m_In.tellg();
 L0:
 	character = m_In.get();
 	if(m_In.eof()) {
+		m_In.seekg(pos);
 		m_Current.type = TokenType::TEOF;
 		return *this;
 	} else if(character == ' ' || character == '\n' || character == '\t') {
@@ -30,8 +32,24 @@ L0:
 		m_Current.type = TokenType::QUOTE;
 		m_Current.value += character;
 		return *this;
+	} else if(character == '#') {
+		goto L1;
 	} else {
-		m_In.unget();
+		m_In.seekg(pos);
+		m_Current.type = TokenType::ERROR;
+		return *this;
+	}
+L1:
+	character = m_In.get();
+	if(m_In.eof()) {
+		m_In.seekg(pos);
+		m_Current.type = TokenType::ERROR;
+		return *this;
+	} else if(character == 'E') {
+		m_Current.type = TokenType::EPSILON;
+		return *this;
+	} else {
+		m_In.seekg(pos);
 		m_Current.type = TokenType::ERROR;
 		return *this;
 	}
diff --git a/alib2/src/string/StringFromStringLexer.h b/alib2/src/string/StringFromStringLexer.h
index 3c6b195ae2..ef501e38bd 100644
--- a/alib2/src/string/StringFromStringLexer.h
+++ b/alib2/src/string/StringFromStringLexer.h
@@ -13,6 +13,7 @@ public:
 		LESS,
 		GREATER,
 		QUOTE,
+		EPSILON,
 		TEOF,
 		ERROR
 	};
diff --git a/alib2/src/string/StringFromStringParser.cpp b/alib2/src/string/StringFromStringParser.cpp
index 22916c3320..086d95c757 100644
--- a/alib2/src/string/StringFromStringParser.cpp
+++ b/alib2/src/string/StringFromStringParser.cpp
@@ -15,7 +15,7 @@ StringFromStringParser::StringFromStringParser(std::stringstream& input) : m_Str
 
 String* StringFromStringParser::parse() {
 	StringFromStringLexer::Token token = m_StringLexer.next().token();
-	if(token.type == StringFromStringLexer::TokenType::TEOF) {
+	if(token.type == StringFromStringLexer::TokenType::EPSILON) {
 		return new String(Epsilon());
 	} else if(token.type == StringFromStringLexer::TokenType::LESS) {
 		std::vector<alphabet::Symbol> data = parseContent();
diff --git a/alib2/src/string/StringToStringComposer.cpp b/alib2/src/string/StringToStringComposer.cpp
index 6952e9ee92..e8fffe4e7d 100644
--- a/alib2/src/string/StringToStringComposer.cpp
+++ b/alib2/src/string/StringToStringComposer.cpp
@@ -39,7 +39,7 @@ void StringToStringComposer::Visit(void* userData, const LinearString& string) {
 void StringToStringComposer::Visit(void* userData, const Epsilon&) {
 	std::stringstream &out = *((std::stringstream*) userData);
 
-	out << "\"\"";
+	out << "#E";
 }
 
 void StringToStringComposer::Visit(void* userData, const String& string) {
diff --git a/alib2/test-src/string/StringTest.cpp b/alib2/test-src/string/StringTest.cpp
index 401255b088..04258fcb9c 100644
--- a/alib2/test-src/string/StringTest.cpp
+++ b/alib2/test-src/string/StringTest.cpp
@@ -48,22 +48,60 @@ void StringTest::testCopyConstruct() {
 }
 
 void StringTest::testEqual() {
-  std::string input = "\"aa\"";
-  std::stringstream inputs(input);
+  {
+    std::string input = "\"aa\"";
+    std::stringstream inputs(input);
 
-  string::StringFromStringParser parser(inputs);
-  string::String string = parser.parseString();
+    string::StringFromStringParser parser(inputs);
+    string::String string = parser.parseString();
 
-  string::StringToStringComposer composer;
-  std::string output = composer.compose(string);
-  std::stringstream outputs(output);
-  
-  CPPUNIT_ASSERT( input == output );
-  
-  string::StringFromStringParser parser2(outputs);
-  string::String string2 = parser2.parseString();
-  
-  CPPUNIT_ASSERT( string == string2 );
+    string::StringToStringComposer composer;
+    std::string output = composer.compose(string);
+    std::stringstream outputs(output);
+
+    CPPUNIT_ASSERT( input == output );
+
+    string::StringFromStringParser parser2(outputs);
+    string::String string2 = parser2.parseString();
+
+    CPPUNIT_ASSERT( string == string2 );
+  }
+  {
+    std::string input = "\"'aaaa''aaa'\"";
+    std::stringstream inputs(input);
+
+    string::StringFromStringParser parser(inputs);
+    string::String string = parser.parseString();
+
+    string::StringToStringComposer composer;
+    std::string output = composer.compose(string);
+    std::stringstream outputs(output);
+
+    CPPUNIT_ASSERT( input == output );
+
+    string::StringFromStringParser parser2(outputs);
+    string::String string2 = parser2.parseString();
+
+    CPPUNIT_ASSERT( string == string2 );
+  }
+  {
+    std::string input = "#E";
+    std::stringstream inputs(input);
+
+    string::StringFromStringParser parser(inputs);
+    string::String string = parser.parseString();
+
+    string::StringToStringComposer composer;
+    std::string output = composer.compose(string);
+    std::stringstream outputs(output);
+
+    CPPUNIT_ASSERT( input == output );
+
+    string::StringFromStringParser parser2(outputs);
+    string::String string2 = parser2.parseString();
+
+    CPPUNIT_ASSERT( string == string2 );
+  }
 }
 
 void StringTest::testXMLParser() {
-- 
GitLab