如何使用 Javac 打印语法树

How print syntax tree using Javac

我实现了一个程序TreeScanner,用于打印 AST 中所有节点的信息。该程序支持所有类型(已实现所有访问方法)。但是,问题是对于语句,System.out.println(object.YYY);程序没有访问字段引用YYY

检测到对象作为标识符,但检测不到YYY作为标识符。但是,当我有 System.out.println(YYY);那么visitIdentifier会访问YYY.

请告诉我以上两行之间的区别,其中一个 YYY 被 visitidentifier 访问,而在另一个情况下它没有被访问。

如何在 object.YYY 中访问 YYY

在 class org.eclipse.jdt.core.dom 中我们有 FieldAccess ,在上述两种情况下都会为 YYY 调用,但 Javac 中的 TreeScanner 似乎没有类似的方法。

visitIdentifier 方法在 AST 中的标识符注释上被调用,这些注释是在标识符用作表达式时创建的。但是 Java 中成员选择的语法是 <expression>.<identifier>,而不是 <expression>.<expression>,这意味着 object.YYY 中的 YYY 不是子表达式,因此不是得到自己的子树。 object.YYYMemberSelectTree 直接包含 YYY 作为 Name,可通过 getIdentifier() 访问。 TreeScanner 中没有 visitName 方法,因此这里到达 YYY 的唯一方法是直接从 visitMemberSelect 进行。

这是使用 visitMemberSelect 打印 object.YYY 的方法:

Void visitMemberSelect(MemberSelectTree memberSelect, Void p) {
    // Print the object
    memberSelect.getExpression().accept(this, p);
    System.out.print(".");
    // Print the name of the member
    System.out.print(memberSelect.getIdentifier());
}