antlr 4在.g4语法文件上运行良好,但gradle generateGrammarSources在同一文件上运行失败,并显示TokenStreamException:意外字符:'-'/”

oyjwcjzk  于 2023-01-02  发布在  其他
关注(0)|答案(2)|浏览(228)

我正在试用适用于gradle的antlr插件,并尝试为我的语法生成一些源文件。使用ANTLR Mega教程作为指导。当我通过终端在我的语法上手动运行antlr4工具时,它成功生成了 . java、. token和 *. interp文件。我尝试通过gradle插件生成这些文件,但收到错误"〉ANTLR Panic:令牌流异常:意外字符:'-'".
我是否希望gradle generateGrammarSources具有直接在语法上运行antlr命令的等效功能?
语法文件基于Antlr的一个例子:https://github.com/antlr/grammars-v4/blob/master/arithmetic/arithmetic.g4

user-MBP:antlr user$ antlr4 
ANTLR Parser Generator  Version 4.7.2

user-MBP:main-project user$ ls  src/main/antlr/
arithmetic.g4

user-MBP:antlr user$ antlr4 arithmetic.g4 
user-MBP:antlr user$ ls
arithmetic.g4               arithmetic.tokens           arithmeticLexer.interp      arithmeticLexer.tokens      arithmeticParser.java
arithmetic.interp           arithmeticBaseListener.java arithmeticLexer.java        arithmeticListener.java

Gradle代码也可执行相同操作:

apply plugin: 'antlr'

...

dependencies {
...
    compile group: 'org.antlr', name: 'antlr4-runtime', version: '4.7.1'
...
}

// as the .g4 grammar file is already present in src/main/antlr, not  // explicitly specifying any package directory

运行gradle命令

user-MBP:main-project user$ gradle generateGrammarSource --stacktrace

Caused by: java.lang.RuntimeException: ANTLR Panic: TokenStreamException: unexpected char: '-'
        at antlr.Utils.error(Utils.java:34)
        at antlr.Tool.fatalError(Tool.java:445)
        at antlr.Tool.doEverything(Tool.java:280)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

我希望上面的gradle命令能够成功运行并在build/目录中生成等效的源文件,但它失败了。

dphi5xsq

dphi5xsq1#

我错过了在Gradle依赖项中生成语法的antlr工具。ANTLR有两个组件:- 用于从语法生成词法分析器和解析器的工具(antlr依赖项)-运行生成的源文件所需的运行时(antlr 4-runtime)
在我的gradle依赖项中添加以下行解决了这个问题。

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

jv2fixgn2#

我也遇到过同样的问题,在我的例子中,我将antlr依赖项作为implementation导入,但是它是错误的。

错误:implementation("org.antlr:antlr4:4.11.1")
正确antlr("org.antlr:antlr4:4.11.1")

antlr-runtime用于生成代码的运行时使用。如果只想生成源代码本身,则不需要它。
下面是我的整个build.gradle.kts以供参考:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "1.7.21"
    antlr
    application
}

group = "com.me.myproject"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
}

dependencies {
    antlr("org.antlr:antlr4:4.11.1")
    testImplementation(kotlin("test"))
}

tasks.test {
    useJUnitPlatform()
}

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "1.8"
}

application {
    mainClass.set("MainKt")
}

相关问题