(首先,这不是HW,我有所有答案)
我有一个简单的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 )
,为什么在解析树中最“正确”和“更高”?
我认为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')))))
')' ))))
答案 0 :(得分:1)
给出的BNF语法似乎与解析树一致,并且与声称“和”应该是左关联的说法一致。如果你想用这个语法产生“a和b和c”,从“Clause”开始,你就是这样开始的:
此时,短语不能成为“b和c”(没有括号),因为只有子句才能产生“和”。短语必须发展成“c”,第二行的条款可以变成“a和b”。这将迫使解析树中最右边的“和”更高。
由于解析树中的较高元素是最后要评估的,因此这与操作符“和”保持关联的说法是一致的。