【发布时间】:2015-01-18 20:36:48
【问题描述】:
我不知道问这个问题是否合适。但我们正在研究语法的歧义。包括最左推导和最右推导。我的练习题是这样的:
E -> E * E | E + E | N
N -> 0N | 1N |
Output: 0110 + 110 * 01111
有没有办法让它变得模棱两可?以及使语法模棱两可的任何提示?
【问题讨论】:
标签: grammar context-free-grammar ambiguous-grammar
我不知道问这个问题是否合适。但我们正在研究语法的歧义。包括最左推导和最右推导。我的练习题是这样的:
E -> E * E | E + E | N
N -> 0N | 1N |
Output: 0110 + 110 * 01111
有没有办法让它变得模棱两可?以及使语法模棱两可的任何提示?
【问题讨论】:
标签: grammar context-free-grammar ambiguous-grammar
鉴于您的语法,这显然是模棱两可的。在这里,它没有定义 + 和 * 运算符之间的偏好。
如你所说,如果你必须解析这个0110 + 110 * 01111,可以通过两种方式完成:-
0110 + 110 * 01111 ----> (0110 + 110) * 01111
0110 + 110 * 01111 ----> 0110 + (110 * 01111)
所以,这个语法很模糊,因为它没有定义运算符优先级。此外,没有提供运算符关联性。
通过指定冲突案例之间的区别来消除歧义显然取决于语法指定的产生式规则。在进行自上而下的解析时,有些事情是左分解和左递归导致语法不明确。
您应该看到elimination of left recursion 和其他相关教程,因为它太宽泛而无法指定规则。
【讨论】:
E -> E * E | E + E | 0E | 1E,因为我想把它放在一行中。或者有可能做到一行?
E-> E';,然后尝试解决。
E -> E + E 本身就是模棱两可的,因为它没有定义+ 的关联性吗?也就是说,a + b + c 可以被解析为(a + b) + c 或a + (b + c)。即使在“正常”算术中结果是相同的,例如,如果我们添加浮点数可能会有不同的结果。