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
相关产品推荐
相关产品推荐

