antlr4 отлично работает с файлом грамматики .g4, но gradle generateGrammarSources завершается ошибкой в ​​том же файле с TokenStreamException: неожиданный символ: '-' / " - PullRequest
1 голос
/ 03 июня 2019

Я экспериментирую с плагином antlr для gradle и пытаюсь сгенерировать некоторые исходные файлы для моей грамматики.Использование учебника ANTLR Mega в качестве руководства.Когда я вручную запускаю инструмент antlr4 на своей грамматике через терминал, он успешно работает и генерирует файлы * .java, * .tokens & * .interp.Я пытаюсь сгенерировать эти файлы с помощью плагина gradle и получаю сообщение об ошибке "> ANTLR Panic: TokenStreamException: неожиданный символ: '-'".

Ожидаю ли я, что gradle generateGrammarSources будет иметь эквивалентную функциональность для запуска команды antlr непосредственно в моей грамматике?

Файл грамматики основан на одном из примеров Antlr: https://github.com/antlr/grammars-v4/blob/master/arithmetic/arithmetic.g4

user-MBP:antlr user$ antlr4 
ANTLR Parser Generator  Version 4.7.2

user-MBP:main-project user$ ls  src/main/antlr/
arithmetic.g4

user-MBP:antlr user$ antlr4 arithmetic.g4 
user-MBP:antlr user$ ls
arithmetic.g4               arithmetic.tokens           arithmeticLexer.interp      arithmeticLexer.tokens      arithmeticParser.java
arithmetic.interp           arithmeticBaseListener.java arithmeticLexer.java        arithmeticListener.java

Код Gradle, чтобы сделать то же самое:

apply plugin: 'antlr'

...

dependencies {
...
    compile group: 'org.antlr', name: 'antlr4-runtime', version: '4.7.1'
...
}

// as the .g4 grammar file is already present in src/main/antlr, not  // explicitly specifying any package directory

Выполнение команды gradle

user-MBP:main-project user$ gradle generateGrammarSource --stacktrace

Caused by: java.lang.RuntimeException: ANTLR Panic: TokenStreamException: unexpected char: '-'
        at antlr.Utils.error(Utils.java:34)
        at antlr.Tool.fatalError(Tool.java:445)
        at antlr.Tool.doEverything(Tool.java:280)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

Я ожидаю, что вышеупомянутая команда gradle успешно выполнится и сгенерирует эквивалентные исходные файлы вкаталог build /, но он не работает.

1 Ответ

0 голосов
/ 05 июня 2019

Мне не хватало инструмента antlr, который генерирует грамматику в моих зависимостях gradle.ANTLR состоит из двух компонентов: - инструмент, используемый для генерации лексера и анализатора из грамматики (зависимость от antlr) - среда выполнения, необходимая для запуска сгенерированных исходных файлов (antlr4-runtime)

Добавление следующей строки в моем gradleзависимости решили проблему.

    dependencies {
        ...
        antlr "org.antlr:antlr4:4.7.1"
        ...
    }
...