关于bison2.4.1中的错误恢复

关于bison2.4.1中的错误恢复,bison,yacc,lex,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 D

我想处理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()并显示语法错误


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

yacc/bison中的错误规则不能防止错误——它们可以从错误中恢复。因此,在本例中,您会得到一个错误(它调用
yyerror(“语法错误”)
),然后查找要恢复的错误规则。因此,在这种情况下,它将处于一种状态,寻找一个
,“
要转移,在转移
一方之后,
:”
,和
ID
。在此状态下,a
;',因此它将发出语法错误。错误发生后,它将开始弹出状态,直到找到一个产生错误的状态——在本例中,3个状态将到达与
PartyDecl
开头相对应的状态。在该状态下,它将移动错误,使其处于除
ENDL
之外的状态。然后,它将丢弃输入符号(
及其后的任何内容),直到找到一个
ENDL
,它将移动该ENDL,使其处于可以减少
PartyDecl:error ENDL
规则的状态,调用
printf(“有错误”)


如果它从未找到
ENDL
,它将在到达EOF后退出,并且从未从错误中恢复。此外,在
ENDL
之后,它将在错误恢复模式下再运行2个班次——如果在此之前它又出现了一个错误,它将不会调用yerror,而是直接进入错误恢复。

yacc/bison中的错误规则不会阻止错误——它们会从错误中恢复。因此,在本例中,您会得到一个错误(它调用
yyerror(“语法错误”)
),然后查找要恢复的错误规则。因此,在这种情况下,它将处于一种状态,寻找一个
,“
要转移,在转移
一方之后,
:”
,和
ID
。在此状态下,a
;',因此它将发出语法错误。错误发生后,它将开始弹出状态,直到找到一个产生错误的状态——在本例中,3个状态将到达与
PartyDecl
开头相对应的状态。在该状态下,它将移动错误,使其处于除
ENDL
之外的状态。然后,它将丢弃输入符号(
及其后的任何内容),直到找到一个
ENDL
,它将移动该ENDL,使其处于可以减少
PartyDecl:error ENDL
规则的状态,调用
printf(“有错误”)

如果它从未找到
ENDL
,它将在到达EOF后退出,并且从未从错误中恢复。此外,在
ENDL
之后,它将在错误恢复模式下再保持2个班次——如果在此之前它收到另一个错误,它将不会调用yerror,而是直接转到错误恢复。

可能重复的