如何让Lemon解析器在换行符上终止?

时间:2013-01-30 07:30:58

标签: parsing token eol lemon

this old tutorial之后,我试图让柠檬解析器自动终止EOL令牌上的解析。 the parser的相关部分如下所示:

start ::= in .
in ::= .
in ::= in commandList EOL .
{
    printf("start ::= commandList .\n");
    printf("> ");
}

以下是我使用Flex扫描的令牌executing the parser的方法:

int lexCode;
do {
    lexCode = yylex(scanner);
    Parse(shellParser, lexCode, yyget_text(scanner));
    // XXX This line should not be necessary; EOL should automatically
    // terminate parsing. :-(
    if (lexCode == EOL) Parse(shellParser, 0, NULL);
} while (lexCode > 0);

我想在这里消除检查EOL令牌的必要性,并让解析器在完成时找出它。我该怎么做?

谢谢!

1 个答案:

答案 0 :(得分:1)

在EBNF术语中,您对in的定义是

in ::= (commandList EOL)*

允许多个EOL。你想要的是

in ::= commandList* EOL

哪个应该可以解决

start ::= in EOL .
in ::= .
in ::= in commandList .

请注意,这不允许完全空输入(甚至不是EOL);如果这是一个问题,你可以根据需要调整一些东西。