如果a的输入文件格式为:
BEGIN
stuff....
END
BEGIN
stuff ...
END
我的.y文件格式为
%token BEGIN
%token END
%start begin
begin: BEGIN stuff END
我要做的是重复调用yyparse,解析一个BEGIN / END,直到eof。
第一次调用yyparse报告:
syntax error, unexpected BEGIN, expecting $end.
这是有道理的;野牛想解析整个文件。有野牛的方法吗? $ end的定义更灵活吗?
答案 0 :(得分:4)
最简单的方法是在.y文件的顶部添加(一对)作品:
input: begin | input begin;
现在yyparse会解析多个输入。如果你真的想要多次调用yyparse,你可能可能会逃避:
begin: BEGIN stuff END { YYACCEPT; } ;
YYACCEPT
是一个特殊的内置函数,它使yyparse立即返回0(在进行任何所需的内部清理之后)。我说“可能”,因为这只有在野牛减少begin
默认减少(没有预测)时才会起作用。如果这是begin
的唯一规则并且begin
未在识别它需要预测的上下文中使用,则会出现这种情况。
答案 1 :(得分:1)
将此添加到您的语法中:
all_begins: begins
;
begins: begins begin
| begin
;
将%start替换为:
%start all_begins
只需调用yyparse()一次。