如何防止特定的ANTLR4错误恢复策略?

时间:2015-07-31 17:50:27

标签: antlr4

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

在这种情况下,我认为这是错误的恢复方式。错误在参数列表中的几率非常高,而不是(的{​​{1}}错字。我想告诉ANTLR,如果它找到一个开括号,它必须消耗它,而不是替换它。然后(在我的梦中)ANTLR将正确地用内在表达来诊断问题。

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

1 个答案:

答案 0 :(得分:2)

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

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