ANTLR4:词法分析器在词法分析器模式下返回单个标记

ANTLR4: Lexer returning a single token when in a lexer mode

我正在尝试使用具有以下词法分析器语法的 ANTLR4 词法分析器模式:

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

我知道我也可以这样写字符串标记:

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

1) more 属性会将匹配的文本累积到非 more 属性规则发出的第一个标记中。

对于:

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

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

匹配 STRINGSTRING_CONTENTS 规则的文本被添加到 END_STRING 规则的前面,导致 STRING 类型的标记包含全文字符串。

2) 模式语句的 'end' 隐含在随后第一次遇到

  • 解析器规则
  • 另一个模式语句
  • 片段规则
  • EOF