我要匹配的规则是: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)时(相对于上面的第一个输入示例),我得到了下面的解析树:
但是,如果输入之间有空格,则没有问题。请解释为什么会出错。
答案 0 :(得分:1)
ANTLR(以及大多数词法分析器生成器)中的词法分析是根据最大的munch规则进行的,该规则规定,它始终应用可能与当前输入的最长前缀匹配的词法器规则。对于输入hello123
,规则'hello'
将匹配hello
,而规则CHARS
将匹配整个输入hello123
。因此,CHARS
产生了更长的匹配项,并在'hello'
上被选中。
如果您的CHARS
和DIGITS
令牌只能出现在'hello'
令牌之后,则可以使用lexer modes使其生效,以便这些规则仅在{ {1}}已被匹配。
否则,要获得所需的行为,最好的选择是创建一个与'hello'
相匹配的词法分析器规则,然后在一个单独的步骤中分解由该词法分析器生成的标记。虽然这取决于您为什么需要此。