Я использую внешнюю библиотеку, которая создает внутреннее представление абстрактного синтаксического дерева (AST) для игрушечного языка программирования на основе представления AST в виде XML-файла.
Используемый мною метод fromXML возвращает AST, но согласно документации библиотеки, AST является абстрактным классом. Он имеет множество конкретных подклассов, таких как AST.program, AST.expr и AST.stmt_list. Моя цель — сгенерировать код, подобный ассемблеру, для программы с учетом ее AST, но для этого мне приходится работать с экземпляром конкретного класса, поскольку AST не имеет полей.
Единственный способ, которым я мог придумать решение этой проблемы, — это проверить (с помощью оператора экземпляра), является ли AST, возвращаемый fromXML, AST.program и привести его в AST.программа. До сих пор это работало, поскольку fromXML возвращал только AST.program. Мой вопрос: есть ли лучшее решение этой проблемы? Может ли быть способ воздержаться от приведения AST, но получить доступ к полям AST.program?
Мой код:
import AST; // The AST library
import java.io.File;
public class CalcBack {
public static void main(String[] args) {
File f_xml = new File(args[0]);
AST.program prog = null;
try {
AST ast_from_xml = AST.fromXML(f_xml); // May throw Exception
if (ast_from_xml instanceof AST.program) {
prog = (AST.program) ast_from_xml; // Casting AST to AST.program
} else {
System.err.println("Not a program!");
}
} catch (Exception e) {
System.err.println(e);
}
if (prog == null) {
System.exit(1);
}
System.out.println(prog.statements); // I can do something with prog
}
}
Выход:
% java -cp AST.jar CalcBack.java gcd.xml
AST$stmt_list@5c909414