Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在多平台项目中使用Gradle构建ANTLR语法?_Gradle_Kotlin_Antlr4_Kotlin Multiplatform - Fatal编程技术网

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

如何在多平台项目中使用Gradle构建ANTLR语法?,gradle,kotlin,antlr4,kotlin-multiplatform,Gradle,Kotlin,Antlr4,Kotlin Multiplatform,所以我整个下午都在为一个涉及ANTLR语法的Kotlin多平台项目进行Gradle构建。我试图做的是让ANTLR根据Kotlin(如果不起作用的话,也可以是Java)和JavaScript目标的共享语法生成一个解析器。基于此,我想围绕解析器编写一些库,这些库可以从JVM和JavaScript中使用 所以我建立了一个Kotlin多平台项目,因为这似乎是一举两得的好方法(这里是回购协议)。我创建了一个源代码集commonAntlr,将语法文件放在commonAntlr/antlr/project_t

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

所以我建立了一个Kotlin多平台项目,因为这似乎是一举两得的好方法(这里是回购协议)。我创建了一个源代码集
commonAntlr
,将语法文件放在
commonAntlr/antlr/project_txt.g4
下。根据ANTLR插件的文档,这是应该如何设置的。我还应用了顶部的
antlr
插件(这里是
build.gradle.kts
-)

现在我运行
gradlebuild
,希望ANTLR插件至少能使用默认设置从语法中为我生成一些漂亮的Java代码。唉,事实并非如此。ANTLR插件甚至还没有启动,这是我从输出中可以看出的。后来构建失败了,出现了一些模糊的JavaScript问题,但这看起来与此无关,我现在想跳过它

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

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

插件{ antlr }

我做到了。由于我的输出为零,我有一种感觉,我需要做更多的工作才能使它工作。我上下阅读了大量Gradle文档,以了解插件通常是如何工作的,我发现它们向构建中添加了任务,还添加了一些依赖项,以便在尝试构建某些东西时调用任务。然而,我真的不明白插件如何与源代码集协同工作,以及如何告诉Gradle“请为此源代码集运行
generateGrammarSource
任务”(或者它是否像这样工作)


因此,如果格拉德尔的一些神能在这方面启发我,我将不胜感激:)

我遇到了一个类似的问题:

我的解决方案——仍在进行中——在于分解问题。 我认为合理的解决方案是创建一个Kotlin/JVM项目(比如说
parser-JVM
),将生成的Java代码+任何JVM特定的工具放在那里,以及一个Kotlin/JS项目,将生成的JS代码+任何JS特定的工具放在那里(比如说
parser-JS
)。下一步是创建一个Kotlin/MPP(比如
parser common
)项目,其JVM实现依赖于
parser JVM
,其JS实现依赖于
parser JS

我的方法实际上适用于JVM,而我在JS方面遇到了一些问题,这些问题主要是由以下原因引起的


这种方法的主要缺点是需要一些Gradle编码来使用Kotlin/JS设置ANTLR。我在工作中已经遇到了这个问题,我对结果和项目的整体架构非常满意。然而,我相信我的建议远没有配置Kotlin/MPP项目来与ANTLR一起工作那么麻烦。

这看起来很有趣,但是这些构建文件非常庞大。要让Gradle做你想做的事情,你需要做的事情之多令人难以置信。我已经在这方面花费了比实际实现更多的时间,现在我正在认真考虑shell脚本,因为这可能比处理Gradle更容易(代码更少)。