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



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

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

相关内容

  • 没有找到相关文章

最新更新