Как построить грамматику ANTLR с помощью Gradle в многоплатформенном проекте? - PullRequest
0 голосов
/ 29 января 2020

Поэтому весь день я боролся за то, чтобы заставить какую-то сборку Gradle работать для многоплатформенного проекта Kotlin, который включает грамматику ANTLR. Я пытаюсь создать синтаксический анализатор, сгенерированный 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 код из грамматики, используя настройки по умолчанию. Увы, это не так. Плагин ANTLR даже не запускается, что я могу сказать из вывода. Позднее сборка завершается с некоторой непонятной проблемой JavaScript, но это выглядит несвязанной, и я бы хотел пока пропустить ее.

Теперь мой Gradle-foo не совсем силен (я использовал только его в чрезвычайно простых проектах большая часть моего опыта - в Maven), и у меня есть отчетливое ощущение, что я что-то здесь упускаю. Однако документация плагина просто говорит:

Чтобы использовать плагин ANTLR, включите в ваш скрипт сборки следующее:

plugins {antlr}

Что я и сделал. Поскольку я получаю нулевой результат, у меня есть ощущение, что мне нужно сделать немного больше, чтобы это работало. Я прочитал большую часть документации Gradle вверх и вниз, чтобы узнать, как плагины работают в целом, и я обнаружил, что они добавляют задачи в сборку, а также добавляют некоторые зависимости, так что задачи вызываются, когда вы пытаетесь построить определенные вещи. Однако я не совсем понимаю, как плагины работают вместе с исходными наборами и как вы можете сказать Gradle «не могли бы вы выполнить задачу generateGrammarSource для этого исходного набора» (или даже если она работает так).

Так что, если бы некоторые из богов Градл могли просветить меня в этом, это было бы очень ценно:)

1 Ответ

1 голос
/ 30 января 2020

Я встречал похожую проблему: https://gitlab.com/pika-lab/tuprolog/2p-in-kotlin/tree/feature/parser

Мое решение, которое все еще находится в стадии разработки, состоит в разложении проблемы. По моему мнению, разумным решением является создание проекта Kotlin / JVM (скажем, parser-jvm), в который необходимо поместить сгенерированный код Java + любое средство JVM, специфицирующее c, и проект Kotlin / JS, в котором можно разместить сгенерированный JS код + любое JS конкретное c средство (скажем, parser-js). Следующим шагом является создание проекта Kotlin / MPP (скажем, parser-common), реализация JVM которого зависит от parser-jvm, а реализация JS зависит от parser-js.

Мой подход действительно работает для JVM, в то время как у меня возникают некоторые проблемы с JS, которые в основном вызваны этой проблемой .

Основным недостатком этого подхода является то, что для настройки ANTLR с Kotlin / JS требуется некоторое кодирование Gradle. Я уже сталкивался с этой проблемой в моем build.gradle , и я вполне удовлетворен результатом и общей архитектурой проекта. Однако я считаю, что мое предложение гораздо менее проблематично, чем настройка проекта Kotlin / MPP для работы с ANTLR.

...