我按照antlr网站http://www.antlr2.org/doc/err.html上的错误处理说明(它说antlr2但我找不到antlr4的替代方法)并为我的规则编写了异常处理,如下所示。
subStmt :
(visibility WS)? (STATIC WS)? SUB WS? ambiguousIdentifier (WS? argList)? endOfStatement
block?
END_SUB
;
exception
catch [RecognitionException ex] {
}
但是当我尝试为语法生成Parser时,它失败如下: java -jar ../Downloads/antlr-4.7-complete.jar vba.g4 -package vba -o out 错误(50):vba.g4:500:4:语法错误:匹配规则前导码时,'catch'对我来说是一个完全的惊喜
非常感谢任何帮助。
答案 0 :(得分:0)
Antlr4与Antlr2完全不同。首先看看这个问题(和答案):
How to implement error handling in ANTLR4
用简单的方法更新:
对于错误报告,基本方法是创建一个实现ANTLRErrorListener
接口的类。 BaseErrorListener
具有所有方法的空实现,因此您只需要实现您关心的方法。您可能最关心syntaxError()
。
在解析器对象上,调用removeErrorListeners()
以清除内部错误侦听器,然后使用要处理错误的类的实例调用addErrorListener()
。
在解析过程中遇到错误时,您将在该类上获得syntaxError()
次调用。
其他方法可能(或可能不)让你做你想做的事;我没有使用此接口从解析错误中恢复。
要从特定错误中恢复,可以使用ANTLRErrorStrategy
接口实现一个类。那变得复杂了;有关默认实现,请参阅DefaultErrorStrategy
。
一种非常简单的方法是处理语法中可能存在的错误。不知道你能走多远,但这可能是最简单的方法。