关于从bison2.4.1恢复错误

时间:2012-04-14 21:53:11

标签: bison yacc lex

我想从bison2.4.1处理错误恢复。

我提到了一本oreilly的书(lex& yacc)以及一些将错误令牌放入我的规则的网站,

但我觉得它不起作用。它无法帮助我处理错误恢复!

我的代码如下:

PDL:
    DataDesc ComputationDesc    {Build_front_proc($1,$2);}
    ;
DataDesc:
    PartyDecl AccLvDesc     {$$ = echo_dataDesc($1, $2);}
    ;
// Party Description
PartyDecl:
    PARTY ':' ID ',' ID ENDL    {if($3->is_func || $5->is_func)
                        yyerror("it is a reserved word!\n");
                    $$ = echo_partyDecl($3->name,$5->name);}
    |error ENDL         {printf("There is a error");}
    ;

我说过“Party:id_a;” (它应该是“Party”之后的两个id名称。)

它直接进入yyerror()并显示语法错误......

我不知道它为什么不处理这个错误。

1 个答案:

答案 0 :(得分:1)

yacc / bison中的错误规则不会阻止错误 - 它们会从错误中恢复。因此,在这种情况下,您会收到错误(并调用yyerror("syntax error")),然后查找要恢复的错误规则。因此,在这种情况下,在转移','PARTY':'之后,它将处于寻找ID移位的状态。在此状态下,无法解析';',因此会发出语法错误。在错误之后,它将开始弹出状态,直到找到一个生成错误的状态 - 在这种情况下,有3个状态到达对应于PartyDecl开头的状态。在该状态下,它将改变错误,使其处于期望ENDL的状态。然后它将丢弃输入符号(;及其后的任何内容),直到找到ENDL,它将移位,处于可以减少PartyDecl: error ENDL规则的状态,致电printf("There is a error");

如果它从未找到ENDL,它将在到达EOF后退出,从未从错误中恢复。此外,在ENDL之后,它将继续处于错误恢复模式下再移2次 - 如果在此之前它再次出现错误,它将不会调用错误,而是直接进入错误恢复。