1

我想从 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");}
    ;

我给了“派对:id_a;”的话 (它应该是“Party”后面的两个id名称。)

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

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

4

1 回答 1

1

yacc/bison 中的错误规则不会阻止错误——它们会从错误中恢复。所以在这种情况下,你得到一个错误(它调用yyerror("syntax error")),然后寻找错误规则来恢复。因此,在这种情况下,它将处于在 shift 、 和 之后寻找转移的','状态。在这种状态下,a无法解析,因此会发出语法错误。在错误之后,它将开始弹出状态,直到找到一个产生错误的状态——在这种情况下,有 3 个状态到达对应于 a 开头的状态。在该状态下,它将转移错误,使其处于期望状态。然后它会丢弃输入符号(the和它之后的任何东西),直到找到一个PARTY':'ID';'PartyDeclENDL;ENDL,它将转移,进入一个可以减少PartyDecl: error ENDL规则的状态,调用printf("There is a error");

如果它永远找不到ENDL,它将在到达 EOF 后退出,从未从错误中恢复。此外,它会在错误恢复模式下再保持 2 个班次ENDL-- 如果在此之前再次出现错误,它不会调用 yerror 而是直接进入错误恢复。

于 2012-04-15T06:15:59.927 回答