1

(まず第一に、これはハードウェアではありません。私はすべての答えを持っています)

私は単純な BNF 文法を持っています

<UNIT> ::= ( <CLAUSE> ) | a | b | c
<ITEM> ::= not <UNIT> | <UNIT>
<CLAUSE> ::= <CLAUSE> and <PHRASE> | <PHRASE>
<PHRASE> ::= <ITEM> | <ITEM> or <PHRASE>

and演算子は左結合 (左再帰) or演算子は右結合 (今回は右再帰)

式 が与えられたときc and b or not a and ( not b or c )、解析ツリーで一番右の「and」が上位にあるのはなぜですか?
ちなみに、c **and** b or not a and ( not b or c )一番左が解析ツリーの上位にあるはずです。

私たちの教授はこの答えを提供しました:

Lispy 表記の解析ツリーを次に示します。

(clause (clause (clause (phrase (item (unit 'c'))))
'and'
(phrase (item (unit 'b'))
'or'
(phrase (item 'not'
(unit 'a')))))
**'and'** // is higher in parse tree
(phrase (item (unit '('
(clause (phrase (item 'not’(unit 'b'))
'or'
(phrase (item (unit 'c')))))
')' ))))
4

1 に答える 1

1

与えられたBNF文法は、構文解析ツリーと一致しているようであり、「and」は左結合であると想定されているという主張と一致しています。この文法を使用して「節」から始めて「aとbとc」を生成する場合は、次のように開始します。

  1. フレーズ

この時点では、句のみが「and」を生成できるため、Phraseは「bおよびc」(括弧なし)になることはできません。フレーズは「c」に発展する必要があり、2行目の句は「aとb」になる可能性があります。これにより、右端の「and」が解析ツリーの上位になります。

解析ツリーの上位要素が最後に評価されるため、これは、演算子「and」が結合性のままであるという主張と一致しています。

于 2010-11-02T18:19:55.870 に答える