在编译器构造中,主要的歧义问题之一是悬空 else。正如 Aho、Lam、Sethi 和 Ullman 在编译器:原理、技术和工具一书中所提到的,悬空 else 的语法不能与 LL(1) 解析器一起使用。
真的不能处理为LL(1)吗?
在编译器构造中,主要的歧义问题之一是悬空 else。正如 Aho、Lam、Sethi 和 Ullman 在编译器:原理、技术和工具一书中所提到的,悬空 else 的语法不能与 LL(1) 解析器一起使用。
真的不能处理为LL(1)吗?
没错,它不能被 LL(k) 或 LALR(k) 以纯粹的形式解析。问题是悬空的 else 有两种可能的解释;这是一个模棱两可的问题(“else”属于最近的“if”,或者不属于)。
它通常通过坚持两种解释中的一种来治愈,例如,“else 属于最近的 if”。
许多解析器生成器可以“偶然”得到这个;LL 的解决方案是接受第一个有效的解析并首先尝试“其他附加到最近”。LR 的解决方案是“shift on else”,这很容易导致,只需在“reduce”操作之前检查“shift”操作。
它只会成为真正会提取模棱两可解析的解析器的问题,例如 GLR。在这里可以提供额外的语法提示,例如“shift on else”。