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