0

私はパーサーの書き方を学んでおり、そのために SQL 用のパーサーを書いています。

私が書いている文法は、標準の yacc と非常によく似たperl Parse::Eyappモジュールによって処理されます。

文法を perl にコンパイルするときに、単一オペランド演算子のサポートを追加したとき (正しい名前がわからない - 12! や @@ 'value' などの演算子)、次のようになりました。

14 shift/reduce conflicts

以前にもありましたが、適切な %left と %right を追加することで解決しましたが、今回は問題が 1 オペランド演算子と従来の 2 オペランド演算子の間の競合にあるように思われるため、途方に暮れています。

完全な文法はここに入れるには長すぎるので、リンクだけにします.

それをコンパイルするには、次のコマンドを使用します。

eyapp -m Pg::SQL::Parser::SQL -o SQL.pm SQL.eyp

eyapp ...詳細を有効にして実行すると、この出力が得られます。

問題は、ここで問題を解決するにはどうすればよいかということです。

4

1 に答える 1

1

ああ。問題を誤診したようです。問題の本当の原因は単項演算子ではなく、キャスト (expr '::' normal_type) でした。

優先設定の最後に %left '::' を追加すると、問題が解決しました。

興味がある場合は、リンクをコミットしてください。

于 2012-09-05T12:33:23.990 に答える