2011-11-10 4 views
1
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'|'_')*; 

は、私はそれがコードを生成string行をコメントアウトした場合、どのように私は同時にstringnumberルールの両方を持っていない私はANTLRWorksコンソールで取得エラーメッセージなぜこのANTLR文法ファイルは生成されないのですか?ここ

[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 

のですか?

+0

は、ルールで直接文字列リテラルを持って、両方のパーサーのルールがあります。 ANTLRはこれらの文字列のトークンを作成しますが、T__324などの名前を付けます。エラーメッセージをより理にかなったものにするため、すべての文字列のトークンを作成することを検討することをお勧めします。 –

答えて

3

あなたは違法な場所でオペレータを使用しているため、ちょっとした奇妙なエラーが発生していると思います。範囲演算子..(ドット・ドット)は、レクサー規則内でのみ有効です。 stringルールはパーサールールです。代わりにレクサールールにする必要があります。

ので、代わりに:

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

が行う:さておき、「文字列」と「数」として

STRING : '"' (ESC | ~('\u0000'..'\u001f' | '\\' | '\"'))* '"'; 
関連する問題