【问题标题】:Gradle can't find Antlr token fileGradle 找不到 Antlr 令牌文件
【发布时间】:2016-12-06 12:44:44
【问题描述】:

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

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内部创建

【问题讨论】:

  • 你找到解决这个问题的方法了吗?

标签: intellij-idea antlr4


【解决方案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/")
}

【讨论】:

    【解决方案2】:

    在包中生成解析器时使用:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多