You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Antlr4中抛出ParseCancellationException无法终止解析的问题求助

Antlr4中抛出ParseCancellationException无法终止解析的问题求助

我正在做一个迷你编译器项目,本来打算在parseListener类里抛出ParseCancellationException(或者类似的异常),遇到致命错误时终止解析,但实际执行时这个异常直接被忽略了。

我想知道有没有办法抛出异常后成功终止解析。我已经通过调试确认异常确实被抛出了,但就是没起作用。我还试过抛出RuntimeException,结果也一样。

我的程序用stack存储表达式的计算结果,有意思的是EmptyStackException反而能成功终止解析。

以下是我遇到问题的方法代码:

@Override
public void exitAddExpr(BasicLangParser.AddExprContext ctx) {
    Util.Value left = stack.pop();
    Util.Value right = stack.pop();

    if (left.datatype==right.datatype) {
        String result = switch (left.datatype) {
            case INT, FLOAT -> String.valueOf((Double)left.getValue() + (Double)right.getValue());
            case STRING, CHAR -> (String)left.getValue() + (String)right.getValue();
            default -> throw new ParseCancellationException("Addition Error - Invalid Datatype ("+left.datatype.toString()+","+right.datatype.toString()+")");
        };
        stack.push(Util.Value.newValue(result));
    } else {
        throw new ParseCancellationException("Addition Error - Mismatched Datatypes ("+left.datatype.toString()+","+right.datatype.toString()+")");
    }

    super.exitAddExpr(ctx);
}

因为异常被抛出后,第12行的stack.push()不会执行,所以后面程序会碰到上面提到的空栈异常。


补充说明:

  • 目前我没有在代码里捕获ParseCancellationException,只是用Intellij的调试器开启了异常断点来捕获它
  • 我的程序是单线程的,所以异常肯定不是在UI线程抛出的
  • 我自己的代码里没有阻止异常传播,但不确定Antlr4会不会这么做,这也是我提问的原因
  • 唯一其他的异常是我尝试把字符串解析成double来判断是否为数字时的捕获异常

备注:内容来源于stack exchange,提问作者Willo678

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 10:22:59