为什么这个 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))
取决于如何处理运算符的优先级。
如果你显式地画出最左边和最右边的归约,从而推导出解析树,它会更清楚。这通常是学生在这样的考试问题中为了获得满分而应该做的事情。因此,我将把它留作修订练习。
最近正在备考,翻阅过往试卷,遇到这道题。
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))
取决于如何处理运算符的优先级。
如果你显式地画出最左边和最右边的归约,从而推导出解析树,它会更清楚。这通常是学生在这样的考试问题中为了获得满分而应该做的事情。因此,我将把它留作修订练习。