Skip to content
Snippets Groups Projects
Commit 9cdfef0e authored by Jan Trávníček's avatar Jan Trávníček
Browse files

string parsing : allow #E in place of epsilon rule

parent 9edd8494
No related branches found
No related tags found
No related merge requests found
Pipeline #
......@@ -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);
......
......@@ -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"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment