From dcc888437e4fc90e327f89bc92ca6122a2acb6eb Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Fri, 10 Nov 2017 10:36:53 +0100
Subject: [PATCH] allow empty lines and no newline after automaton

---
 alib2str/src/automaton/string/FSM/DFA.h              |  4 +++-
 alib2str/src/automaton/string/FSM/EpsilonNFA.h       |  7 +++++--
 .../src/automaton/string/FSM/MultiInitialStateNFA.h  |  7 +++++--
 alib2str/src/automaton/string/FSM/NFA.h              |  7 +++++--
 alib2str/test-src/automaton/AutomatonTest.cpp        | 12 ++++++++++--
 5 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/alib2str/src/automaton/string/FSM/DFA.h b/alib2str/src/automaton/string/FSM/DFA.h
index c500749341..1bf890016f 100644
--- a/alib2str/src/automaton/string/FSM/DFA.h
+++ b/alib2str/src/automaton/string/FSM/DFA.h
@@ -56,6 +56,8 @@ automaton::DFA < SymbolType, StateType > stringApi < automaton::DFA < SymbolType
 		token = automaton::AutomatonFromStringLexer::next(input);
 		if(token.type == automaton::AutomatonFromStringLexer::TokenType::TEOF)
 			break;
+		else if (token.type == automaton::AutomatonFromStringLexer::TokenType::NEW_LINE)
+			continue;
 		else
 			automaton::AutomatonFromStringLexer::putback(input, token);
 
