4

FlexとBisonを使用して、論理「and」、「or」、「not」操作、および「()」を使用したネストされた部分式をサポートするブールクエリ言語の文法仕様があります。

「(A&B)|(C&D)」として解析したい「AとBまたはCとD」のようなクエリが実際には「A&(B |( CD ) )"。これは結合性の問題であるとほぼ確信していますが、適切な説明や例をどこにも見つけることができないようです。それか、重要な何かが欠けています。

boolpars.yからの関連情報:

%token TOKEN
%token OPEN_PAREN CLOSE_PAREN
%right NOT
%left AND
%left OR

%%

query:      expression                          { ... }
            ;

expression: expression AND expression           { ... }
            | expression OR expression          { ... }
            | NOT expression                    { ... }
            | OPEN_PAREN expression CLOSE_PAREN { ... }
            | TOKEN                             { ... }
            ;

誰かが欠陥を見つけることができますか?バイソンが「または」適切な優先順位を与えていない理由がわかりません。

4

3 に答える 3

4

バイソンドキュメントから:

演算子の優先順位は、宣言の行の順序によって決まります。宣言の行番号が大きいほど(ページまたは画面の低い位置)、優先順位が高くなります。

したがって、あなたの場合、ORは画面上で低く、優先順位が高くなります。順序をに変更します

%left OR
%left AND

(私はそれをテストしていませんが)

于 2009-06-25T22:06:18.540 に答える
1

Cっぽい言語からのこのスニペットのように、プロダクションを分割してみませんか

logical_AND_expression:
    inclusive_OR_expression
    | logical_AND_expression ANDAND inclusive_OR_expression
            {$$ = N2(__logand__, $1, $3);}
    ;

logical_OR_expression:
    logical_AND_expression
    | logical_OR_expression OROR logical_AND_expression
            {$$ = N2(__logor__, $1, $3);}
    ;
于 2009-06-26T06:20:31.493 に答える
1

私は自分の実装でテストを実行しましたが、私のテストから、marcinの答えは正しいです。優先順位を次のように定義すると、次のようになります。

%left OR
%left AND

次に、式A&B | C&Dは((A&B)|(C&D))に還元されます。

優先順位を次のように定義すると、次のようになります。

%left AND
%left OR

次に、式A&B | C&Dは((A&(B | C))&D)に還元されます。

差別化する表現の1つは次のとおりです。

true & true | true & false

前者の優先順位の定義はこれをtrueとしてレンダリングしますが、後者はfalseとしてレンダリングします。私は両方のシナリオをテストし、両方とも説明どおりに機能します。

テストを再確認して確認してください。また、優先順位を定義するのはヘッダー部分の%left、%rightなどの定義の順序であり、ルール自体を定義する順序ではないことに注意してください。それでも機能しない場合は、コード内の他の領域が混乱している可能性があります。または、バイソンのバージョンが異なる可能性があります(この時点で暗闇の中で撮影しているだけです)。

于 2009-06-29T19:04:55.987 に答える