0

例えば ​​:

waldo:=fern+alpha/-beta^gamma;

上記の算術式は、この BNF によって抽象化される場合があります (標準の BNF とは多少異なる場合がありますが、今は無視してください)。

AEXP = AS $AS ;

AS = .ID ':=' EX1 ';' ;

EX1 = EX2 $( '+' EX2 / '-' EX2 ) ;

EX2 = EX3 $( '*' EX3 / '/' EX3 ) ;

EX3 = EX4 $( '^' EX3 ) ;

EX4 = '+' EX5 / '-' EX5 / EX5 ;

EX5 = .ID / .NUMBER / '(' EX1 ')' ;

.END

しかし、EX1~EX5抽象化は私にはそれほど直感的ではありません.(そもそもどのように作られているのかよくわかりません)

このような式を正規化する際に従うべき手順はありますか?

4

1 に答える 1

1

この表記を EBNF に直接変換できます。

カテゴリ EX1 から EX5 までの命名は、演算子の優先順位を指定する珍しい方法ではありません。実際、特に C や C++ のように 15 以上の優先レベルを持つ一部の言語では、これは良いものです。:)

それらの名前を式、項、因子、一次などに変更できます (または意味のある用語)。

補遺

上記をより伝統的な EBNF に変換する必要がある場合は、次のようにします。

AEXP => AS+
AS   => id ':=' EX1 ';'
EX1  => EX2 (('+' | '-') EX2)*
EX2  => EX3 (('*' | '/') EX3)*
EX3  => EX4 ('^' EX3)*
EX4  => ('+'|'-')? EX5
EX5  => id | number | '(' EX1 ')'

'*' は 0 個以上、'+' は 1 個以上、'?' を使用します。オプション用。ここで演算子の優先順位がどのように処理されるかはかなりクールだと思います。

補遺2:

注意: EX3 のルールが間違っているようです。現状では、このような解析ツリーを取得できます

                  EX3
                   |
     +---+----+----+----+---------+
     |   |    |    |    |    |    |
    EX4  ^   EX3   ^   EX3   ^   EX3
            / | \               / | \
         EX4  ^  EX3         EX4  ^  EX3

だから書くa^b^c^d^e^fことは意味することができますa^(b^c)^d^(e^f)。しかし、実はこの木を作る方法は他にもあります。文法があいまいです。

^文法の設計者は、演算子を右結合にしたかったようです。しかし、そうするためには、ルールは

EX3 => EX4 ('^' EX3)?

これで、文法があいまいではなくなりました。a^b^c^d^e^fMUSTの導出がどのように進行するかを見てください。

          EX3
         / | \
      EX4  ^  EX3
             / | \
          EX4  ^  EX3
                 / | \
              EX4  ^  EX3
                     / | \
                  EX4  ^  EX3
                         / | \
                      EX4  ^  EX3

現在a^b^c^d^e^fは次のようにのみ解析できますa^(b^(c^(d^(e^f))))

別の方法は、ルールを次のように書き直して、EX3 => EX4 ('^' EX4)*「OBTW キャレットは右結合です」という副次的なルールを持たせることです。

于 2011-07-24T05:53:57.697 に答える