关于Antlr中报错The following token definitions can never be matched because prior tokens match the same

本文探讨了在ANTLR解析器中遇到的词法冲突问题,通过将某些规则设置为片段(fragment),有效解决了代码报错的问题,确保了语法的正确性和代码的顺利运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天学了点Antlr 的使用 突然发现总报错,但是规则没有错,一直很不理解

The following token definitions can never be matched because prior tokens match the same  


ID :  LETTER(LETTER|DIGIT)* {System.out.println("  "+$line+"  int   "+$text);};
NUM :  SIGNEDNAT ('.' NAT)? ('E'  SIGNEDNAT)? {System.out.println("  "+$line+"  int   "+$text);};

SIGNEDNAT
: ('+'|'-')? NAT ;
  NAT  :  DIGIT+;

LETTER  :  'a'..'z'|'A'..'Z'|'_' ;
t DIGIT  :  '0'..'9';


后来才发现上面的几个词法会有雷同的地方,词法中相互引用 如 NAT 会引用到Digit,这个时候DIGIT就必须设置为片段fragment 

不作为词法识别。

在词法规则中那些不会被语法规则直接调用的词法规则可以用一个fragment关键字来标识,fragment标识的规则只能为其它词法规则提供基础。

ID : LETTER(LETTER|DIGIT)* {System.out.println("  "+$line+"  int   "+$text);};
NUM : SIGNEDNAT ('.' NAT)? ('E'  SIGNEDNAT)? {System.out.println("  "+$line+"  int   "+$text);};


fragment SIGNEDNAT
: ('+'|'-')? NAT ;
fragmen  NAT : DIGIT+;

fragment LETTER : 'a'..'z'|'A'..'Z'|'_' ;
fragment DIGIT : '0'..'9';


这样就正常了。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值