diff --git a/alib2str/src/automaton/string/FSM/DFA.h b/alib2str/src/automaton/string/FSM/DFA.h index c50074934177fdaf25ed682c515f1cf031f26ff4..1bf890016f5178e38bdd2c5f3cf0ca4c1501e926 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 40f05e7bc4779e02c9e8b867d3a76680af77a671..b63e7a611cfaf607791a431e17acf5390e9b0799 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 0bf4f141515ddd604b24e0a77d71c1fa04ef6d58..c595aa05cef41e66bf4d4624f51807d62942c764 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 656f317259f83203af8882b1c17240cdcba391ab..37f700560982c49f1c85885ab04a0e4c684bfae4 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 bf78ed3155465ef75a833824ffdf2fe2e795cc1a..d1310fd946a9ae20e64f4c7e3a4b57f06e9fcea7 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);