用于Java的预处理器API

问题描述:

有谁知道Java预处理器库吗?我正在寻找类似m4的东西。我可以从Java调用m4并捕获结果,但我不想依赖m4被安装在应用程序运行的系统中。一个类似于m4的独立Java API会很棒。用于Java的预处理器API

谢谢。

编辑:我想我没有很清楚地解释我在做什么。问题是我正在编写一个处理以另一种(自定义)语言编写的源文件的Java应用程序。基本上它是两种语言之间的翻译器,源语言支持宏。

根据你需要做什么,一个简单的“查找/替换”过滤器有时就足够了。在我的情况下,问题是使用相同的源代码支持多个版本的Java(1.4,5,6)。在源代码中,我用言论来启用/禁用块,如:

import java.sql.Clob; 
//## Java 1.6 begin ## 
import java.sql.NClob; 
//## Java 1.6 end ## 

要禁用Java 6块,更换:

  • “// ##的Java 1.6开始##”用“/ ## ## Java 1.6 begin ##”
  • “// ## Java 1.6 end ##”用“// ## Java 1.6 end ## * /”。

因此它成为块注释。

我写了一个Java工具来做到这一点。它只是一个类,没有依赖关系:http://code.google.com/p/h2database/source/browse/trunk/h2/src/tools/org/h2/build/code/SwitchSource.java - 但您可以使用任何类型的文本查找/替换工具。

这种方法的优点是:它仍然是正常的源代码,您可以编辑和编译而无需运行预编译器。你只需要一个工具来“切换”代码。

+0

难道不creatng一个战略,至少有2个实现更有意义,更正确? – 2010-09-10 09:17:13

+0

我不确定我是否理解......您对“策略”有何意义?你想要另一个实现SwitchSource.java吗?我为什么要写另一个? – 2010-09-10 09:36:54

+0

我看到您的解决方案,但我的情况不仅仅是启用/禁用代码序列。我必须使用参数等宏来替换宏。 – Gabriel 2010-09-10 09:52:10

Annotation Processing可能是有用的。

+0

感谢您的指针,但是我的源语言不是Java不幸的。这是一种自定义语言,我为它编写了一个基于ANTLR的解析器,但是对宏的支持有点被黑了,我想以一种很好的方式重写它。 – Gabriel 2010-09-10 09:49:03

Velocity也许?

JavaPlus是一个预处理器,可以使用把ResourceBundle执行替换:

的Java注释预处理器,它可以被称为一个库 https://github.com/raydac/java-comment-preprocessor