我正在重构一个项目,该项目在编译期间使用javaCC创建专有语言解析器。由于可以同时存在不同的语言变体,因此决定在运行时从jj文件动态生成java源代码,然后将java文件编译成类文件并加载它们。JavaCC:我希望从dymanicly生成的jj文件生成java类并在运行时编译它们
为了更有效地做到这一点,我想生成内存中的java文件到我想的某个流。 JavaCC的API Javadoc不太容易访问:)。
任何人都可以告诉我如何取得最佳进展?
我正在重构一个项目,该项目在编译期间使用javaCC创建专有语言解析器。由于可以同时存在不同的语言变体,因此决定在运行时从jj文件动态生成java源代码,然后将java文件编译成类文件并加载它们。JavaCC:我希望从dymanicly生成的jj文件生成java类并在运行时编译它们
为了更有效地做到这一点,我想生成内存中的java文件到我想的某个流。 JavaCC的API Javadoc不太容易访问:)。
任何人都可以告诉我如何取得最佳进展?
根据kdgregory的建议,您可能更适合修改构建过程。但是,this article描述了如何创建一个新的类加载器,它使用编译器API即时编译Java代码位。将它修改为从文件而不是字符串中读取应该相当容易。
您可以使用编译器API(也称为JSR-199)(请参阅javax.tools
)在内存生成的类中进行编译。您需要扩展javax.tools.SimpleJavaFileObject
类以创建一个代表RAM中Java类的源文本的类。
看看下面的example,它有一个RAMResidentJavaFileObject
的实现,它实际上是这样做的。
JavaCC是开源的,所以它的API非常容易访问。但是,我强烈建议你不要这样做,因为它将成为维护的噩梦。相反,更改构建过程以单独构建和打包语言的各种变体(从维护角度来看,它本身非常有问题) – kdgregory 2009-10-26 12:43:19
该语言部分源自xsd模式文件。最初只有一个。在撰写本文时,已经有五个,预计会增长。这就是为什么我们希望自动化语言解析器生成过程。 – Yaneeve 2009-10-26 13:10:18