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 ...
}

08-16 22:14