Gradle无法找到Antlr令牌文件

时间:2016-12-06 12:44:45

标签: intellij-idea antlr4

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

lexer grammar MyLexer;

DIGIT : '0' .. '9' ;

...

WS  : [ \t\r\n]+ -> skip ;

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

grammar MyParser;

options
   { tokenVocab = MyLexer; }

SHORT_YEAR: DIGIT DIGIT;

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

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

即。在不正确的地方寻找文件。

MYPROJECT\build\generated-src\antlr\main\com\mypackage\MyLexer.tokens

中创建实际文件

2 个答案:

答案 0 :(得分:3)

使用以下方法在包中生成解析器时

@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')
}

答案 1 :(得分:1)

正如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/")
}