Как указать целевой пакет для ANTLR?
Если я вызываю:
java org.antlr.Tool -o outdir sources/com/example/Java5.g
... с antlr-3.1.3 код синтаксического анализатора и лексера будет сгенерирован в каталоге outdir/sources/com/example
. Но сгенерированные классы не имеют оператора package
. Я нуждаюсь в них в жизни в пакете com.example
.
Можно ли указать целевой пакет?
Ответы
Ответ 1
ANTLR предоставляет инструмент заголовка, который позволяет вам включать пакет и импорт. Вы включаете это в свой файл грамматики *.g:
@header {
package org.xmlcml.cml.converters.antlr;
import java.util.HashMap;
}
И вам это может понадобиться и в Lexer:
@lexer::header {package org.xmlcml.cml.converters.antlr;}
и если вам нужно добавить некоторые элементы и код:
@members {
HashMap<String, Object> objectMap = new HashMap<String, Object>();
//...
private void addArrayValue(String content) {
//... code required by snippets in the grammar
}
}
Ответ 2
Старый вопрос с отличным ответом, но поскольку в комментарии к вопросу был задан вариант командной строки (и именно это я и искал, когда я сюда попал), я думал, что просто перезвоню и скажите следующее...
Вы можете указать пакет в командной строке, если вы используете ANTLR 4. Я проверен и кажется, что он не существует в версии 3, так что другой ответ - это путь для ANTLR 3.
Вот пример:
java -cp antlr-4.4-complete.jar org.antlr.v4.Tool -package my.package MyGram.g4
Дополнительную информацию см. в разделе -package
в ANTLR Tool Параметры командной строки.