Почему этот файл грамматики ANTLR не генерируется и как я могу это исправить? - PullRequest
1 голос
/ 10 ноября 2011
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, она генерирует код, как у меня есть и string, иnumber правил одновременно?

1 Ответ

3 голосов
/ 11 ноября 2011

Я думаю, вы видите странную ошибку, потому что вы используете оператор в недопустимом месте.Оператор диапазона .. (точка-точка) действителен только внутри правил лексера.Ваше правило string - это правило синтаксического анализатора, которое вместо этого следует использовать как правило лексера.

Вместо:

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

do:

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