JJTree

說明

呼叫 JavaCC 編譯器編譯器的 JJTree 預處理器。它會在 JavaCC 產生的來源中插入解析樹建立動作。JJTree 的輸出會透過 JavaCC 執行,以建立剖析器。

若要使用 jjtree 任務,請將 target 屬性設定為要處理的 JJTree 語法檔名稱。您也需要使用 javacchome 屬性指定包含 JavaCC 安裝的目錄,以便 Ant 能找到 JavaCC 類別。此外,您也可以設定 outputdirectory,將產生的 JavaCC 語法和節點檔寫入特定目錄。否則,jjtree 會將產生的 JavaCC 語法和節點檔寫入包含 JJTree 語法檔的目錄。作為額外選項,您也可以設定 outputfile,將產生的 JavaCC 語法檔寫入特定(目錄和)檔案。否則,jjtree 會將產生的 JavaCC 語法檔寫入 JJTree 語法檔,並加上 .jj 字尾。

此任務只會在語法檔較產生的 JavaCC 檔新時呼叫 JJTree。

參數

屬性 說明 必要
target 要處理的 JJTree 語法檔。
javacchome 包含 JavaCC 發行版的目錄。
outputdirectory 將產生的 JavaCC 語法和節點檔寫入的目錄。如果未設定,則會將檔案寫入包含語法檔的目錄。
outputfile 將產生的 JavaCC 語法檔寫入的檔案。如果未設定,則會將檔案寫入與 JJTree 語法檔同名的檔案,但加上 .jj 字尾。這是相對於 outputdirectory 的檔案名稱(如果已指定),即專案的 basedir。
buildnodefiles 設定 BUILD_NODE_FILES 語法選項。這是一個布林選項。
multi 設定 MULTI 語法選項。這是一個布林選項。
nodedefaultvoid 設定 NODE_DEFAULT_VOID 語法選項。這是一個布林選項。
nodefactory 設定 NODE_FACTORY 語法選項。這是一個布林選項。
nodescopehook 設定 NODE_SCOPE_HOOK 語法選項。這是一個布林選項。
nodeusesparser 設定 NODE_USES_PARSER 語法選項。這是一個布林選項。
static 設定 STATIC 語法選項。這是一個布林選項。
visitor 設定 VISITOR 語法選項。這是一個布林選項。
nodepackage 設定 NODE_PACKAGE 語法選項。這是一個字串選項。
visitorexception 設定 VISITOR_EXCEPTION 語法選項。這是一個字串選項。
nodeprefix 設定 NODE_PREFIX 語法選項。這是一個字串選項。
maxmemory 分配給分岔 JVM 的最大記憶體量。自 Ant 1.8.3 起

範例

在語法檔 src/Parser.jjt 上呼叫 JJTree,將產生的語法檔 Parser.jj 寫入 build/src。在呼叫 JJTree 時,語法選項 NODE_USES_PARSER 設為 true

<jjtree target="src/Parser.jjt"
        outputdirectory="build/src"
        javacchome="c:/program files/JavaCC"
        nodeusesparser="true"/>

命令列 JJTree 與不同 Ant taskdef 版本之間的輸出位置比較

