java - 如何使用 Javac 打印语法树

标签 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似乎没有类似的方法。

最佳答案

visitIdentifier方法在 AST 中的标识符注释上调用,这些注释是在标识符用作表达式时创建的。然而,Java 中成员选择的语法是 <expression>.<identifier> , 不是 <expression>.<expression> , 意思是 YYYobject.YYY不是子表达式,因此没有自己的子树。相反 MemberSelectTree对于 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());
}

关于java - 如何使用 Javac 打印语法树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27819139/

相关文章:

java - 包含包含 .jar 的 libs 文件夹以供编译

compiler-construction - 自定义分配和 Boehm GC

java - Eclipse/javac 不同意编译签名与默认方法冲突;谁是对的?

java - 如何将具有两组元素的列表排序为两个按字母顺序排列的集合列表

java - 如何将AbstractButton的标签放在Icon的底部?

java - 将 xml 代码解码为 Java 对象的最佳方法?

java - 通知依赖项解析监听器失败

ios - 结构填充编译标志

c++ - 如果函数内联过于激进会怎样?

发现第一个错误后停止编译的 javac 命令行选项