述語テストでASTを作成するためのANTLRルールがあります。次のようになります。
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);
}
その最後のビットはANTLRで生成されたコードからコピーされたものなので、おそらくそれを行う正しい方法ではありません。
とにかく、私がやりたいのは、名前を修正してルールを再試行することでエラーから回復することです。擬似コードで、私は言いたいです:
catch [FailedPredicateException fpe] {
...
reportError(...)
input.LT(-2) = removedBadChars($name.start.getText());
return checked_rule();
}
そのため、エラーは引き続きユーザーに届きますが、可能な限り中断することなく解析を続行します。これどうやってするの?