如何定义不匹配任何内容的 ANTLR4 词法分析器规则?

How to define ANTLR4 lexer rules that don't match anything?

我有词法分析器模式 MESSAGESIZE_MODE,它可以匹配“10 MB”类型的文件大小。我想将此标记转发为 FILESIZE(在默认模式下),以便我可以在访问者中识别此值,因此知道我正在处理文件大小字符串。这在下面有效,但是我需要定义一个虚拟词法分析器规则 FILESIZE,它在默认模式下不应匹配任何内容。这是解决这个问题的正确方法吗?如果是,我如何定义不匹配任何内容的词法分析器规则?

FILESIZE
    : '%never_match_anything_in_default_mode'
    ;

mode MESSAGESIZE_MODE;
    MESSAGESIZE_MODE_FILESIZE: INT WS+ (K B|M B) -> type(FILESIZE), popMode;

不,有更好的方法。您可以定义一个 tokens { ... } 部分,允许您在 type(...) 调用中引用它们。

在你的情况下看起来像这样:

lexer grammar YourLexer;

tokens {
  FILESIZE
}

...

mode MESSAGESIZE_MODE;

  MESSAGESIZE_MODE_FILESIZE
   : INT WS+ (K B|M B) -> type(FILESIZE), popMode
   ;

如果您要定义更多此类虚拟令牌,请用逗号分隔它们:

tokens {
  FILESIZE,
  SOME_OTHER_TOKEN,
  YET_ANOTHER_TOKEN
}