如何为ANTLR指定目标包?

问题描述 投票:0回答:4

如果我打电话:

java org.antlr.Tool -o outdir sources/com/example/Java5.g

...使用 antlr-3.1.3,解析器和词法分析器代码将在目录中生成

outdir/sources/com/example
。但是生成的类没有任何
package
语句。我需要他们在包裹中生活
com.example
.

有没有办法指定目标包?

java antlr
4个回答
75
投票

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

@header {
    package org.xmlcml.cml.converters.antlr;
    import java.util.HashMap;
}

你可能在词法分析器中也需要它:

@lexer::header {package org.xmlcml.cml.converters.antlr;}

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

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

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

    }
}

29
投票

一个有完美答案的老问题,但由于对该问题的评论要求命令行选项(这就是我到达这里时实际搜索的内容),我想我只是插嘴说以下...

如果您使用的是 ANTLR 4,您可以在命令行上指定包。我checked并且它似乎不在版本 3 中所以other 答案是 ANTLR 3 的方式。

举个例子:

java -cp antlr-4.4-complete.jar org.antlr.v4.Tool -package my.package MyGram.g4

有关更多信息,请参阅

ANTLR 工具命令行选项
中的-package选项。


0
投票

它可能在最近的版本中发生了变化。
我正在为 Savantly 游戏服务开发 DSL,并且 我将语法文件放在子文件夹中。 生成的类在文件夹结构对应的包中。

我的插件配置是这样的-

<plugin>
    <groupId>org.antlr</groupId>
    <artifactId>antlr4-maven-plugin</artifactId>
    <version>${antlr.version}</version>
    <configuration>
        <sourceDirectory>${basedir}</sourceDirectory>
        <includes>
           <include>**/*.g4</include>
        </includes>
        <visitor>true</visitor>
        <listener>true</listener>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>antlr4</goal>
            </goals>
        </execution>
    </executions>
</plugin>

以及由此产生的文件夹结构-


0
投票

对于使用 Gradle 的 Antlr 插件的人来说,把它扔到你的

build.gradle.kts
,

tasks {
    generateGrammarSource {
        val pkg = "com.stackoverflow.antlr"
        arguments = arguments + listOf("-package", pkg)
        outputDirectory = outputDirectory.resolve(pkg.split(".").joinToString("/"))
    }
}

outputDirectory
部分可能不需要,但无论出于何种原因,Antlr 不会将生成的文件放入包目录布局中,即使您给它一个包。我想知道这是否是一个错误,因为文档 提到了另一个选项,这听起来像是在尝试。不管怎样,这对我有用。

 -Xexact-output-dir  all output goes into -o dir regardless of paths/package

(此外,我在 Windows 上,

/
而不是
\\
似乎工作得很好。)

© www.soinside.com 2019 - 2024. All rights reserved.