【问题标题】:In Eclipse JDT Java parser, is it possible to traverse the AST node by node without the using of visitors?在 Eclipse JDT Java 解析器中,是否可以在不使用访问者的情况下逐节点遍历 AST?
【发布时间】:2018-07-03 21:47:15
【问题描述】:

通过 Eclipse JDT API 访问节点信息的标准方法是使用访问者模式。例如:

unit.accept(new MyVisitorAdapter<Object>() {
  @Override public void visit(MethodCallExpr node, Object arg) {
    System.out.println("found method call: " + node.toString());
  }
}, null);

在这种情况下,要访问一个节点,我需要指定我感兴趣的节点类型(MethodCallExpr 在这种情况下)。但是,要继续以通用方式访问节点信息,我应该覆盖所有 visit() 方法,可能会枚举 Eclipse JDT API 中可用的每种节点。在here 中找到了一个完整的示例。

在这种情况下,虽然不完全属于代码覆盖范围,但我希望能够控制由 Eclipse JDT Java 解析器完成的遍历。我想遍历 AST 节点,可能会经过所有节点,选择我想要的,但不限制类型,如上面的代码所示。可能吗?是否有通过 Eclipse JDT API 执行此操作的标准方法?

【问题讨论】:

  • 为什么没有访客?
  • 其实用visitor模式是没有问题的,如果API有我想要的visitor,但好像不是这样...所以我想通过节点提取一些信息,而不依赖于节点类型。
  • 您应该描述您的实际问题(“API 中没有合适的访问者”)并发布您迄今为止尝试过的代码。访问者是遍历 AST 的常用方式。
  • 我的问题与我发布的this another question 有关。但是您应该记住,访问者只是探索 AST 中信息的选项之一(默认)。我只是想知道是否有人通过 Eclipse API 尝试了另一种标准解决方案,或者在我尝试重新发明轮子之前有一个很好的技巧来手动完成。
  • 这是一个不起眼的建议。停止理论并发布一些代码。例如,您编译的 Java 代码、您如何使用 Eclipse JDT API 以及您实际想要提取哪些信息。

标签: java parsing abstract-syntax-tree eclipse-jdt tree-traversal


【解决方案1】:

如果您不关心节点类型,请覆盖 ASTVisitor.preVisit(ASTNode)ASTVisitor.preVisit2(ASTNode)ASTVisitor.postVisit(ASTNode) 中的任何一个。

【讨论】:

  • 运行一些测试后,我可以通过 ASTVisitor.preVisit( ASTNode ) 得到我需要的东西。虽然它仍然使用访问者模型,但它确实通过所有节点并允许按照源代码文件中的行顺序访问信息。非常感谢斯蒂芬!
猜你喜欢
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
相关资源
最近更新 更多