我想从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()并显示语法错误......
我不知道它为什么不处理这个错误。
答案 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次 - 如果在此之前它再次出现错误,它将不会调用错误,而是直接进入错误恢复。