如何在多平台项目中使用Gradle构建ANTLR语法?

时间:2020-01-29 20:16:03

标签: gradle kotlin antlr4 kotlin-multiplatform

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

所以我建立了一个Kotlin多平台项目,因为这似乎是用一块石头杀死两只鸟的好方法(这里是仓库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代码。 las,事实并非如此。 ANTLR插件甚至都没有启动,这是我从输出中可以看到的。后来该构建失败,并出现了一些晦涩的JavaScript问题,但这看起来无关紧要,我现在想跳过它。

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

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

插件{ 反抗 }

我做到了。由于我的输出为零,所以我觉得需要做更多一些才能使它起作用。我上下阅读了很多Gradle文档,以了解插件的一般工作原理,并且发现它们在构建中添加了任务,还添加了一些依赖项,以便在您尝试构建某些事物时调用任务。但是,我不太了解插件如何与源集一起使用,以及如何告诉Gradle“请为该源集运行generateGrammarSource任务”(或者是否可以像这样工作)。

因此,如果某些Gradle神能启发我,这将不胜感激:)

1 个答案:

答案 0 :(得分:1)

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

我的解决方案-仍在进行中-包括分解问题。 我认为,合理的解决方案是创建一个Kotlin / JVM项目(例如[H1 | H2]),在其中放置生成的Java代码+特定于JVM的任何设施,并在Kotlin / JS项目中放置生成的JS代码+任何JS特定功能(例如parser-jvm)。下一步是创建一个Kotlin / MPP(例如parser-js)项目,该项目的JVM实现依赖于parser-common,而JS实现依赖于parser-jvm

当我遇到JS问题时,我的方法实际上适用于JVM,这主要是由this issue引起的。

此方法的主要缺点是,使用Kotlin / JS设置ANTLR需要一些Gradle编码。我已经在build.gradle中遇到了这个问题,并且对结果和项目的总体架构非常满意。但是,我相信我的建议要比配置Kotlin / MPP项目与ANTLR配合使用麻烦得多。