如何定义不匹配任何内容的 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
}
我有词法分析器模式 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
}