在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
令牌的必要性,并让解析器在完成时找出它。我该怎么做?
谢谢!
答案 0 :(得分:1)
在EBNF术语中,您对in
的定义是
in ::= (commandList EOL)*
允许多个EOL。你想要的是
in ::= commandList* EOL
哪个应该可以解决
start ::= in EOL .
in ::= .
in ::= in commandList .
请注意,这不允许完全空输入(甚至不是EOL);如果这是一个问题,你可以根据需要调整一些东西。