私は次の文法を持っています:
grammar tryout;
tryout : my_cmd
;
my_cmd
: 'start' '0'..'9'+ Name_string
;
Digit
: '0'..'9'
;
Name_string
: ('A'..'Z' | 'a'..'z') ('A'..'Z' | 'a'..'z' | '0'..'9' | '_')*
;
ANTLRworks でダイアグラムを見ると、'0'..'9'+ が空の要素として表示され、生成されたコードに "if ()" ステートメントがあるため、Java コードのコンパイルが失敗します。コマンドラインで実行すると、コンパイルも失敗します。
修正は、'0'..'9'+ をレクサー ルールに移動することです。
grammar tryout;
tryout : my_cmd
;
my_cmd
: 'start' Digit+ Name_string
;
Digit
: '0'..'9'
;
Name_string
: ('A'..'Z' | 'a'..'z') ('A'..'Z' | 'a'..'z' | '0'..'9' | '_')*
;
しかし、これはバグなのだろうか。パーサー規則で範囲要素を使用できないのはなぜですか? これはANTLR v3.4にあります。