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

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

Ответ 1

Правила должны иметь разные имена, но вы можете использовать команду -> type(...) lexer, чтобы дать им тот же тип.

WS : [ \t]+;

mode Mode1;

    Mode1_WS : WS -> type(WS);

mode Mode2;

    Mode2_WS : WS -> type(WS);

Даже если Mode1_WS и Mode2_WS не являются правилами fragment, генератор кода увидит команду type и знает, что вы переназначили их типы, поэтому они не будут определять токены для них.