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

问题描述 投票:0回答:1

这是我当前的错误处理功能:

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

这是我在BYACC / J homepage上发现的默认错误功能。我找不到任何添加行号的方法。我的问题与此question相似。但是解决方案在这里行不通。

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

java yacc parser-generator jflex
1个回答
1
投票

与您链接的问题中提出的野牛/柔韧解决方案没什么不同。至少,原理是相同的。仅细节有所不同。

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

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

  • %line

    打开行计数。 int成员变量yyline包含从输入开始到当前令牌开始的行数(从0开始)。

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时,解析器已经请求了超前标记,该标记可能在错误之后的行上,或者甚至通过几行注释与错误分开。 (当错误是缺少语句终止符时,通常会出现此问题。)但这是一个好的开始。

© www.soinside.com 2019 - 2024. All rights reserved.