3

在编译器构造中,主要的歧义问题之一是悬空 else。正如 Aho、Lam、Sethi 和 Ullman 在编译器:原理、技术和工具一书中所提到的,悬空 else 的语法不能与 LL(1) 解析器一起使用。

真的不能处理为LL(1)吗?

4

1 回答 1

4

没错,它不能被 LL(k) 或 LALR(k) 以纯粹的形式解析。问题是悬空的 else 有两种可能的解释;这是一个模棱两可的问题(“else”属于最近的“if”,或者不属于)。

它通常通过坚持两种解释中的一种来治愈,例如,“else 属于最近的 if”。

许多解析器生成器可以“偶然”得到这个;LL 的解决方案是接受第一个有效的解析并首先尝试“其他附加到最近”。LR 的解决方案是“shift on else”,这很容易导致,只需在“reduce”操作之前检查“shift”操作。

它只会成为真正会提取模棱两可解析的解析器的问题,例如 GLR。在这里可以提供额外的语法提示,例如“shift on else”。

于 2012-04-13T23:32:47.587 回答