ERR_CHAR : . ;
为了使其正常工作,您需要执行两个操作:
首先,禁用默认的错误报告机制。
parser.removeErrorListeners();
parser.setErrorStrategy(new BailErrorStrategy());
如果您的字符串不匹配,您将会收到一个ParseCancellationException
,并且没有其他报告。
如果您不使用解析操作的输出,您可能还希望通过禁用解析树构建来提高识别过程的效率。
parser.setBuildParseTree(false);
BailErrorStrategy
并不完全认同,因为它完全缺乏任何有用的信息。令我惊讶的是,ANTLR在其异常中不包括消息 - 我错过了什么吗? - Brad MaceBailErrorStrategy
将会做到你所需的一切,并且还能高效地完成它。 - Sam HarwellParser p = new MyParser(myTokenStream);
p.rootRule();
if (p.getNumberOfSyntaxErrors() > 0) {
throw new RuntimeException("Syntax error!");
}
recover
方法重新抛出异常之外,还有其他无法通过这种方式检测到的错误吗? - Brad Mace