如何匹配没有空格的序列

时间:2019-05-24 11:09:48

标签: antlr4

我要匹配的规则是: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)时(相对于上面的第一个输入示例),我得到了下面的解析树:

enter image description here

但是,如果输入之间有空格,则没有问题。请解释为什么会出错。

1 个答案:

答案 0 :(得分:1)

ANTLR(以及大多数词法分析器生成器)中的词法分析是根据最大的munch规则进行的,该规则规定,它始终应用可能与当前输入的最长前缀匹配的词法器规则。对于输入hello123,规则'hello'将匹配hello,而规则CHARS将匹配整个输入hello123。因此,CHARS产生了更长的匹配项,并在'hello'上被选中。

如果您的CHARSDIGITS令牌只能出现在'hello'令牌之后,则可以使用lexer modes使其生效,以便这些规则仅在{ {1}}已被匹配。

否则,要获得所需的行为,最好的选择是创建一个与'hello'相匹配的词法分析器规则,然后在一个单独的步骤中分解由该词法分析器生成的标记。虽然这取决于您为什么需要此。