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