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"