LL(1)语法悬挂其他

时间:2012-04-13 23:19:23

标签: compiler-construction dangling-else

在编译器构造中,主要的模糊问题之一是悬空其他。 正如Aho,Lam,Sethi和Ullman编写的“编译器:原理,技术和工具”中所提到的,悬挂其他的语法不能与LL(1)解析器一起使用。

它是否真的无法处理为LL(1)?

1 个答案:

答案 0 :(得分:4)

它是真的,它不能被LL(k)或LALR(k)以纯粹的形式解析。问题在于悬挂其他物有两种可能的解释;它是一个歧义问题(“else”属于最近的“if”,或者不属于)。

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

许多解析器生成器可以“偶然”获得此功能; LL的解决方案是接受第一个有效的解析,并首先尝试“另外附加到最近”。 LR的解决方案是“转向其他”,这很容易引起,只需在“减少”操作之前检查“转移”动作。

它只会成为一个解析器的问题,它会真正选择模糊的解析,例如GLR。这里可以提供额外的语法提示,例如“转移到其他地方”。