Я изучаю ANTLR4 и пытаюсь поиграть с лексическими модами. Как сделать так, чтобы один и тот же токен отображался в нескольких лексических режимах? В качестве очень простого примера предположим, что моя грамматика имеет два режима, и я хочу сопоставить пробелы и конец строки в обоих из них, как я могу это сделать, не заканчиваясь, например, WS_MODE1 и WS_MODE2. Есть ли способ повторно использовать одно и то же определение в обоих случаях? Я надеюсь получить токены WS в выходном потоке для всего пробела независимо от режима. То же самое относится к EOL и другим ключевым словам, которые могут появляться в обоих режимах.
Как определить токены, которые могут появляться в нескольких лексических режимах в ANTLR4?
Ответы (1)
У правил должны быть разные имена, но вы можете использовать команду лексера -> type(...)
, чтобы присвоить им один и тот же тип.
WS : [ \t]+;
mode Mode1;
Mode1_WS : WS -> type(WS);
mode Mode2;
Mode2_WS : WS -> type(WS);
Несмотря на то, что Mode1_WS
и Mode2_WS
не являются правилами fragment
, генератор кода увидит команду type
и узнает, что вы переназначили их типы, поэтому он не будет определять для них токены.
person
Sam Harwell
schedule
04.04.2013
Короткий вопрос об использовании этих правил Lexer: в правилах парсера вы ссылаетесь на WS или Mode1_WS, Mode2_WS? Я пробовал оба, но кажется, что вы определяете только правила Lexer, не ссылаясь на них непосредственно в правилах парсера. В этом смысле это скорее «оператор импорта», чем «псевдоним».
- person andy droid; 12.11.2014
Команда
type
явно назначает тип токена, который увидит анализатор. В этом случае WS
будет использоваться для ссылки на токены, созданные любым из этих 3 правил.
- person Sam Harwell; 12.11.2014
@SamHarwell, что завершает спецификацию окончательного режима? Я заметил, что в некоторых документах лексера есть определения фрагментов, следующие за окончательной спецификацией режима, где использование фрагментов показывает, что фрагменты доступны для всех режимов, включая режим по умолчанию.
- person bvj; 06.09.2017
Токены, которые могут сопоставляться во всех режимах, были бы очень полезной функцией грамматики лексера. Я обнаруживаю, что использую псевдонимы токенов в отсутствие такой функции.
- person Ronnie Overby; 07.08.2019