BYACCJ:如何在错误消息中包含行号?

BYACCJ: How do I include line number in my error message?

这是我当前的错误处理函数:

public void yyerror(String error) {
    System.err.println("Error: "+ error);
}

这是我在 BYACC/J homepage. I can't find any way to add the line number. My question is similar to this question 上找到的默认错误函数。但它的解决方案在这里不起作用。

对于我的词法分析器,我使用的是 JFlex 文件。

这与您 link 问题中提出的 bison/flex 解决方案没有太大区别。至少,原理是一样的。只是细节不同。

关键事实是需要计算行数的是扫描器,而不是解析器,因为是扫描器将输入文本转换为标记。解析器对原始文本一无所知;它只是接收到一系列经过良好处理的标记。

所以我们必须搜索 JFlex 的文档来弄清楚如何让它跟踪行号,然后我们在选项和声明部分找到以下内容:

  • %line

    Turns line counting on. The int member variable yyline contains the number of lines (starting with 0) from the beginning of input to the beginning of the current token.

JFlex 手册没有提到 yyline 是私有成员变量,因此为了从解析器中获取它,您需要在 JFlex 文件中添加如下内容:

%line
{
    public int GetLine() { return yyline + 1; }
    // ...

}

然后可以在错误函数中添加对GetLine的调用:

public void yyerror (String error) {
  System.err.println ("Error at line " + lexer.GetLine() + ": " + error);
}

这有时会产生令人困惑的错误消息,因为在调用 yyerror 时,解析器已经请求了先行标记,它可能在错误之后的行上,甚至与错误分开几行评论。 (当错误是缺少语句终止符时,通常会出现此问题。)但这是一个好的开始。