1

私は単純な言語パーサーを構築していますが、優先順位の低いプレフィックス式に問題があります。文法の例を次に示します。

E = E5
E5 = E4 'OR' E4 | E4
E4 = E3 'AND' E3 | E3
E3 = 'NOT' E3 | E2
E2 = E1 '==' E1 | E1
E1 = '(' E ')' | 'true' | 'false'

NOTただし、この文法は、より優先順位の高い中置演算子の RHS として使用される場合、つまり次のように正しく機能しません。

true == NOT false

これは、==オペレーターが RHS で E1 を要求しているためであり、これは NOT 操作ではありません。

この文法を表現する正しい方法がわかりませんか? この単純化された再帰的降下アプローチを使用してまだ可能ですか、それともより機能的なアルゴリズム (ヤードの迂回または先行登攀) に移行する必要がありますか?

4

3 に答える 3

1

次の入力と予想される解析が正しいと仮定します。

  1. テスト1
    • 入力:true == NOT false
    • 出力:(true == (NOT false))
  2. テスト 2
    • 入力:NOT true == false
    • 出力:(NOT (true == false))
  3. テスト 3
    • 入力:NOT true == NOT false
    • 出力:(NOT (true == (NOT false)))

トリックを行う(ANTLR4)文法は次のとおりです。

grammar Expr;

e : e5;
e5 : e4 'OR' e5 | e4;
e4 : e3 'AND' e4 | e3;
e3 : 'NOT' e3 | e2;
e2 : e1 '==' e3 | e1;
e1 : '(' e ')' | 'true' | 'false';

S : [ \t\r\n] -> skip;

作成された ANTLR を解析します。

1

ここに画像の説明を入力

2

ここに画像の説明を入力

3

ここに画像の説明を入力

于 2014-06-19T18:58:50.287 に答える
0

あなたの言語も (不必要に) あいまいです。これを修正することで、この問題も修正できます。

ここで、Dは「選言」、C連言、N否定、P一次、E等式の省略形です。

D = C | C 'OR'  D
C = N | N 'AND' C
N = E |   'NOT' N
E = P | P '=='  P
P = '(' E ')' | 'true' | 'false'
于 2014-06-18T11:04:53.750 に答える
-2

たぶん、ポーランド語表記を使用しますか?

E = E5
E5 = 'OR' E4 E4 | E4
E4 = 'AND' E3 E3 | E3
E3 = 'NOT' E3 | E2
E2 = '==' E1 E1 | E1
E1 = '(' E ')' | 'true' | 'false'
于 2014-06-18T10:58:49.190 に答える