Gradle找不到Antlr令牌文件

Dim*_*ims 7 intellij-idea antlr4

我在MyLexer.g4里面创建了一个文件myproject/src/main/antlr/com/mypackage:

lexer grammar MyLexer;

DIGIT : '0' .. '9' ;
Run Code Online (Sandbox Code Playgroud)

...

WS  : [ \t\r\n]+ -> skip ;
Run Code Online (Sandbox Code Playgroud)

然后尝试MyParser.g4在同一目录中编写解析器:

grammar MyParser;

options
   { tokenVocab = MyLexer; }

SHORT_YEAR: DIGIT DIGIT;
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我运行gradle任务时generateGrammarSource,会发生以下错误:

error(160): com\mypackage\MyParser.g4:4:18: cannot find tokens file MYPROJECT\build\generated-src\antlr\main\MyLexer.tokens
Run Code Online (Sandbox Code Playgroud)

即在错误的地方寻找文件.

实际文件在里面创建 MYPROJECT\build\generated-src\antlr\main\com\mypackage\MyLexer.tokens

Sea*_*ean 6

正如 Steven Spungin 所说,您需要将 ANTLR 源文件放在目录中,src/main/antlr/而不是放在该目录的子目录中。

您不需要添加 @header加到您的 ANTLR 源文件中。请改用以下内容。

在你的build.gradle你应该有(为你的 ANTLR 版本修改):

apply plugin: 'antlr'

dependencies {
    antlr "org.antlr:antlr4:4.7.1"
}

generateGrammarSource {
    arguments += ['-package', 'com.mypackage']
    outputDirectory = new File(buildDir.toString() + "/generated-src/antlr/main/com/mypackage/")
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*gin 5

使用以下命令在包中生成解析器时:

@header {package org.acme.my.package;}

并在解析器中声明tokenVocab

options {tokenVocab = MyLanguage;}

MyLanguageLexer.g4 和 MyLanguageParser.g4 文件不得位于包目录中。由于某种错误。

所以这意味着/src/main/antlr/MyLanguageParser.g4和不/src/main/antlr/com/acme/my/package/MyLanguageParser.g4

java 文件最终位于 build/ generated-src/antlr 中的错误目录中,但以某种方式使其到达 build/classes/java/main 中的正确目录。.tokens 文件最终出现在antlr 期望的位置。


请记住,这会让您的 IDE 感到困惑;我必须将已编译的类添加回我的compileClasspath 以避免视觉类未找到的问题。

dependencies {
    testCompile fileTree('build/classes/java/main')
}
Run Code Online (Sandbox Code Playgroud)