我如何说服Bison解析部分文件?

时间:2012-07-19 15:49:45

标签: bison yacc

如果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的定义更灵活吗?

2 个答案:

答案 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()一次。