Compiler construction LL(1)悬挂其他对象的语法

Compiler construction LL(1)悬挂其他对象的语法,compiler-construction,dangling-else,Compiler Construction,Dangling Else,在编译器构造中,主要的歧义问题之一是挂起else。 正如Aho、Lam、Sethi和Ullman在《编译器:原理、技术和工具》一书中提到的那样,悬挂else的语法不能用于LL(1)解析器 它不能被处理为LL(1)是真的吗?是真的,它不能被LL(k)或LALR(k)以其纯形式解析。问题在于,对悬而未决的问题有两种可能的解释;这是一个模棱两可的问题(“else”属于最近的“if”,或不属于) 它通常通过坚持两种解释中的一种来治愈,例如,“else属于最近的if” 许多解析器生成器可以“意外地”得到正

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


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

是真的,它不能被LL(k)或LALR(k)以其纯形式解析。问题在于,对悬而未决的问题有两种可能的解释;这是一个模棱两可的问题(“else”属于最近的“if”,或不属于)

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

许多解析器生成器可以“意外地”得到正确的结果;LL的解决方案是接受第一个有效的解析,然后首先尝试“else attaches to nexist”。LR的解决方案是“转移到其他位置”,这很容易引起,只需在“减少”操作之前检查“转移”操作即可

它只会成为一个解析器的问题,该解析器将真正拾取不明确的解析,例如GLR。在这里,你可以提供额外的语法提示,例如,“转移到其他地方”