为什么不生成此ANTLR语法文件以及如何修复它?

时间:2011-11-10 19:50:57

标签: antlr antlr3 antlrworks

grammar mygrammar;

string  : '"' ( ESC | ~('\u0000'..'\u001f' | '\\' | '\"' ) )* '"';

number : HEX_NUMBER | '-'? INTEGER_NUMBER ( '.' INTEGER_NUMBER )?;

HEX_NUMBER : '0x' HEX_DIGIT+;

INTEGER_NUMBER : DIGIT+;

WS: (' '|'\n'|'\r'|'\t')+ {$channel=HIDDEN;} ; // ignore whitespace

fragment 
ESC     :   '\\' (UNI_ESC |'b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\');

fragment 
UNI_ESC : 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT;

fragment
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;

fragment
DIGIT   :   ('0'..'9');

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;

这是我在ANTLRWorks控制台中收到的错误消息

[14:49:09] error(208): mygrammar.g:7:1: The following token definitions can never be matched because prior tokens match the same input: T__16

如果我在string行注释掉它会生成代码,那么我如何同时同时拥有stringnumber规则?

1 个答案:

答案 0 :(得分:3)

我认为你看到了一个奇怪的错误,因为你在一个非法的地方使用了一个操作员。范围运算符..(点 - 点)仅在词法规则中有效。您的string规则是一个解析器规则,应该成为词法规则。

所以,而不是:

string  : '"' ( ESC | ~('\u0000'..'\u001f' | '\\' | '\"' ) )* '"';

做的:

STRING  : '"' ( ESC | ~('\u0000'..'\u001f' | '\\' | '\"' ) )* '"';