Я предполагаю, что вы ищете самый маленький узел AST, который охватывает местоположение источника проблемы.Поскольку вы специально рассматриваете проблемы, вы можете обнаружить, что при наличии определенных синтаксических ошибок созданный AST является чрезвычайно дурацким.
Тем не менее, я немного удивлен, что не существует заранее запеченного решения.Вам нужно будет создать свой собственный ASTVisitor.Это будет выглядеть примерно так:
class MyFinder extends ASTVisitor {
public void postVisit(ASTNode node) {
if (spansProblemLocation(node)) {
throw new VisitComplete(node);
}
}
}
class VisitComplete extends Throwable {
ASTNode result;
...
}
Поскольку мы переопределяем метод postVisit, мы гарантированно получим наименьший ASTNode в результате.Чтобы использовать этого посетителя, поместите вызов на accept
в блок try-catch, который обрабатывает VisitComplete
.