yyerror在默认情况下显示“语法错误”。我想更改yyerror函数的参数。通过这种方式,我可以向用户打印更多有用的错误消息。例如,在功能清算中,用户做错了事。如果可以更改yyerror函数的参数,则可以向用户打印更有意义的消息。
func_Dec:error_code = 1 ....
var_dec:error_code = 2 ....
根据error_code的值。我可以在yyerror函数中打印如下错误消息:
void yyerror(int x){
if(x==1){printf("error while function decleration");};
if(x==2){printf("error while variable decleration ");};
}
最佳答案
那将是非常困难/不可能的。
当yacc遇到未在其前瞻集中设置的令牌时,它将减少直到在堆栈上的可见该令牌有效的状态为止。一旦减少(弹出)所有状态并且堆栈已变空,便得出结论,它无法与令牌匹配并报告Syntax error
。
您可以做的是维护自己所发生状态的一些状态信息,并在yyerror
中使用它。
您可以自己编写yyerror
函数。通常,如果未提供yyerror
函数,则yacc使用库中的默认函数。但是您可以自己写一个,例如:
int yyerror(void) {
if (gMyState== ERR_DECL) printf("Error in function declaration\n);
else ...
}