Как определить токены, которые могут отображаться в нескольких лексических режимах в 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
и знает, что вы переназначили их типы, поэтому они не будут определять токены для них.