命令列 JJTree 選項產生的檔案(工作目錄:/tmp Ant 1.5.3 與命令列比較 Ant 1.6 與命令列比較
jjtree  grammar.jjt
    /tmp/grammar.jj
    /tmp/<generated>.java
相同 相同
jjtree  relative/grammar.jjt
    /tmp/grammar.jj
    /tmp/<generated>.java
/tmp/relative/grammar.jj
/tmp/relative/<generated>.java
相同
jjtree /tmp/absolute/grammar.jjt
    /tmp/grammar.jj
    /tmp/<generated>.java
/tmp/absolute/grammar.jj
/tmp/absolute/<generated>.java
相同
jjtree -OUTPUT_DIRECTORY:relative grammar.jjt
    /tmp/relative/grammar.jj
    /tmp/relative/<generated>.java
相同 相同
jjtree -OUTPUT_DIRECTORY:relative relative/grammar.jjt
    /tmp/relative/grammar.jj
    /tmp/relative/<generated>.java
相同 相同
jjtree -OUTPUT_DIRECTORY:relative /tmp/absolute/grammar.jjt
    /tmp/relative/grammar.jj
    /tmp/relative/<generated>.java
相同 相同
jjtree -OUTPUT_DIRECTORY:/tmp/absolute/ grammar.jjt
    /tmp/absolute/grammar.jj
    /tmp/absolute/<generated>.java
相同 相同
jjtree -OUTPUT_DIRECTORY:/tmp/absolute/ relative/grammar.jjt
    /tmp/absolute/grammar.jj
    /tmp/absolute/<generated>.java
相同 相同
jjtree -OUTPUT_DIRECTORY:/tmp/absolute/ /tmp/absolute/grammar.jjt
    /tmp/absolute/grammar.jj
    /tmp/absolute/<generated>.java
相同 相同
jjtree -OUTPUT_FILE:output.jj grammar.jjt
    /tmp/output.jj
    /tmp/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:output.jj relative/grammar.jjt
    /tmp/output.jj
    /tmp/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:output.jj /tmp/absolute/grammar.jjt
    /tmp/output.jj
    /tmp/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:output.jj -OUTPUT_DIRECTORY:relative grammar.jjt
    /tmp/relative/output.jj
    /tmp/relative/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:output.jj -OUTPUT_DIRECTORY:relative relative/grammar.jjt
    /tmp/relative/output.jj
    /tmp/relative/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:output.jj -OUTPUT_DIRECTORY:relative /tmp/absolute/grammar.jjt
    /tmp/relative/output.jj
    /tmp/relative/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:output.jj -OUTPUT_DIRECTORY:/tmp/absolute/ grammar.jjt
    /tmp/absolute/output.jj
    /tmp/absolute/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:output.jj -OUTPUT_DIRECTORY:/tmp/absolute/ relative/grammar.jjt
    /tmp/absolute/output.jj
    /tmp/absolute/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:output.jj -OUTPUT_DIRECTORY:/tmp/absolute/ /tmp/absolute/grammar.jjt
    /tmp/absolute/output.jj
    /tmp/absolute/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:subdir/output.jj grammar.jjt
    /tmp/subdir/output.jj
    /tmp/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:subdir/output.jj relative/grammar.jjt
    /tmp/subdir/output.jj
    /tmp/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:subdir/output.jj /tmp/absolute/grammar.jjt
    /tmp/subdir/output.jj
    /tmp/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:subdir/output.jj -OUTPUT_DIRECTORY:relative grammar.jjt
    /tmp/relative/subdir/output.jj
    /tmp/relative/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:subdir/output.jj -OUTPUT_DIRECTORY:relative relative/grammar.jjt
    /tmp/relative/subdir/output.jj
    /tmp/relative/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:subdir/output.jj -OUTPUT_DIRECTORY:relative /tmp/absolute/grammar.jjt
    /tmp/relative/subdir/output.jj
    /tmp/relative/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:subdir/output.jj -OUTPUT_DIRECTORY:/tmp/absolute/ grammar.jjt
    /tmp/absolute/subdir/output.jj
    /tmp/absolute/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:subdir/output.jj -OUTPUT_DIRECTORY:/tmp/absolute/ relative/grammar.jjt
    /tmp/absolute/subdir/output.jj
    /tmp/absolute/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:subdir/output.jj -OUTPUT_DIRECTORY:/tmp/absolute/ /tmp/absolute/grammar.jjt
    /tmp/absolute/subdir/output.jj
    /tmp/absolute/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:/tmp/subdir/output.jj grammar.jjt
    /tmp/subdir/output.jj
    /tmp/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:/tmp/subdir/output.jj relative/grammar.jjt
    /tmp/subdir/output.jj
    /tmp/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:/tmp/subdir/output.jj /tmp/absolute/grammar.jjt
    /tmp/subdir/output.jj
    /tmp/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:D:/tmp/subdir/output.jj grammar.jjt
    /tmp/subdir/output.jj
    /tmp/<generated>.java
不支援 不支援*
jjtree -OUTPUT_FILE:D:/tmp/subdir/output.jj relative/grammar.jjt
    /tmp/subdir/output.jj
    /tmp/<generated>.java
不支援 不支援*
jjtree -OUTPUT_FILE:D:/tmp/subdir/output.jj /tmp/absolute/grammar.jjt
    /tmp/subdir/output.jj
    /tmp/<generated>.java
不支援 不支援*
jjtree -OUTPUT_FILE:/tmp/subdir/output.jj -OUTPUT_DIRECTORY:relative grammar.jjt
    /tmp/relative/tmp/subdir/output.jj
    /tmp/relative/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:/tmp/subdir/output.jj -OUTPUT_DIRECTORY:relative relative/grammar.jjt
    /tmp/relative/tmp/subdir/output.jj
    /tmp/relative/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:/tmp/subdir/output.jj -OUTPUT_DIRECTORY:relative /tmp/absolute/grammar.jjt
    /tmp/relative/tmp/subdir/output.jj
    /tmp/relative/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:/tmp/subdir/output.jj -OUTPUT_DIRECTORY:/tmp/absolute/ grammar.jjt
    /tmp/absolute/tmp/subdir/output.jj
    /tmp/absolute/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:/tmp/subdir/output.jj -OUTPUT_DIRECTORY:/tmp/absolute/ relative/grammar.jjt
    /tmp/absolute/tmp/subdir/output.jj
    /tmp/absolute/<generated>.java
不支援 相同
jjtree -OUTPUT_FILE:/tmp/subdir/output.jj -OUTPUT_DIRECTORY:/tmp/absolute/ /tmp/absolute/grammar.jjt
    /tmp/absolute/tmp/subdir/output.jj
    /tmp/absolute/<generated>.java
不支援 相同

注意:在使用 Ant taskdef jjtree 執行 JJTree 時,選項 -OUTPUT_DIRECTORY 必須永遠設定,因為專案的 basedir 和 Ant 工作目錄可能不同。因此,即使您未為 taskdef jjtree 指定 outputdirectory,JJTree 也會以 -OUTPUT_DIRECTORY 設為專案的 basedir 來呼叫。但是,當設定 -OUTPUT_DIRECTORY 時,-OUTPUT_FILE 設定會處理為相對於此 -OUTPUT_DIRECTORY。因此,當 -OUTPUT_FILE 為絕對路徑或包含磁碟機代號時,我們會遇到問題。因此,絕對 outputfile(當未指定 outputdirectory 時)會相對於預設目錄。因此,包含磁碟機代號的 outputfile 無法支援。

順便一提:當設定 -OUTPUT_DIRECTORY 時,在 -OUTPUT_FILE 中指定磁碟機代號,在從命令列執行 JJTree 時也會導致奇怪的行為。