2010-09-10 63 views
2

有誰知道Java預處理器庫嗎?我正在尋找類似m4的東西。我可以從Java調用m4並捕獲結果,但我不想依賴m4被安裝在應用程序運行的系統中。一個類似於m4的獨立Java API會很棒。用於Java的預處理器API

謝謝。

編輯:我想我沒有很清楚地解釋我在做什麼。問題是我正在編寫一個處理以另一種(自定義)語言編寫的源文件的Java應用程序。基本上它是兩種語言之間的翻譯器,源語言支持宏。

回答

0

根據你需要做什麼,一個簡單的「查找/替換」過濾器有時就足夠了。在我的情況下,問題是使用相同的源代碼支持多個版本的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

0

Annotation Processing可能是有用的。

+0

感謝您的指針,但是我的源語言不是Java不幸的。這是一種自定義語言,我爲它編寫了一個基於ANTLR的解析器,但是對宏的支持有點被黑了,我想以一種很好的方式重寫它。 – Gabriel 2010-09-10 09:49:03

0

JavaPlus是一個預處理器,可以使用把ResourceBundle執行替換: