今天学了点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';
这样就正常了。。。。