最新消息:20181230 VPS服务器已从Linode换到腾讯云香港,主题仍用朋友推荐的大前端D8

【整理】关于antlr中出错"The following token definitions can never be matched because prior tokens match the same input"的原因和解决思路

ANTLR crifan 808浏览 0评论

关于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"的原因和解决思路

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
63 queries in 0.084 seconds, using 9.44MB memory