【问题标题】:How to prevent a particular ANTLR4 error recovery strategy?如何防止特定的 ANTLR4 错误恢复策略?
【发布时间】:2025-11-26 12:00:02
【问题描述】:

在一种情况下,我的语法允许 ... ID = expr;... ID = expr(expr [,expr]*);,即带有终止分号的表达式和函数调用。当参数列表中有错误时,ANTLR 决定最简单的解决方案是用分号替换左括号。这确实符合规则,但是输入的其余部分看起来像垃圾。随后的解析错误具有误导性。

在这种情况下,我认为这是错误的恢复方式。错误出现在参数列表中的可能性很大,而不是 ( 的拼写错误 ;。我想告诉 ANTLR,如果它在那里找到一个左括号,它必须使用它,而不是替换它。然后(在我的梦中)ANTLR 会正确诊断内心表达的问题。

我读了这本书并尝试了一些实验,但没有一个能解决这个问题。我尝试使词法分析器依赖于状态,例如区分顶层和内部分号。问题是,如果 ANTLR 愿意创建一个标记,那么词法分析器产生什么并不重要。

【问题讨论】:

  • 晚了 5 年,但你有没有找到解决这个问题的方法?

标签: antlr4


【解决方案1】:

要提供非默认错误处理,请实现您自己的ANTLRErrorStrategy。然后使用Parser.setErrorHandler(new YourErrorStrategy()) 添加它。

查看同一目录中的 DefaultErrorStrategy 以了解方法的工作定义。

【讨论】:

  • 自适应预测器似乎挡住了路。预测器确定匹配的是 ID 规则,而不是函数调用规则,到触发错误恢复时,已经太迟了。
最近更新 更多