如何使用 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.YYY
的 MemberSelectTree
直接包含 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());
}
我实现了一个程序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.YYY
的 MemberSelectTree
直接包含 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());
}