如何使用Javac打印语法树

时间:2015-01-07 12:04:40

标签: java compiler-construction javac static-analysis

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

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

请让我知道上述两行之间有什么区别,而在一个YYY中,visitidentifier访问,在另一个案例中,它不被访问。

如何在 object.YYY 中访问 YYY

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

1 个答案:

答案 0 :(得分:1)

在AST中的标识符注释上调用visitIdentifier方法,这是在将标识符用作表达式时创建的。但是,Java中成员选择的语法是<expression>.<identifier>,而不是<expression>.<expression>,这意味着YYY中的object.YYY不是子表达式,因此没有自己的子树。相反,MemberSelectTree的{​​{1}}只是直接包含object.YYY YYY,可通过Name访问。 getIdentifier()中没有visitName方法,因此在此TreeScanner获取YYY的唯一方法是直接从visitMemberSelect进行此操作。

以下是使用object.YYY打印visitMemberSelect的方式:

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());
}