为什么这个 EBNF 文法有歧义?

Why is this EBNF grammar ambiguous?

最近正在备考,翻阅过往试卷,遇到这道题。

Below is a grammar in EBNF that describes simple arithmetic expressions, like 1 + 2 * 3 - 4:

Expression = Operand, {Operator, Operand}; 
Operand = "1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"; 
Operator = "+"|"-"|"*"|"/"; 

(iv) Using this grammar, there are multiple ways of evaluating an expression like 1 + 2 * 3 - 4. Describe two of them, and explain what this means about the grammar provided. [2 marks]

根据我的理解,歧义语法意味着存在不止一个最左派生或最右派生,这通常意味着语法的优先顺序存在一些歧义。但是这里没有先后顺序,递归是线性的。

建议?

你的问题已经有了部分答案。

是;您对歧义语法的定义几乎是正确的。如果执行语法的最左推导和最右推导,它们应该会产生相同的解析树。

是;当您认为这意味着语法优先顺序有问题时,您几乎是正确的,是的,该语法没有任何优先顺序。这就是问题所在:运算符都被赋予相同的优先级,因此不同的推导将导致评估示例的不同答案。

我们可以将 1 + 2 * 3 - 4 简化为:

(1+2) * (3-4)
1 + (2 * 3) - 4
1 + (2 * (3 - 4))

取决于如何处理运算符的优先级。

如果你显式地画出最左边和最右边的归约,从而推导出解析树,它会更清楚。这通常是学生在这样的考试问题中为了获得满分而应该做的事情。因此,我将把它留作修订练习。