2

私はチェス代数表記の BNF を開発していて、興味深いケースに遭遇しました。入力が間違った非端末に行きます。

私の開始 BNF ルールは次のとおりです (これには意図的にキャスリングやメモが含まれていないことに注意してください)。

algebraic_notation : piece start_position capture end_position promotion

piecestart_positioncapture、および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 : 
4

4 に答える 4

0

start_position capture end_position真ん中のブロックにラップし、FILE NUMBERstart_posから次のように削除するとどうなりますか?

middle: start_pos capture end_pos
      | end_pos capture end_pos
      | capture end_pos

start_pos : FILE
      | NUMBER
      | empty

end_pos : FILE NUMBER

capture : CAPTURE
      | empty
于 2010-12-03T14:44:56.337 に答える
0

私は PLY を使用したことがなく、あなたが試した完全な flex/bison ファイルを確認せずに、問題ではないものを選択している可能性がありますが、パーサーに、現在のalgebraic_notationルール。入力「d4」が start_position に一致したことをどのように知っているかはわかりませんが、パーサーがルールのすべてのトークンを持っていることを知っていて、空でない唯一のトークンが end_position であることを知っている場合、「d4」を一致させる必要があります。それ。

EOL のように、行の終わりを示すトークンを導入するのはどうですか。したがって、最初のルールは次のようになります。

algebraic_notation : piece start_position capture end_position promotion EOL

パーサーは、トークン 'd4' の後に EOL が表示されるようになりました。これにより、動作が変わりますか?

于 2010-12-03T14:38:05.973 に答える