javac.exe AST编程访问示例

10

在编程中,能否通过编写程序来访问javac.exe中的抽象语法树(AST)?能否提供一个例子?

2个回答

14

是的,这是可能的,但仅适用于Java 6及以上版本。Peter von der Ahé这次采访中谈到了两个JSR(Java规范请求)。

JSR 199编译器API包含三个部分:第一个基本上允许您通过API调用编译器。其次,该API允许您自定义编译器如何查找和写出文件。我的意思是文件在抽象意义上,因为编译器处理的文件不一定在文件系统上。 JSR 199的文件抽象允许您在数据库中拥有文件,并直接生成输出到内存中。最后,JSR 199 API允许您以结构化方式收集编译器的诊断信息,以便您可以轻松地将错误消息转换为IDE编辑器中的行,例如。

JSR 269是注释处理API。

这篇文章提供了关于访问编译器树API的优秀概述。"访问抽象语法树:编译器树API"一节似乎特别适合你的问题。

根据你的需求,你也可以查看Jackpot Rule Language,它是一个独立的重构引擎,插件到编译器树中。


6

使用-cp tools.jar编译并运行此代码(需要明确指定您的tools.jar位置)。

import com.sun.source.util.Trees;
import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

public class JCTreeTest {
    private static final JavaCompiler javac
            = ToolProvider.getSystemJavaCompiler();

    public static void main(String[] args) {
        final StandardJavaFileManager jfm
                = javac.getStandardFileManager(null, null, null);
        final JavaCompiler.CompilationTask task
                = javac.getTask(null, jfm, null, null, null,
                  jfm.getJavaFileObjects(args));
        final Trees trees = Trees.instance(task);
        // Do stuff with "trees"
    }
}

尽管我自己没有玩过树的东西,但它对我编译并运行了,所以你需要自己阅读javadoc。 :-) 祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接