关于antlr编译出现:
“The following token definitions can never be matched because prior tokens match the same input”
的错误时,其原因都是:
之前某个token,所表示的含义中,已经包含了你此处所写的token的内容。
用数学的概念就是,你当前token的所表示内容,就是之前的一个子集,
所以,相关内容,被之前大的集合匹配掉了,此处一个子集,自然匹配不到了。
比如:
[10:53:14] error(208): xxx.g:136:1: The following token definitions can never be matched because prior tokens match the same input: IF,ELSE,TRUE,FALSE |
中,后来经过查找,发现:
IF : 'IF'; ELSE : 'ELSE'; TRUE : 'TRUE'; FALSE : 'FALSE';
所表示的内容,就被之前的,更大的集合ID:
ID : ('a'..'z' | 'A'..'Z' |'_') ('a'..'z' | 'A'..'Z'| '0'..'9' |'_')*;
所匹配掉了,所以此处无法匹配。
具体点的解释就是:
此处,本意是想通过:
IF,ELSE等去匹配(所要处理内容中的)IF,ELSE等关键字,(注意不是字符串:"IF"和"ELSE")
但是由于前面的ID,所表示的含义:
大写字母或小写字母或下划线开头,后面有0或更多个字母数字下划线
很明显已经包含了此处的
IF,ELSE
等内容。
所以后面要再去用IF和ELSE去匹配对应的关键字的话,就匹配不到了:
因为已经被ID所匹配了。
所以:解决办法是:
把对应的,子集:
IF : 'IF'; ELSE : 'ELSE'; TRUE : 'TRUE'; FALSE : 'FALSE';
放到更大集合:
ID : ('a'..'z' | 'A'..'Z' |'_') ('a'..'z' | 'A'..'Z'| '0'..'9' |'_')*;
的前面,变成:
IF : 'IF'; ELSE : 'ELSE'; TRUE : 'TRUE'; FALSE : 'FALSE'; ID : ('a'..'z' | 'A'..'Z' |'_') ('a'..'z' | 'A'..'Z'| '0'..'9' |'_')*;
如此:
先去匹配小的集合:此处个别的一些ID,比如IF,ELSE,TRUE,FALSE等
再去匹配大的集合:再去匹配余下的,其他,N多的各种ID。
转载请注明:在路上 » 【整理】关于antlr中出错"The following token definitions can never be matched because prior tokens match the same input"的原因和解决思路