У меня есть парсер для устаревшего языка программирования. AST отсутствует в анализаторе, и мне нужно автоматически создать AST при добавлении атрибутов к узлу. Например, давайте рассмотрим приведенный ниже узел вместе с некоторыми пользовательскими узлами, расширяющими узел:
class Node {
List<Node> parent;
List<Node> child;
//getters and setters
}
final class MethodNode extends Node {
Object o1;
IfExpression o2;
//getters and setters
}
final class IfExpression extends Node {
Object o1;
//getters and setters
}
Допустим, я устанавливаю IfExpression в MethodNode, тогда это означает, что MethodNode является родителем IfExpression в AST. Поэтому мне нужно добавить логику вставки в установщики MethodNode (Parent), как показано ниже
public void setO2(@NonNull final IfExpression o2){
this.o2 = o2;
super.child.add(o2);
o2.parent.add(this);
}
После завершения анализа у меня есть логика для автоматического создания AST с помощью отражения. Логика отражения:
- Итерировать все поля в узле / пользовательских узлах
- Проверить, не является ли поле пустым
- Если да,Проверьте, имеет ли поле тип Узел
- Если да, Вставьте в родительский и дочерний список
- Я также добавил несколько пользовательских аннотаций на случай, если нам нужно игнорировать определенные поля. Так что есть эта проверка вместе со 2-м и 3-м условиями, упомянутыми выше.
Я хотел бы знать, если есть какой-либо лучший подход, чем эта пользовательская логика отражения