为什么';这个ANTLR语法文件是否生成?如何修复它?

为什么';这个ANTLR语法文件是否生成?如何修复它?,antlr,antlr3,antlrworks,Antlr,Antlr3,Antlrworks,这是我在AntlWorks控制台中得到的错误消息 grammar mygrammar; string : '"' ( ESC | ~('\u0000'..'\u001f' | '\\' | '\"' ) )* '"'; number : HEX_NUMBER | '-'? INTEGER_NUMBER ( '.' INTEGER_NUMBER )?; HEX_NUMBER : '0x' HEX_DIGIT+; INTEGER_NUMBER : DIGIT+; WS: (' '|'\n

这是我在AntlWorks控制台中得到的错误消息

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'|'_')*;

如果我注释掉它生成代码的
字符串
行,我如何同时拥有
字符串
数字
规则?

我想你看到了一个奇怪的错误,因为你在一个非法的地方使用运算符。范围运算符
(点-点)仅在lexer规则内有效。您的
string
规则是解析器规则,应该改为lexer规则

因此,不是:

[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”和“number”都是解析器规则,在这些规则中直接有一个字符串文本。ANTLR将为这些字符串创建标记,但会给它们命名,如T__324。您可能想考虑为所有字符串创建令牌,因为它允许错误消息更为合理。
string  : '"' ( ESC | ~('\u0000'..'\u001f' | '\\' | '\"' ) )* '"';
STRING  : '"' ( ESC | ~('\u0000'..'\u001f' | '\\' | '\"' ) )* '"';