2017-05-27 20 views
2

は、私は次の文法持っている:はなぜその解析可能な

grammar Demo; 

program: command 
     IDENTIFIER 
     ; 

command: 
     | 'add' 
     | 'remove' 
     ; 

IDENTIFIER: [a-zA-Z][a-zA-Z0-9]* ; 

WHITESPACE: [ \t\n\r]+ -> skip; 

を今私は「FOOを追加」と私は正しい結果を得るようなものを入力することができます。 しかし、彼はまた "foo"だけを受け入れます。私は、値がコマンドの1つで始まらなければならないので、パーサは例外をスローすると思った? 問題を解決するオプションはありますか?それとも私は誤解を持っていますか?

+5

を私はANTLRを知らないが、私は最初の '仮定|ので、空の入力を可能にすること、問題になるために'文字を。たぶんそれを 'command: 'add'に変更してください。 '取り除く'; – Seelenvirtuose

答えて

3

Seelenvirtuoseのコメントに示されているように問題がcommandためのあなたの規則は空のコマンドを可能にすることであり、それがなければならない:

command: 
     'add' 
     | 'remove' 
     ; 

パイプ記号(|)があなたに、代替案間のセパレータであります元のコードでは空のプロダクションを'add'から分離しました。

はしかし、そのまま、文法はまだあなたが(正規表現で$オプションに似ています)あなたのprogramルールで明示的にEOFトークンを持っていないためであるだけ一致fooにできるようになります。 EOFトークンがなければ、パーサーは可能な限りうまく一致し、残りを無視します。それが何であるのであれば、望ましい行動は常にEOFとのあなたの主なルール終わらない:

program: command IDENTIFIER EOF; 
+0

@MikeLischke私は答えコミュニティwikiを作ったので、答えにそれを追加してください:) –

+0

完了、このコミュニティwikiを作る必要はありません:-) –

関連する問題