我有一个"自定义"要求,即在解析时(即成功匹配函数调用后)验证语言中的函数调用。我知道这通常是与语义相关的,因此通常稍后执行,但再一次,这是一个"自定义"要求。。。
目前,我使用一个操作,在成功匹配后添加函数验证代码。当验证失败时,我尝试抛出一个简单的新RecognitionException实例,但显然DefaultErrorStrategy类对其处理的错误类型进行了硬编码,并将其自身限制为RecognitionException子类。
问题是,我想重用整个默认的错误处理机制,同时使用我自己的异常类型(或者至少是消息)。
问题:我如何抛出一个普通的RecognitionException实例或带有自定义消息的子类型,与现有的子类型不同,YET重用默认的错误处理机制?
在调查了一点之后,我正在回答我自己的问题。。。
DefaultErrorStrategy
确实已经处理了任何其他RecognitionException
子类型,只需通知解析器的注册错误侦听器即可。它在reportError()
的javadoc:所有其他类型中都有明确的说明:调用{@linkParser#notifyErrorListeners}来报告异常,更不用说在代码itsef:DefaultErrorStrategy.java中非常清楚了。
一开始误导我的是,在任何其他RecognitionException
子类型的情况下,一条消息(我宁愿没有!)也被打印到stderr。