antlr4错误处理甚至没有编译

问题描述:

我按照antlr网站上的错误处理说明http://www.antlr2.org/doc/err.html(它说antlr2,但我找不到antlr4的替代方法)并为我的规则编写了异常处理,如下所示。antlr4错误处理甚至没有编译

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

} 

但是,当我试图生成语法解析器是如下失败: Java的罐子../Downloads/antlr-4.7-complete.jar vba.g4 -package VBA -o出来 错误(50):vba.g4:500:4:语法错误:'catch'对我来说是一个完整的惊喜,同时匹配规则前导码

任何帮助,非常感谢。

Antlr4与Antlr2完全不同。

How to implement error handling in ANTLR4

更新有一个简单的方法:通过在看看这个问题(和答案)启动

错误报告,基本的方法是使实现ANTLRErrorListener接口的类。 BaseErrorListener对所有方法都有空的实现,所以你只需要实现你关心的那些。你可能最关心的是syntaxError()

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

在解析期间遇到错误时,您将获得该类的syntaxError()调用。

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

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

一个非常简单的方法是处理语法中可能出现的错误。不知道你能走多远,但这可能是最简单的方法。

+0

这个例子看起来很复杂。我的情况可能是简单地忽略某些规则中的错误(我需要接受有错误的输入)。是否没有antlr4错误处理文档? –

+0

@HughDarling不够公平 - 我的答案稍微延长了一点。 – janm