LL和LR解析之间的区别

问题描述

当前正在研究上下文无关文法及其解析方法。据我了解,上下文无关的语法可以通过自上而下/ LL或自下而上/ LR进行解析。 是否正确理解,LL解析器要求语法在解析之前就具有严格明确的生产规则?另一方面,LR解析器也要求语法必须明确,但是不必重写任何歧义的生产规则,而是可以在生产规则中添加其他优先规则以解决它们的歧义?但是,未来如何适应所有这些?

解决方法

据我了解,上下文无关的语法可以通过自上而下/ LL或自下而上/ LR进行解析。

是的,LL解析自上而下进行。 LR解析通常被认为是一种自下而上的解析方法,尽管一些作者认为它是自上而下和自下而上的混合,因为它使用了有关生成的解析树中出现位置的上下文。

是否正确理解,LL解析器要求语法在解析之前必须具有严格明确的生产规则?

LL解析器仅适用于明确的语法。 LL解析器的最常见类(LL(1),LL(*))不适用于所有语法,并且除了语法是明确的以外,还需要一些其他限制。例如,LL(1)解析器无法处理左递归。

另一方面,LR解析器也要求语法必须明确,但是不必重写任何歧义的生产规则,而是可以在生产规则中添加其他优先规则以解决其歧义?

是的,不是。的确,就像LL解析器一样,最常见的LR解析器类型(LR(0),SLR(1),LALR(1),LR(1),IELR(1))要求语法是明确的。您是正确的,许多歧义都可以通过优先声明来解决,这些优先声明会先tiebreak否则生成歧义的语法,但这不能解决所有歧义。此外,还有一些明确的语法无法被任何LR(k)解析器解析。

但是未来如何适应所有这些?

在LL或LR解析器中添加前瞻性为解析器提供了更多上下文,可用来确定要应用哪些生产规则(对于LL解析器)还是要转移或减少(LR解析器)。直观地,能够深入了解令牌序列使解析器可以排除一些无法使用的选项,因为它们无法匹配接下来的选项。这种超前工作的具体规则取决于解析算法。例如,LR(2) parsers有一些细微差别不会出现在LR(1)解析器中。通过专门阅读LL(1)解析,LR(0)解析和LR(1)解析,您可能会找到所需的信息,并将其用作启动点。