【问题标题】:Parsing java code into Abstract Syntax Tree将java代码解析为抽象语法树
【发布时间】:2016-09-10 15:02:47
【问题描述】:

我将 eclipse (org.eclipse.jdt) 用于 AST。

我认为(?)我在网上得到了一些有用的代码来获取字段的声明和它们的用法。但是我一直纠结于如何获取根节点。

ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(buffer.toString().toCharArray());
parser.setResolveBindings(true);

CompilationUnit cu = (CompilationUnit) parser.createAST(null);
ASTNode root = cu.getRoot();
System.out.println(root.toString());

如果我执行以下操作,那么它会打印出我输入的整个 java 代码,而不是根 AST 节点。

我不知道我是否误解了 AST,但我把它想象成二叉搜索树,除了一个节点可以有多个子节点。 (picture)

对此有何澄清或帮助?

【问题讨论】:

  • 为什么要打印根节点?你期待什么输出?鉴于toString() 的 Javadoc 表示“返回此节点的字符串表示,仅适用于调试目的。”这种行为可能会令人惊讶。另一方面,我想不出更自然的行为。

标签: java eclipse parsing abstract-syntax-tree


【解决方案1】:

toString 方法只是将 AST 转换回 Java。

如果您想查看完整的 AST 结构,您需要使用 ASTVisitor 类并调用 accept 方法:

root.accept(visitor);

其中visitor 是扩展ASTVisitor 的类的实例。 ASTVisitor 有许多 preVisitvisitpostVisit 方法,您可以覆盖这些方法以查看不同的 AST 节点。

【讨论】:

  • 我设法创建了一个 ASTVisitor,其中包含一些方法(例如 VariableDeclarationFragment、SimpleNode 等)。但我的意思是如何把它们变成一棵树? AST 是否具有该功能,还是我必须创建自己的方法来为其创建树?
  • AST 是一棵树。如果您的意思是要以树形结构打印出来,则必须使用各种访问者调用自己编写代码。
  • 好的,谢谢。这个答案实际上是我一直在寻找的。我被 AST 这个名字骗了,所以我以为它有把 java 代码变成解析树的功能。我希望将 java 代码转换成这样的:LINK
猜你喜欢
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多