Спецификатор класса от antlr2 до antlr4, опции, токены и многое другое
Мне нужно переписать файл грамматики из синтаксиса antlr2 в синтаксис antlr4 и задать следующие вопросы.
1) Барт Киерс утверждает, что в этом SO посте есть строгий порядок: грамматика, опции, токены, @header, @members. Этот пост antlr2.org не согласен с указанием заголовка перед параметрами. Есть ли ресурс, в котором указан правильный порядок (если таковой существует) для antlr4?
2) В том же посте antlr2.org говорится: "Раздел опций для грамматики, если он указан, должен следовать сразу за"; " спецификатора класса:
class MyParser extends Parser;
options { k=2; }
Однако при работе с antlr4 любой спецификатор класса создает эту ошибку:
syntax error: missing COLON at 'MyParser' while matching a rule
3) Что случилось с опциями в antlr4? говорит, что в то время нет никаких опций на уровне правил.
warning(83): MyGrammar.g4:4:4: unsupported option k
warning(83): MyGrammar.g4:5:4: unsupported option exportVocab
warning(83): MyGrammar.g4:6:4: unsupported option codeGenMakeSwitchThreshold
warning(83): MyGrammar.g4:7:4: unsupported option codeGenBitsetTestThreshold
warning(83): MyGrammar.g4:8:4: unsupported option defaultErrorHandler
warning(83): MyGrammar.g4:9:4: unsupported option buildAST
i.) для адаптивного алгоритма синтаксического анализа LL(*) antlr4 больше не требуется k токен?
II.) есть ли в antlr4 эквивалент для exportVocab?
iii.) есть ли в antlr4 эквиваленты для оптимизации codeGenMakeSwitchThreshold и codeGenBitsetTestThreshold или они устарели?
iv.) есть ли эквивалент для defaultErrorHandler?
v.) Я знаю, что antlr4 больше не собирает AST. Я все еще пытаюсь понять, как это повлияет на то, что использует генерируемые в настоящее время *Parser.java и * Lexer.java.
4) Мой текущий файл грамматики определяет раздел токенов
tokens {
ROOT; FOO; BAR; TRUE="true"; FALSE="false"; NULL="null";
}
Я изменил двойные кавычки на одинарные кавычки, а точки с запятой на запятые и знак равенства на двоеточие, чтобы попытаться избавиться от каждой синтаксической ошибки, но у меня была такая ошибка:
mismatched input ':' expecting RBRACE
вместе с другими. Переписано выглядит так:
tokens {
ROOT; FOO; BAR; TRUE:'true'; FALSE:'false' ...
}
поэтому я удалил:'true' и:'false', и TRUE и FALSE появятся в сгенерированных MyGrammar.tokens, но я не уверен, будет ли он работать так же, как и раньше.
Спасибо!
1 ответ
1) Просто посмотрите на основной источник синтаксиса: грамматику ANTLR4. Как вы можете видеть, порядок не играет роли в разделе приквела (который включает в себя именованные действия, параметры и т. П., Вы можете даже иметь более одного раздела параметров). Единственное условие - раздел приквела должен появляться перед любым правилом.
2) Ошибка о неправильной опции. Удалите это, и ошибка исчезнет.
3) Многие (на самом деле большинство старых) опций больше не нужны и не поддерживаются в ANTLR4.
i.) ANTLR4 использует неограниченный просмотр (следовательно, * в ALL(*)). Вы не можете указать какой-либо другой прогноз.
ii.) ExportVocab давно исчез (даже ANTLR3 его не поддерживает). Он указывает только имя файла.tokens. Вместо этого используйте значение по умолчанию.
iii.) Ничего подобного больше не требуется и не поддерживается. Алгоритм прогнозирования полностью изменился в ANTLR4.
iv.) Вместо этого вы используете прослушиватель ошибок. Есть много примеров, как это сделать (также здесь, в SO).
v.) Это вопрос или просто мысли громко? Подсказка: парсеры на основе ANTLR4 генерируют дерево разбора.
4) Я не уверен на 100% в этом, но я считаю, что вы больше не можете указывать значение, которому токен должен соответствовать в разделе токенов. Вместо этого это только для виртуальных токенов, а все остальное должно быть указано как обычные токены лексера.
Подводя итог: большинство специальных опций и приемов, необходимых для старых грамматик ANTLR, больше не нужны и должны быть удалены. Новый алгоритм синтаксического анализа может автоматически обрабатывать все неоднозначности, для которых в предыдущих версиях возникали проблемы, и для этого требовалось руководство пользователя.