私はチェス代数表記の BNF を開発していて、興味深いケースに遭遇しました。入力が間違った非端末に行きます。
私の開始 BNF ルールは次のとおりです (これには意図的にキャスリングやメモが含まれていないことに注意してください)。
algebraic_notation : piece start_position capture end_position promotion
piece
、start_position
、capture
、およびpromotion
は空にすることができるため、「d4」のような移動が可能になります。問題は、そのような移動が入力されると、入力 ('d4') が によって取得されるstart_position
ため、エラー b/c there is no more input forend_position
が発生することです。空にすることはできません。
明らかなハック/回避策は、end_position
空にすることを許可し、それに対する入力があるかどうかを確認し、それに応じて行動することです。
これはうまくいきますが、これに対処する方法があるかどうか知りたいです。式全体が一致しない場合、入力が最初に一致するシンボルに移動しない可能性はありますか?
別の質問は、これが BNF の標準的な動作なのか、それとも私が使用している yaccer の問題なのかということです: PLY v 3.3.
flex/bison を使用してみましたが、同じ結果が得られました。そのため、PLY に固有のものではないようです。
完全を期すために関連するすべてのルールを次に示します。
algebraic_notation : piece start_position capture end_position promotion
piece : KING
| QUEEN
| BISHOP
| KNIGHT
| ROOK
| pawn
pawn : empty
start_position : FILE
| NUMBER
| FILE NUMBER
| empty
end_position : FILE NUMBER
| empty // this line is the hack/workaround
capture : CAPTURE
| empty
promotion : EQUAL QUEEN
| EQUAL ROOK
| EQUAL KNIGHT
| EQUAL BISHOP
| empty
empty :