【问题标题】:Unambigous grammar to ambiguous明确的语法到歧义
【发布时间】: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


    【解决方案1】:

    鉴于您的语法,这显然是模棱两可的。在这里,它没有定义 +* 运算符之间的偏好。

    如你所说,如果你必须解析这个0110 + 110 * 01111,可以通过两种方式完成:-

    1. 0110 + 110 * 01111 ----> (0110 + 110) * 01111

    2. 0110 + 110 * 01111 ----> 0110 + (110 * 01111)

    所以,这个语法很模糊,因为它没有定义运算符优先级。此外,没有提供运算符关联性。

    通过指定冲突案例之间的区别来消除歧义显然取决于语法指定的产生式规则。在进行自上而下的解析时,有些事情是左分解和左递归导致语法不明确。

    您应该看到elimination of left recursion 和其他相关教程,因为它太宽泛而无法指定规则。

    【讨论】:

    • 使用这个语法没问题E -> E * E | E + E | 0E | 1E,因为我想把它放在一行中。或者有可能做到一行?
    • 不,您需要使用其他非终端 E' 消除歧义,例如 E-> E';,然后尝试解决。
    • 那么,单行语法是不可能的?
    • 没错,您需要通过添加新的非终结符来消除歧义。只需浏览不明确语法的链接即可。
    • 难道E -> E + E 本身就是模棱两可的,因为它没有定义+ 的关联性吗?也就是说,a + b + c 可以被解析为(a + b) + ca + (b + c)。即使在“正常”算术中结果是相同的,例如,如果我们添加浮点数可能会有不同的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    相关资源
    最近更新 更多