Как определить токены, которые могут появляться в нескольких лексических режимах в ANTLR4?

Я изучаю ANTLR4 и пытаюсь поиграть с лексическими модами. Как сделать так, чтобы один и тот же токен отображался в нескольких лексических режимах? В качестве очень простого примера предположим, что моя грамматика имеет два режима, и я хочу сопоставить пробелы и конец строки в обоих из них, как я могу это сделать, не заканчиваясь, например, WS_MODE1 и WS_MODE2. Есть ли способ повторно использовать одно и то же определение в обоих случаях? Я надеюсь получить токены WS в выходном потоке для всего пробела независимо от режима. То же самое относится к EOL и другим ключевым словам, которые могут появляться в обоих режимах.


person medhat    schedule 04.04.2013    source источник


Ответы (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
comment
Короткий вопрос об использовании этих правил Lexer: в правилах парсера вы ссылаетесь на WS или Mode1_WS, Mode2_WS? Я пробовал оба, но кажется, что вы определяете только правила Lexer, не ссылаясь на них непосредственно в правилах парсера. В этом смысле это скорее «оператор импорта», чем «псевдоним». - person andy droid; 12.11.2014
comment
Команда type явно назначает тип токена, который увидит анализатор. В этом случае WS будет использоваться для ссылки на токены, созданные любым из этих 3 правил. - person Sam Harwell; 12.11.2014
comment
@SamHarwell, что завершает спецификацию окончательного режима? Я заметил, что в некоторых документах лексера есть определения фрагментов, следующие за окончательной спецификацией режима, где использование фрагментов показывает, что фрагменты доступны для всех режимов, включая режим по умолчанию. - person bvj; 06.09.2017
comment
Токены, которые могут сопоставляться во всех режимах, были бы очень полезной функцией грамматики лексера. Я обнаруживаю, что использую псевдонимы токенов в отсутствие такой функции. - person Ronnie Overby; 07.08.2019