用于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 - 但您可以使用任何类型的文本查找/替换工具。
这种方法的优点是:它仍然是正常的源代码,您可以编辑和编译而无需运行预编译器。你只需要一个工具来“切换”代码。
Annotation Processing可能是有用的。
感谢您的指针,但是我的源语言不是Java不幸的。这是一种自定义语言,我为它编写了一个基于ANTLR的解析器,但是对宏的支持有点被黑了,我想以一种很好的方式重写它。 – Gabriel 2010-09-10 09:49:03
难道不creatng一个战略,至少有2个实现更有意义,更正确? – 2010-09-10 09:17:13
我不确定我是否理解......您对“策略”有何意义?你想要另一个实现SwitchSource.java吗?我为什么要写另一个? – 2010-09-10 09:36:54
我看到您的解决方案,但我的情况不仅仅是启用/禁用代码序列。我必须使用参数等宏来替换宏。 – Gabriel 2010-09-10 09:52:10