【问题标题】:Generating java code parse trees and evaluating it for testing生成 java 代码解析树并对其进行评估以进行测试
【发布时间】:2010-11-28 18:05:06
【问题描述】:

我们需要生成 Java 源代码。我们通过对抽象语法树进行建模并使用生成实际源代码文本的 tree walker 来做到这一点。到目前为止一切都很好。

由于我的 AST 代码有点旧,它不支持注解和泛型。因此,我正在四处寻找开放项目,以用于未来有代码生成需求的项目。这就是真正的问题所在。我们要测试生成的代码是否具有正确的行为。

这是我产生实际评估 AST 而不是生成 java 源代码、编译它并针对该代码运行测试的想法的地方。评估者可以加快单元测试的速度,并且可以评估生成的代码的较小部分,例如只评估一个方法,从而使“单元”更合理。

到目前为止,我发现 com.sun.codemodel 项目看起来相当不错,因为它是一个现代(支持 java5 和 6 特性)基于 AST 的代码生成解决方案。

有人知道是否有另一个项目可以让我直接评估 AST 的各个部分(例如单个生成的方法)?

【问题讨论】:

  • +1 个有趣的问题,我们现在想要答案 :-)
  • 我只是为该方法生成代码,编译和测试。创建解释器是一项相当多的工作。
  • 没有选项可以让 javac 发出解析树和中间表示之类的东西吗? (类型解析,类查找,无论 Ira Baxter 在他们的回答中说什么)。
  • javac -Xprint 只显示.class 文件的API。

标签: java unit-testing code-generation metaprogramming


【解决方案1】:

要评估 Java,您需要随之而来的所有语义分析(“这个标识符的范围是什么?它有什么类型?”)以及一个解释器。

要进行语义分析,您需要的不仅仅是 AST:您需要全名解析(符号表构建)和类型解析(确定表达式类型并验证表达式在找到它们的上下文中是否有效) , 以及类查找(foo 指的是哪个实际方法?)

这样,您可以考虑通过按执行顺序爬过树来构建解释器。您还需要构建一个存储管理器;你可能不需要做一个完整的垃圾收集器,但你需要一些东西。您还需要一名口译员 对于 .class 文件,如果您真的想运行某些东西,这意味着您需要一个解析器 (以及类文件的名称/类型解析)。

我不知道 Eclipse 是否具备所有这些功能(至少您可以免费获得存储管理器部分 :)。我有点期待它,因为它最初的设计是支持 Java 开发,但多年来我对很多工具感到非常失望。

DMS Software Reengineering Toolkit 也是一个可以处理多种语言的程序分析/转换。它有一个完整的Java front end,包括解析、AST 构建、符号表构建和名称解析、类型解析、构建调用图(需要解析虚函数调用),并有一个 .class 文件阅读器来引导名称解析。所以这将是构建解释器的良好基础。

DMS 也可以构造任意 AST,然后从中生成源代码,所以它也可以处理代码生成端。

[DMS 存在的原因是“非常失望”的部分]。

【讨论】:

    【解决方案2】:

    我不确定这是否是您正在寻找的,但 Eclipse 的 JDT 项目提供了关于 Java AST(包括 Java 5 和 6 特性)的非常好的视图。它有一系列用于代码查看/重写(不一定是生成)的实用程序和工具。它们都在 Eclipse Public License 下获得许可。

    您可以通过http://eclipse.org/jdt/获取更多信息

    【讨论】:

    • 是的,那个和 Sun 的代码模型似乎是通过构建 AST 生成代码的最佳选择。但我还想要的是解释 AST 的能力(语义遵循编译的 Java)。
    • JDT Core(eclipse.org/jdt/core/index.php)宣传以下内容:“剪贴簿页面或调试器上下文中的评估支持。”我想我会看看它......
    猜你喜欢
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 2014-07-26
    • 1970-01-01
    相关资源
    最近更新 更多