我不知道这是否是问这个问题的正确网站。但我们正在研究语法的歧义。包括最左推导和最右推导。我的练习题是这样的:
E -> E * E | E + E | N
N -> 0N | 1N |
Output: 0110 + 110 * 01111
有没有办法让它模棱两可?以及使语法模棱两可的任何提示?
我不知道这是否是问这个问题的正确网站。但我们正在研究语法的歧义。包括最左推导和最右推导。我的练习题是这样的:
E -> E * E | E + E | N
N -> 0N | 1N |
Output: 0110 + 110 * 01111
有没有办法让它模棱两可?以及使语法模棱两可的任何提示?
鉴于您的语法,这显然是模棱两可的。在这里,它没有定义+
and*
运算符之间的偏好。
正如您所说,如果您必须解析0110 + 110 * 01111
它,可以使用两种方式完成:-
0110 + 110 * 01111 ----> (0110 + 110) * 01111
0110 + 110 * 01111 ----> 0110 + (110 * 01111)
所以,这个语法很模糊,因为它没有定义运算符优先级。此外,没有提供运算符关联性。
它显然依赖于语法指定的产生式规则,通过指定冲突案例之间的区别来消除歧义。在进行自上而下的解析时,有些事情是左分解和左递归导致语法不明确。
您应该看到消除了左递归和其他相关教程,因为它太宽泛而无法指定规则。