JJTree

描述

调用 JJTree 预处理器用于 JavaCC 编译器编译器。它在生成的 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 的文件名(如果指定),否则是项目的基目录。
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 时出现奇怪的行为。