关于bison2.4.1中的错误恢复
我想处理bison2.4.1中的错误恢复 我参考了一本oreilly的书(lex&yacc)和一些网站,将错误标记放入我的规则中 但我认为它不起作用。它不能帮助我处理错误恢复 我的代码如下:关于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
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,而是直接转到错误恢复。可能重复的