Antlr4 检查访客中的例外情况

Antlr4 检查访客中的例外情况,antlr4,Antlr4,我正在学习ANTLR4,以前没有使用解析器生成器的经验 当我定义自己的访问者实现时,我必须重写BaseVisitor的方法(例如,我正在寻找位于的EvalVisitor类)。如果我的方法实现可能抛出异常,我应该怎么做?我不能使用checked异常,因为原始方法有一个空的throws子句。我是否需要使用未检查的异常?(这似乎是一个糟糕的Java设计)。例如,假设在EvalVisitor类中,我希望方法visitId(第41页)抛出一个用户定义的异常,比如unfineded,而不是返回0。我应该如何

我正在学习ANTLR4,以前没有使用解析器生成器的经验

当我定义自己的访问者实现时,我必须重写BaseVisitor的方法(例如,我正在寻找位于的EvalVisitor类)。如果我的方法实现可能抛出异常,我应该怎么做?我不能使用checked异常,因为原始方法有一个空的throws子句。我是否需要使用未检查的异常?(这似乎是一个糟糕的Java设计)。例如,假设在EvalVisitor类中,我希望方法visitId(第41页)抛出一个用户定义的异常,比如unfineded,而不是返回0。我应该如何编写代码?

您有两种选择:

  • 在访问者方法本身内部处理异常
  • 将选中的异常包装为未选中的异常。一种可能性是,但您必须自己确定这在应用程序中是否有意义

    try {
        ...
    } catch (IOException ex) {
        throw new ParseCancellationException(ex);
    }
    

  • “这本书?”你能提供一个链接,或者至少是一个标题吗?@rogaos,这是一个很好的观点,但在这种情况下,只有一种可能性(我在问题中编辑过)。嗯,重点是我的访问方法应该在其接口中有一个throws子句。例如,在EvalVisitor类的示例中,对访问方法使用以下签名是有意义的:public Integer visit_u(…)抛出unfineded,这意味着如果遇到以前未分配的某个标识符,则访问抛出异常。这似乎不能通过重用ANTLR代码来实现,而应该使用未经检查的异常,但它们对客户端的信息量较小。您可以使用适当的Java风格编写代码,方法是编写访问者实现,使
    未定义的
    异常永远不会被抛出。一种可能是单独使用一个访问者来收集有关定义的信息,然后如果该访问者的结果表明未定义某些内容,则抛出异常(在访问者代码之外)。当您在上面描述的访问者中进行操作时,所有项目都已定义,并且
    抛出
    子句变得不必要。我认为有另一个访问者并不会改变问题,您建议的是,将未定义的情况建模为附加返回值,而不是异常。也就是说,visit方法将具有签名公共整数或未定义的visit(…)。这是一个可能且干净的解决方案,但是,当然,您失去了自动错误传播的好处。