ANTLR4: Lexer возвращает один токен в режиме лексера - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь использовать режим лексера с ANTLR4 со следующей грамматикой лексера:

STRING: '"' -> pushMode(STRING_MODE);
mode STRING_MODE;
STRING_CONTENTS: ~('"'|'\n'|'\r')+ -> type(STRING);
END_STRING: '"' -> type(STRING), popMode;
STRING_UNMATCHED: . -> type(UNMATCHED);
  • Есть ли способ вернуть один токен типа STRING для всех символов, захваченных в пределахрежим и включая символы, которые вызвали вход в режим?
  • Когда заканчивается режим?

Я знаю, что я также могу написать строковый маркер следующим образом:

STRING: '"' (~["\n\r]|'\\"')* '"';

1 Ответ

0 голосов
/ 13 сентября 2018

1) Атрибут more накапливает сопоставленный текст в первый токен, выданный не приписанным правилом more.

Для:

STRING: '"' -> more, pushMode(STRING_MODE);

mode STRING_MODE;
    STRING_CONTENTS: ~('"'|'\n'|'\r')+ -> more ;
    END_STRING: '"' -> type(STRING), popMode;

текст, соответствующий правилам STRING и STRING_CONTENTS, добавляется к правилу END_STRING, в результате чего получается токен типа STRING, содержащийполный текст строки.

2) «Конец» оператора mode подразумевается при первом последующем обращении

  • правила синтаксического анализатора
  • другогооператор режима
  • правило фрагмента
  • EOF
...