【问题标题】:How to build an ANTLR grammar with Gradle in a multi-platform project?如何在多平台项目中使用 Gradle 构建 ANTLR 语法?
【发布时间】:2020-01-29 20:16:03
【问题描述】:

所以我整个下午都在努力让一些 Gradle 构建为涉及 ANTLR 语法的 Kotlin 多平台项目工作。我想要做的是让 ANTLR 从 Kotlin(或 Java,如果这不起作用)和 JavaScript 目标的共享语法生成一个解析器。基于此,我想围绕解析器编写一些库,可以在 JVM 和 JavaScript 中使用。

所以我建立了一个 Kotlin 多平台项目,因为这似乎是用一块石头杀死两只鸟的好方法(这里是一个 repo https://github.com/derkork/project.txt)。我创建了一个源集commonAntlr,将语法文件放在commonAntlr/antlr/project_txt.g4 下。根据 ANTLR 插件的文档,这就是应该如何设置的东西。我还在顶部应用了antlr 插件(这里是build.gradle.kts - https://github.com/derkork/project.txt/blob/master/build.gradle.kts)。

现在我运行gradle build,希望 ANTLR 插件至少会尝试使用默认设置从语法为我生成一些不错的 Java 代码。唉,事实并非如此。 ANTLR 插件甚至没有启动,这是我从输出中可以看出的。稍后构建失败并出现一些晦涩的 JavaScript 问题,但这看起来无关紧要,我现在想跳过它。

现在我的 Gradle-foo 并不是很强大(我只在极其简单的项目中使用过它,我的大部分经验都是在 Maven 中),我有一种明显的感觉,我在这里遗漏了一些东西。然而插件的documentation 只是说

要使用 ANTLR 插件,请在构建脚本中包含以下内容:

插件{ 蚂蚁 }

我做了什么。由于我的输出为零,我觉得我需要做更多的工作才能让它工作。我已经阅读了很多 Gradle 文档来了解插件的一般工作方式,我发现它们会在构建中添加任务并添加一些依赖项,以便在您尝试构建某些东西时调用任务。但是,我真的不明白插件如何与源集一起工作,以及如何告诉 Gradle“请您为此源集运行 generateGrammarSource 任务”(或者它甚至可以像这样工作)。

因此,如果一些 Gradle 大神能在这方面启发我,将不胜感激 :)

【问题讨论】:

    标签: gradle kotlin antlr4 kotlin-multiplatform


    【解决方案1】:

    我也遇到过类似问题:https://gitlab.com/pika-lab/tuprolog/2p-in-kotlin/tree/feature/parser

    我的解决方案(仍在进行中)在于分解问题。 在我看来,我合理的解决方案是创建一个 Kotlin/JVM 项目(比如parser-jvm),将生成的 Java 代码 + 任何 JVM 特定工具放在其中,并创建一个 Kotlin/JS 项目,将生成的 JS 代码 + 任何特定于 JS 的位置放在其中设施(比如parser-js)。下一步是创建一个 Kotlin/MPP(比如parser-common)项目,其 JVM 实现依赖于parser-jvm,其 JS 实现依赖于parser-js

    我的方法实际上适用于 JVM,而我遇到了一些 JS 问题,主要是由this issue 引起的。

    这种方法的主要缺点是需要一些 Gradle 编码才能使用 Kotlin/JS 设置 ANTLR。我已经在我的build.gradle 中遇到了这个问题,我对结果和项目的整体架构非常满意。不过,我相信我的提议远比配置 Kotlin/MPP 项目与 ANTLR 一起工作麻烦得多。

    【讨论】:

    • 这看起来很有趣,但是这些构建文件非常庞大。为了让 Gradle 做你想做的事,你需要做的事情的数量令人难以置信。我已经在这方面花费了比实际实现更多的时间,并且我现在正在认真考虑 shell 脚本,因为这可能比与 Gradle 战斗更容易处理(并且代码更少)。
    猜你喜欢
    • 2012-06-24
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2020-08-18
    • 2015-04-26
    相关资源
    最近更新 更多