如何在 yacc/lex 项目中自定义我的错误消息以显示问题的行和类型?

How can I customize my error message in yacc/lex project to display the line and type of problem?

我是编程新手,但我有一个 yacc/lex 项目,并且在详细编写错误消息(错误的行和类型)方面有些困难。请提供任何有关小示例的帮助。

问不好的问题得到正确但没有信息的答案

void yyerror(const char *s);

extern int line_num;

void yyerror(const char *s)
{
   std::cerr << "PARSING ERROR: " << line_num << " " << s << std::endl;
   exit(1);
}

将以下内容添加到您的 flex 扫描仪定义中,以使扫描仪跟踪行号:

%option yylineno

(参见 the flex manual。)

然后将以下声明添加到您的 bison 语法中:

%define parse.error verbose
%define parse.lac full

(参见 bison 手册中关于 error reporting and LAC (lookahead correction) 的章节。

最后,使用行号信息的yyerror定义。至少,类似于:

void yyerror(const char* msg) {
  fprintf(stderr, "At line %d: %s\n", yylineno, msg);
}