处理ParseTreeListener生成的异常

时间:2014-05-05 14:43:12

标签: antlr antlr4

新手问题。想象一下,ParseTreeListener实现了许多需要异常处理的进入和退出方法。为了避免对这40多种方法中的每一种单独编写try-catch,我更喜欢一种解决方案,它允许以集中方式捕获监听器的异常,并且仍然可以参考上下文(行,位置)抛出异常的地方,就像下面的虚代码一样:

TestParser parser = new TestParser(tokens);
ParseTreeWalker walker = new ParseTreeWalker();
TestListener listener = new DefaultTestListener();
ParseTree tree = parser.entrynode();

try {
  walker.walk(listener, tree);
} catch (RuntimeException e) {
  LOG.info("Exception at " + tree.getContextWhereExceptionWasThrown());
}

有可能吗?

1 个答案:

答案 0 :(得分:1)

鉴于您只显示了虚构代码,您需要验证您所看到的异常的真实来源和种类。

走另一个有效的parseTree不应该抛出除你选择抛出之外的任何异常。 OTOH,解析器将抛出您似乎关注的类型的异常。

如果它们确实是解析器异常,则可以将它们明确地标记为RecognitionException而不是RuntimeException异常。该异常对象具有您似乎正在寻找的方法:getContext,getOffendingToken等。

如果它们在执行助行程序时发生,则需要澄清有关异常类型的问题。如果要抛出异常,请在当前上下文中包含从TerminalNodes和ParserRuleContext对象获得的相关令牌索引和间隔,以及“一个适合所有”的对象。异常。