首页 > 解决方案 > 如何匹配没有空格分隔的序列

问题描述

我要匹配的规则是:hello后跟一系列字符。如果该序列中包含一个字母,那么它应该匹配str规则,否则它应该匹配num规则。

例如

hello123- 123 应该由 num 规则匹配

hello1a3- 1a3 应该由 str 规则匹配

我写的语法如下:

grammar Hello;

r: 'hello'seq;
// seq: str | integ;
seq: num | str;
num : DIGITS;
str : CHARS;
DIGITS: [0-9]+;
CHARS : [0-9a-zA-Z]+;
WS : [ \t\n\r]+ -> skip;

在尝试可视化解析树(使用 grun)(针对上面的第一个输入示例)时,我得到了以下解析树:

在此处输入图像描述

但是,如果输入之间有空格,则没有问题。请解释错误的原因。

标签: antlr4

解决方案


ANTLR(以及大多数词法分析器生成器)中的词法分析根据最大 munch 规则工作,这表示它始终应用可以匹配当前输入的最长前缀的词法分析器规则。对于输入hello123,规则'hello'将匹配hello,而规则CHARS将匹配整个输入hello123。因此CHARS产生较长的匹配并被选中'hello'

如果你的CHARSandDIGITS标记只能出现在一个'hello'标记之后,你可以使用词法分析器模式来使这些规则只有在 a'hello'匹配后才可用。

否则,要获得您想要的行为,您最好的选择可能是创建一个匹配的单个词法分析器规则,'hello' [0-9a-zA-Z]*然后在单独的步骤中分解由该规则生成的标记。虽然这一切都取决于你为什么需要这个。


推荐阅读