这是我当前的错误处理功能:
public void yyerror(String error) {
System.err.println("Error: "+ error);
}
这是我在BYACC / J homepage上发现的默认错误功能。我找不到任何添加行号的方法。我的问题与此question相似。但是解决方案在这里行不通。
对于我的词法分析器,我正在使用JFlex文件。
与您链接的问题中提出的野牛/柔韧解决方案没什么不同。至少,原理是相同的。仅细节有所不同。
关键事实是需要计数行的是扫描仪,而不是解析器,因为是扫描仪将输入文本转换为标记。解析器对原始文本一无所知。它只接收经过良好处理的令牌序列。
因此,我们必须搜索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
时,解析器已经请求了超前标记,该标记可能在错误之后的行上,或者甚至通过几行注释与错误分开。 (当错误是缺少语句终止符时,通常会出现此问题。)但这是一个好的开始。