2

如果 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.

这是有道理的;bison 想要解析整个文件。有没有办法让野牛在 $end 的定义中更加灵活?

4

2 回答 2

4

最简单的方法是在 .y 文件的顶部添加(一对)产品:

input: begin | input begin;

现在 yyparse 将解析多个输入。如果你真的想多次调用 yyparse ,你可能会逃脱:

begin: BEGIN stuff END { YYACCEPT; } ;

YYACCEPT是一个特殊的内置函数,它会导致 yyparse 立即返回 0(在进行任何需要的内部清理之后)。我说“可能”,因为这只有在野牛begin通过默认减少(无前瞻)减少时才有效。如果这是唯一的规则begin并且begin不用于识别它需要前瞻的上下文中,情况就会如此。

于 2012-07-19T17:41:03.280 回答
1

将此添加到您的语法中:

all_begins: begins
          ;

begins: begins begin
      | begin
      ;

将 %start 替换为:

%start all_begins

只需调用一次 yyparse() 即可。

于 2012-07-19T17:40:29.213 回答