Parsing 自顶向下分析中的左递归问题

Parsing 自顶向下分析中的左递归问题,parsing,programming-languages,grammar,Parsing,Programming Languages,Grammar,为了更好地理解自顶向下和自底向上解析之间的区别,有人能解释一下自顶向下解析器中与左递归相关的问题吗?在自顶向下解析器中,解析器从开始符号开始,并尝试猜测应用哪些产品来到达输入字符串。为此,自上而下的解析器需要使用来自输入字符串的上下文线索来指导其猜测 大多数自顶向下的解析器都是定向解析器,当试图确定要猜测的产品时,它们会以某种方向(通常是从左到右)扫描输入。LL(k)系列解析器就是一个例子——这些解析器使用关于输入的下k个符号的信息来确定要使用的产品 通常,解析器使用接下来的几个输入标记,通过查

为了更好地理解自顶向下和自底向上解析之间的区别,有人能解释一下自顶向下解析器中与左递归相关的问题吗?

在自顶向下解析器中,解析器从开始符号开始,并尝试猜测应用哪些产品来到达输入字符串。为此,自上而下的解析器需要使用来自输入字符串的上下文线索来指导其猜测

大多数自顶向下的解析器都是定向解析器,当试图确定要猜测的产品时,它们会以某种方向(通常是从左到右)扫描输入。LL(k)系列解析器就是一个例子——这些解析器使用关于输入的下k个符号的信息来确定要使用的产品

通常,解析器使用接下来的几个输入标记,通过查看哪些产品最终会导致以即将到来的标记开头的字符串来猜测产品。例如,如果您有生产

A→ 卑诗省

除非下一个要匹配的角色是b,否则您不会选择使用此产品。否则,您将保证存在不匹配。类似地,如果下一个输入字符是b,则可能需要选择此产品

那么左递归从何而来?好吧,假设你有这两个产品:

A→ Ab | b

此语法生成字符b的一个或多个副本的所有字符串。如果您在输入中看到一个b作为下一个字符,您应该选择哪个产品?如果你选择Ab,那么你假设前面有多个b,即使你不确定情况是否如此。如果你选择b,你假设只有一个b在你前面,这可能是错误的。换句话说,如果你必须从两部作品中选择一部,你就不能总是正确地选择

左递归的问题是,如果您有一个左递归的非终结符,并且找到一个可能与之匹配的字符串,那么您不一定知道是使用该递归生成较长的字符串,还是避免该递归生成较短的字符串。大多数自上而下的解析器要么因为这个原因无法工作(他们会报告如何继续并拒绝解析存在一些不确定性),要么可能会使用额外的内存来跟踪每个可能的分支,耗尽空间

简而言之,自上而下的解析器通常试图从有关字符串的有限信息中猜出该做什么。因此,他们会被左递归弄糊涂,因为他们不能总是准确地预测要使用哪些产品

希望这有帮助

原因

1) 左递归(直接/间接)的语法不能转换为{Greibach范式(GNF)}*,因此可以将左递归消除为右递归格式

2) 左递归文法也是nit LL(1),所以再次消除左递归可能会产生LL(1)文法

GNF 形式A->aV的语法是格雷巴赫范式