@@ -102,7 +104,7 @@ void stringApi < automaton::DFA < SymbolType, StateType > >::parseTransition(std
 	automaton::AutomatonFromStringLexer::Token token = automaton::AutomatonFromStringLexer::next(input);
 	typename ext::vector<SymbolType>::const_iterator iter = symbols.begin();
 
-	while(token.type != automaton::AutomatonFromStringLexer::TokenType::NEW_LINE) {
+	while ( token.type != automaton::AutomatonFromStringLexer::TokenType::NEW_LINE && token.type != automaton::AutomatonFromStringLexer::TokenType::TEOF ) {
 		if(iter == symbols.end())
 			throw exception::CommonException("Invalid line format");
 
diff --git a/alib2str/src/automaton/string/FSM/EpsilonNFA.h b/alib2str/src/automaton/string/FSM/EpsilonNFA.h
index 40f05e7bc4..b63e7a611c 100644
--- a/alib2str/src/automaton/string/FSM/EpsilonNFA.h
+++ b/alib2str/src/automaton/string/FSM/EpsilonNFA.h
@@ -62,6 +62,8 @@ automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > stringApi < automat
 		token = automaton::AutomatonFromStringLexer::next(input);
 		if(token.type == automaton::AutomatonFromStringLexer::TokenType::TEOF)
 			break;
+		else if (token.type == automaton::AutomatonFromStringLexer::TokenType::NEW_LINE)
+			continue;
 		else
 			automaton::AutomatonFromStringLexer::putback(input, token);
 
@@ -109,8 +111,9 @@ void stringApi < automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > >:
 	automaton::AutomatonFromStringLexer::Token token = automaton::AutomatonFromStringLexer::next(input);
 	typename ext::vector<ext::variant<EpsilonType, SymbolType>>::const_iterator iter = symbols.begin();
 
-	while(token.type != automaton::AutomatonFromStringLexer::TokenType::NEW_LINE) {
-		if(iter == symbols.end()) throw exception::CommonException("Invalid line format");
+	while ( token.type != automaton::AutomatonFromStringLexer::TokenType::NEW_LINE && token.type != automaton::AutomatonFromStringLexer::TokenType::TEOF ) {
+		if(iter == symbols.end())
+			throw exception::CommonException("Invalid line format");
 
 		if(token.type != automaton::AutomatonFromStringLexer::TokenType::NONE) {
 			automaton::AutomatonFromStringLexer::putback(input, token);
diff --git a/alib2str/src/automaton/string/FSM/MultiInitialStateNFA.h b/alib2str/src/automaton/string/FSM/MultiInitialStateNFA.h
index 0bf4f14151..c595aa05ce 100644
--- a/alib2str/src/automaton/string/FSM/MultiInitialStateNFA.h
+++ b/alib2str/src/automaton/string/FSM/MultiInitialStateNFA.h
@@ -54,6 +54,8 @@ automaton::MultiInitialStateNFA < SymbolType, StateType > stringApi < automaton:
 		token = automaton::AutomatonFromStringLexer::next(input);
 		if(token.type == automaton::AutomatonFromStringLexer::TokenType::TEOF)
 			break;
+		else if (token.type == automaton::AutomatonFromStringLexer::TokenType::NEW_LINE)
+			continue;
 		else
 			automaton::AutomatonFromStringLexer::putback(input, token);
 
@@ -82,8 +84,9 @@ void stringApi < automaton::MultiInitialStateNFA < SymbolType, StateType > >::pa
 	automaton::AutomatonFromStringLexer::Token token = automaton::AutomatonFromStringLexer::next(input);
 	typename ext::vector<SymbolType>::const_iterator iter = symbols.begin();
 
-	while(token.type != automaton::AutomatonFromStringLexer::TokenType::NEW_LINE) {
-		if(iter == symbols.end()) throw exception::CommonException("Invalid line format");
+	while ( token.type != automaton::AutomatonFromStringLexer::TokenType::NEW_LINE && token.type != automaton::AutomatonFromStringLexer::TokenType::TEOF ) {
+		if(iter == symbols.end())
+			throw exception::CommonException("Invalid line format");
 
 		if(token.type != automaton::AutomatonFromStringLexer::TokenType::NONE) {
 			automaton::AutomatonFromStringLexer::putback(input, token);
diff --git a/alib2str/src/automaton/string/FSM/NFA.h b/alib2str/src/automaton/string/FSM/NFA.h
index 656f317259..37f7005609 100644
--- a/alib2str/src/automaton/string/FSM/NFA.h
+++ b/alib2str/src/automaton/string/FSM/NFA.h
@@ -56,6 +56,8 @@ automaton::NFA < SymbolType, StateType > stringApi < automaton::NFA < SymbolType
 		token = automaton::AutomatonFromStringLexer::next(input);
 		if(token.type == automaton::AutomatonFromStringLexer::TokenType::TEOF)
 			break;
+		else if (token.type == automaton::AutomatonFromStringLexer::TokenType::NEW_LINE)
+			continue;
 		else
 			automaton::AutomatonFromStringLexer::putback(input, token);
 
@@ -101,8 +103,9 @@ void stringApi < automaton::NFA < SymbolType, StateType > >::parseTransition(std
 	automaton::AutomatonFromStringLexer::Token token = automaton::AutomatonFromStringLexer::next(input);
 	typename ext::vector < SymbolType >::const_iterator iter = symbols.begin();
 
-	while(token.type != automaton::AutomatonFromStringLexer::TokenType::NEW_LINE) {
-		if(iter == symbols.end()) throw exception::CommonException("Invalid line format");
+	while ( token.type != automaton::AutomatonFromStringLexer::TokenType::NEW_LINE && token.type != automaton::AutomatonFromStringLexer::TokenType::TEOF ) {
+		if(iter == symbols.end())
+			throw exception::CommonException("Invalid line format");
 
 		if(token.type != automaton::AutomatonFromStringLexer::TokenType::NONE) {
 			automaton::AutomatonFromStringLexer::putback(input, token);
diff --git a/alib2str/test-src/automaton/AutomatonTest.cpp b/alib2str/test-src/automaton/AutomatonTest.cpp
index bf78ed3155..d1310fd946 100644
--- a/alib2str/test-src/automaton/AutomatonTest.cpp
+++ b/alib2str/test-src/automaton/AutomatonTest.cpp
@@ -40,13 +40,21 @@ void AutomatonTest::FSMStringParserTest() {
 					"1 2 - - - -\n"
 					"2 3 - - - -\n"
 					"3 - - 4 - -\n"
-					"4 - 5 - - 5\n"
+					"\n"
+					"<4 - 5 - - 5\n"
+					"<5 - - - - 3";
+		std::string input2 = 	"ENFA a b c d #E\n"
+					">0 3|4 5 1|3|4 - 2\n"
+					"1 2 - - - -\n"
+					"2 3 - - - -\n"
+					"3 - - 4 - -\n"
+					"<4 - 5 - - 5\n"
 					"<5 - - - - 3\n";
 		automaton::Automaton automaton = alib::StringDataFactory::fromString (input);
 
 		std::string output = alib::StringDataFactory::toString(automaton);
 
-		CPPUNIT_ASSERT( input == output );
+		CPPUNIT_ASSERT( input2 == output );
 
 		automaton::Automaton automaton2 = alib::StringDataFactory::fromString (output);
 
-- 
GitLab