0

按照这个旧教程,我试图让柠檬解析器自动终止对EOL令牌的解析。解析器的相关部分如下所示:

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

下面是我使用 Flex 扫描的令牌执行解析器的方式:

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此处检查令牌的需要,并让解析器确定何时完成。我怎么做?

谢谢!

4

1 回答 1

1

在 EBNF 术语中,您的定义in

in ::= (commandList EOL)*

这允许多个 EOL。你想要的是

in ::= commandList* EOL

哪个应该解决

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

请注意,这不允许完全为空的输入(甚至没有 EOL);如果这是一个问题,您可以根据需要进行调整。

于 2013-01-30T16:46:47.253 回答