diff --git a/alib2str/src/grammar/string/common/GrammarFromStringParserCommon.h b/alib2str/src/grammar/string/common/GrammarFromStringParserCommon.h index 0b550f3cfbc9ff5946a006111a5877efc34257ab..fadc0303f765e57ac429882c487b6710ab777379 100644 --- a/alib2str/src/grammar/string/common/GrammarFromStringParserCommon.h +++ b/alib2str/src/grammar/string/common/GrammarFromStringParserCommon.h @@ -104,13 +104,21 @@ ext::map<SymbolType, ext::set<ext::vector<SymbolType>>> GrammarFromStringParserC ext::vector<SymbolType> rhs; token = grammar::GrammarFromStringLexer::next(input); - if(token.type != grammar::GrammarFromStringLexer::TokenType::COMMA && token.type != grammar::GrammarFromStringLexer::TokenType::SET_END && token.type != grammar::GrammarFromStringLexer::TokenType::SEPARATOR) while(true) { - grammar::GrammarFromStringLexer::putback(input, token); - - rhs.push_back(alib::stringApi<SymbolType>::parse(input)); - token = grammar::GrammarFromStringLexer::next(input); - if(token.type == grammar::GrammarFromStringLexer::TokenType::SEPARATOR || token.type == grammar::GrammarFromStringLexer::TokenType::COMMA || token.type == grammar::GrammarFromStringLexer::TokenType::SET_END) { - break; + if ( token.type != grammar::GrammarFromStringLexer::TokenType::COMMA + && token.type != grammar::GrammarFromStringLexer::TokenType::SET_END + && token.type != grammar::GrammarFromStringLexer::TokenType::SEPARATOR ) { + if ( token.type == grammar::GrammarFromStringLexer::TokenType::EPSILON ) { + token = grammar::GrammarFromStringLexer::next(input); + } else while(true) { + grammar::GrammarFromStringLexer::putback(input, token); + + rhs.push_back(alib::stringApi<SymbolType>::parse(input)); + token = grammar::GrammarFromStringLexer::next(input); + if ( token.type == grammar::GrammarFromStringLexer::TokenType::SEPARATOR + || token.type == grammar::GrammarFromStringLexer::TokenType::COMMA + || token.type == grammar::GrammarFromStringLexer::TokenType::SET_END ) { + break; + } } } result[lhs].insert(rhs); diff --git a/alib2str/test-src/grammar/GrammarTest.cpp b/alib2str/test-src/grammar/GrammarTest.cpp index 71153f2174653eddeb54d02014cd35e7fd8d881f..198fe871f67d4cec14f8c1b97eb2768228f732fc 100644 --- a/alib2str/test-src/grammar/GrammarTest.cpp +++ b/alib2str/test-src/grammar/GrammarTest.cpp @@ -40,23 +40,32 @@ void GrammarTest::tearDown() { void GrammarTest::stringParserTest() { { - std::string input = "CNF (\n" + std::string input1 = "CNF (\n" "{A, B, S},\n" "{a, b},\n" "{ A -> A A | a,\n" " B -> B B | b,\n" " S -> | B S | S A},\n" "S)\n"; - grammar::Grammar grammar = alib::StringDataFactory::fromString (input); + grammar::Grammar grammar1 = alib::StringDataFactory::fromString (input1); + std::string input2 = "CNF (\n" + "{A, B, S},\n" + "{a, b},\n" + "{ A -> A A | a,\n" + " B -> B B | b,\n" + " S -> #E | B S | S A},\n" + "S)\n"; + grammar::Grammar grammar2 = alib::StringDataFactory::fromString (input2); - std::string output = alib::StringDataFactory::toString(grammar); + std::string output1 = alib::StringDataFactory::toString(grammar1); - std::cout << "\"" << input << "\"" << std::endl << std::endl << "\"" << output << "\"" << std::endl; - CPPUNIT_ASSERT( input == output ); + std::cout << "\"" << input1 << "\"" << std::endl << std::endl << "\"" << output1 << "\"" << std::endl; + CPPUNIT_ASSERT( input1 == output1 ); - grammar::Grammar grammar2 = alib::StringDataFactory::fromString (output); + grammar::Grammar grammar3 = alib::StringDataFactory::fromString (output1); - CPPUNIT_ASSERT( grammar == grammar2 ); + CPPUNIT_ASSERT( grammar1 == grammar3 ); + CPPUNIT_ASSERT( grammar1 == grammar2 ); } { std::string input = "RIGHT_RG (\n"