antlr4错误处理不';我甚至都不会编译

antlr4错误处理不';我甚至都不会编译,antlr4,Antlr4,我按照antlr网站上的错误处理说明(上面说的是antlr2,但我找不到antlr4的替代品)编写了规则的异常处理,如下所示 subStmt : (visibility WS)? (STATIC WS)? SUB WS? ambiguousIdentifier (WS? argList)? endOfStatement block? END_SUB ; exception catch [RecognitionException ex] { } 但当我尝试为语法生成解析器时,失败如下: j

我按照antlr网站上的错误处理说明(上面说的是antlr2,但我找不到antlr4的替代品)编写了规则的异常处理,如下所示

subStmt : 
(visibility WS)? (STATIC WS)? SUB WS? ambiguousIdentifier (WS? argList)? endOfStatement
block? 
END_SUB
;
exception
catch [RecognitionException ex] {

}
但当我尝试为语法生成解析器时,失败如下: java-jar../Downloads/antlr-4.7-complete.jar vba.g4-package vba-o out 错误(50):vba.g4:500:4:语法错误:“catch”在匹配规则序言时让我大吃一惊


非常感谢您的帮助。

Antlr4与Antlr2完全不同。首先看一下这个问题(以及答案):

使用简单的方法更新:

对于错误报告,基本方法是创建一个实现
antlErrorListener
接口的类
BaseErrorListener
对所有方法都有空实现,因此您只需要实现您关心的方法。您可能最关心的是
syntaxError()

在解析器对象上,调用
removeErrorListeners()
清除内部错误侦听器,然后使用要处理错误的类的实例调用
addErrorListener()

然后,当解析过程中遇到错误时,您将获得对该类的
syntaxError()
调用

其他方法可能(也可能不)让你做你想做的事情;我没有使用此接口从解析错误中恢复

为了从特定错误中恢复,可以使用
antlErrorStrategy
接口实现一个类。这变得复杂;有关默认实现,请参见
DefaultErrorStrategy


一个非常简单的方法是处理语法中可能出现的错误。不确定你能做多少,但这可能是最简单的方法。

这个例子看起来很复杂。我的情况可能是忽略某些规则中的错误(我需要接受有错误的输入)。难道没有一个antlr4错误处理文档吗?@HughDarling很公平——我稍微扩展了我的答案。