我有一套ANTLR规则 用来制造有上游测试的AST。它看起来像这个:
checked_rule
: kwd=keyword name=name nl { noBadChars($name.start.getText()) }?
-> ^(...)
;
如果 $name
有一些坏字, 那么我想有一个错误。 我做到现在这样:
catch [FailedPredicateException fpe] {
BadNameException error = new BadNameException(input, $kwd.text, $name.start.getText());
reportError(error);
recover(input, error);
retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), error);
}
最后一点是从 ANTRR 生成的代码中复制出来的, 所以也许这不是正确的方法。
不管怎么说,我想做的就是通过更正名字和再次尝试规则来从错误中恢复过来。在假代码中,我想说:
catch [FailedPredicateException fpe] {
...
reportError(...)
input.LT(-2) = removedBadChars($name.start.getText());
return checked_rule();
}
所以这个错误仍然会到达用户, 但是我们只要尽可能少的干扰, 就可以继续分析。 我该怎么做呢?