2016-04-07 3 views
4

Я создал новый проект Gradle, добавилЧто такое минимальный проект Gradle для ANTLR4 (с плагином antlr)?

apply plugin: 'antlr' 

и

dependencies { 
    antlr "org.antlr:antlr4:4.5.3" 

к build.gradle.

Созданный src/main/antlr/test.g4 файл со следующим содержимым

grammar test; 
r : 'hello' ID; 
ID : [a-z]+ ; 
WS : [ \t\r\n]+ -> skip ; 

Но это не работает. Не генерируются исходные файлы java (и ошибок не было).

Что я пропустил?

Проект находится здесь: https://github.com/dims12/AntlrGradlePluginTest2

UPDATE

Я нашел мой пример на самом деле работает, но поместить код в \build\generated-src который я не ожидал: стыд:

+0

Перейти к github.com и поиск 'ANTLR Gradle'. Предоставлено несколько примеров. – GRosenberg

+1

Мне не нужен рабочий пример, мне нужно понимание того, что требуется, а что нет. – Dims

+1

Рад, что я нашел этот вопрос, не смог найти и мои сгенерированные файлы. И благодаря Гросенбергу за то, что он абсолютно бесполезный человек. – Silverclaw

ответ

5

Добавлю на другие ответы здесь.

выпуск 1: сгенерированные исходные файлы размещаются в папке build/generated-src.

Я нашел this discussion, но решение там (настройка outputDirectory) является плохой идея. Если вы сделаете команду gradle clean build, это очистит ваш весь исходный каталог. Обсуждение здесь дает хорошее объяснение того, почему вы не должны

ANTLR сгенерирована источники генерируются в подкаталоге «построить» папку, как и все другие артефакты, которые генерируется в процессе сборки. Кроме того, сгенерированный каталог projectRoot/build/сгенерированный-src/antlr/main добавлен в определение атрибута java , чтобы убедиться в его рассматриваемой задаче compileJava. Если вы пишете источник, сгенерированный antlr, непосредственно в папку src/main/java , вы загрязняете свою исходную папку выводом вашего процесса сборки . Я думаю, загрязнение вашей исходной папки во время сборки - это antipattern.

Однако, если вы хотите это сделать, вы можете добавить задачу градиента, чтобы скопировать сгенерированные файлы в каталог сборки.

generateGrammarSource << { 
    println "Copying generated grammar lexer/parser files to main directory." 
    copy { 
     from "${buildDir}/generated-src/antlr/main" 
     into "src/main/java" 
    } 
} 

Выпуск 2: Сформирован исходные файлы не имеют пакет набор атрибутов.

Чтобы решить эту проблему, добавьте что-то вроде следующего в верхней части файла грамматики:

@header { 
package com.example.my.package; 
} 
0

Образец Gradle отметил @Mark Виейра только у меня на полпути. Я обнаружил, что мне нужно было указать пакет в заголовке моего ANTLR-файла грамматики, чтобы все было видно в обоих направлениях (сгенерированный код, способный получить доступ к рукописному коду и наоборот).

grammar MyGrammar; 

@header { 
    package com.mypackage; 
} 

До перехода на Gradle, я использовал плагин ANTLR в IntelliJ, который заполнил в пакет для меня. После перехода на Gradle пакет ушел, что вызвало проблемы.

Источник: https://stackoverflow.com/a/1655920/1877143

+1

Если вы поместите свои файлы грамматики в пакеты, он сделает это автоматически. Например, если у вас есть 'src/main/antlr/com/mypackage/MyGrammar.g', тогда он будет сгенерировать файлы в' com.mypackage'. – Kip

+0

Я беру это обратно ...который помещает выходные файлы в нужное место, но по-прежнему не добавляет линию пакета к сгенерированному источнику – Kip

0

Gradle STS плагин не создает исходные файлы для antlr4. Он генерирует вводящий в заблуждение вывод как:

[sts] ----------------------------------------------------- 
[sts] Starting Gradle build for the following tasks: 
[sts]  generateGrammarSource 
[sts] ----------------------------------------------------- 
:generateGrammarSource UP-TO-DATE 

Удаленный этот старый плагин и используется из командной строки. Он работает!

Gradle STS plugin doesn't generate source files for antlr4. Need to Use new plugin or command line

0

Добавьте это в build.gradle

generateGrammarSource { 
    outputDirectory = file("src/main/java/com/example/parser") 
} 

добавить к вашей грамматике после "грамматики";

@header { 
    package com.example.parser; 
} 

Протестировано и работает с Java8 grammar from antlr example grammars

Дополнительная Ссылка (ы):

Here is a short guide of the Antlr plugin from docs.gradle.org

1

Что мне помогли две вещи:

  • Добавить заголовок: @header{ package com.example.something.antlrparser } к вверху файла грамматики.
  • Поместите файл грамматика в соответствующей папке, т.е. src/main/antlr/com/example/something/antlrparser/grammar.g4

Теперь, когда я бег generateGrammarSource Gradle задачи, .java файлов генерируются в /build/generated-src/antlr/main/com/example/something/antlrparser/*.java и они автоматически подобраны IntelliJ, а также скомпилированы по Gradle.

build.gradle файл просто:

group 'com.example.something' 
version '1.0-SNAPSHOT' 

apply plugin: 'java' 
apply plugin: 'antlr' 
apply plugin: 'idea' 

sourceCompatibility = 1.8 

repositories { 
    mavenCentral() 
} 

dependencies { 
    testCompile group: 'junit', name: 'junit', version: '4.12' 
    antlr "org.antlr:antlr4:4.5" // use ANTLR version 4 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^