この表記を 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^f
MUSTの導出がどのように進行するかを見てください。
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 キャレットは右結合です」という副次的なルールを持たせることです。