如何为ANTLR指定目标包?

tan*_*ens 46 java antlr

如果我打电话:

java org.antlr.Tool -o outdir sources/com/example/Java5.g
Run Code Online (Sandbox Code Playgroud)

...使用antlr-3.1.3将在目录中生成解析器和词法分析器代码outdir/sources/com/example.但是生成的类没有任何package语句.我需要他们在包装中生活com.example.

有没有办法指定目标包?

pet*_*ust 65

ANTLR提供了一个标题工具,允许您包含包和导入.您将此包含在*.g语法文件中:

@header {
    package org.xmlcml.cml.converters.antlr;
    import java.util.HashMap;
}
Run Code Online (Sandbox Code Playgroud)

而且你可能也需要它在Lexer中:

@lexer::header {package org.xmlcml.cml.converters.antlr;}
Run Code Online (Sandbox Code Playgroud)

如果您需要添加一些成员和代码:

@members {
    HashMap<String, Object> objectMap = new HashMap<String, Object>();
    //...

    private void addArrayValue(String content) {
    //... code required by snippets in the grammar

    }
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您对会员和代码进行了一些讨论,即使他没有要求它.+1 (2认同)

kmp*_*kmp 26

一个老问题有一个非常好的答案,但由于对问题的评论要求命令行选项(这就是我到达这里时我实际上正在搜索的内容),我想我只是插话并说出以下内容...

如果你使用的是ANTLR 4,你可以在命令行中指定包.我检查过,它似乎不在版本3中,所以另一个答案是ANTLR 3的方法.

这是一个例子:

java -cp antlr-4.4-complete.jar org.antlr.v4.Tool -package my.package MyGram.g4
Run Code Online (Sandbox Code Playgroud)

-package在选择ANTLR工具命令行选项的详细信息.

  • 任何想法为什么这不暴露在gradle插件中? (3认同)
  • 在gradle中,你可以将参数附加到`generateGrammarSource`任务的`arguments`属性:`generateGrammarSource {arguments + = [" - package","my.package"]}` (3认同)