2012-07-19 48 views
2

如果有以下形式的输入文件:我如何说服Bison解析文件的一部分?

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的时候更灵活: ?

回答

1

添加到您的语法:

all_begins: begins 
      ; 

begins: begins begin 
     | begin 
     ; 

更换%下手:

%start all_begins 

并调用yyparse()一次。

4

最简单的方法是添加(双)制作到.Y文件的顶部:

input: begin | input begin; 

现在yyparse将解析的多个输入。如果你真的想要对yyparse多次调用,您可以改为可能逃脱:

begin: BEGIN stuff END { YYACCEPT; } ; 

YYACCEPT是一个特殊的内置导致yyparse与0立即返回(在做任何需要的内部清理之后)。我说“可能”,因为这只有在野牛减少begin时才会起作用,默认缩减(无预见)。如果这是beginbegin的唯一规则,则在这种情况下将不会使用这种情况,因为在识别此类情况时需要使用lookahead。

+0

我宁愿反复调用yyparse;这对于这个特定的应用程序更有意义。 – user1538392 2012-07-19 18:09:06

+0

我宁愿反复调用yyparse;这对于这个特定的应用程序更有意义。 YYACCEPT立即返回*,不执行语义规则;我添加了“begin0:begin {YYACCEPT;};”使其工作。它现在处理EOF中的所有块和错误。我需要添加一个空的规则来处理EOF,我认为这会使它工作。谢谢。 – user1538392 2012-07-19 18:15:21

+0

是的,添加一个空的规则,将树根指针设置为空以表示eof已到达的调用应用程序似乎工作。 – user1538392 2012-07-19 18:19:23