Parsing 如何识别语法是否为LR(n)、LL(n)

Parsing 如何识别语法是否为LR(n)、LL(n),parsing,grammar,ll,lr,Parsing,Grammar,Ll,Lr,对于一种不是LL(1)或LR(1)的语言,我们如何尝试找出某个数字n是否存在,从而语法可以是LL(n)或LR(n) 通过查看LR(0)项的规范集合,可以检查语法是否为LR(0)。然后,假设它不是LR(0),您可以通过引入先行符号来检查它是否是LR(1)。我的简单推理告诉我,要检查它是否为LR(2),您可能必须使前瞻包含接下来的两个符号,而不是一个。对于LR(3)您必须考虑三个符号等 即使是这种情况,尽管我对此表示怀疑,但我仍在努力思考,如果不从任意LR(m)向上递增检查,如何尝试识别(甚至得到提

对于一种不是
LL(1)
LR(1)
的语言,我们如何尝试找出某个数字
n
是否存在,从而语法可以是
LL(n)
LR(n)

通过查看
LR(0)
项的规范集合,可以检查语法是否为
LR(0)
。然后,假设它不是
LR(0)
,您可以通过引入先行符号来检查它是否是
LR(1)
。我的简单推理告诉我,要检查它是否为
LR(2)
,您可能必须使前瞻包含接下来的两个符号,而不是一个。对于
LR(3)
您必须考虑三个符号等

即使是这种情况,尽管我对此表示怀疑,但我仍在努力思考,如果不从任意
LR(m)
向上递增检查,如何尝试识别(甚至得到提示)一个
n
,或其不存在,特定语法可以是
LR(n)
和/或
LL(n)

  • 如果一种语言对于某些k>1的语言是LR(k),那么它就是LR(1)。(当然,对于语法来说不是这样。)也就是说,如果你有一种语言的LR(k)语法,那么你可以机械地构造一个LR(1)语法,它允许你恢复原始的解析树。对于LL(k),情况并非如此;LL(k)语言是LL(k+1)语言的严格子集

  • 您提出的测试确实可以让您决定对于某些给定的k(或LL(k))语法是否为LR(k)。不幸的是,除了您建议的连续搜索之外,没有办法计算出k的最小可能值,也不能保证搜索将永远终止

  • 虽然这个问题在一般情况下很难(或不可能)解决,但通常可以通过考虑表现出冲突的语法状态的可能有效继承者来解决特定语法的问题

  • 在大多数现实世界的语法中,只有少数冲突,因此手动检查冲突状态是可能的。一般来说,我们需要找出导致冲突状态的路径,以及可能的延续。在许多情况下,解析冲突显然可以通过稍微提前一点来解决

    这将失败的一大类语法是一组模棱两可的语法。对于任何k,歧义语法都不能是LR(k)(或LL(k))。同样,语法是否含糊不清的问题是不可判定的,但存在有效的启发式方法,其中一些已包含在商业产品中

    同样,在现实世界的语法中,通过视觉检查(如上所述)或将大量有效文本输入GLR解析器(如bison生成的解析器)直到报告歧义,通常很容易发现歧义。(或者,您可以使用直接算法从语法中枚举有效文本,并查看文本是否在枚举中出现两次。)

    下面是几个可能相关的问题,以说明分析技术。我相信还有更多

  • 如果一种语言对于某些k>1的语言是LR(k),那么它就是LR(1)。(当然,对于语法来说不是这样。)也就是说,如果你有一种语言的LR(k)语法,那么你可以机械地构造一个LR(1)语法,它允许你恢复原始的解析树。对于LL(k),情况并非如此;LL(k)语言是LL(k+1)语言的严格子集

  • 您提出的测试确实可以让您决定对于某些给定的k(或LL(k))语法是否为LR(k)。不幸的是,除了您建议的连续搜索之外,没有办法计算出k的最小可能值,也不能保证搜索将永远终止

  • 虽然这个问题在一般情况下很难(或不可能)解决,但通常可以通过考虑表现出冲突的语法状态的可能有效继承者来解决特定语法的问题

  • 在大多数现实世界的语法中,只有少数冲突,因此手动检查冲突状态是可能的。一般来说,我们需要找出导致冲突状态的路径,以及可能的延续。在许多情况下,解析冲突显然可以通过稍微提前一点来解决

    这将失败的一大类语法是一组模棱两可的语法。对于任何k,歧义语法都不能是LR(k)(或LL(k))。同样,语法是否含糊不清的问题是不可判定的,但存在有效的启发式方法,其中一些已包含在商业产品中

    同样,在现实世界的语法中,通过视觉检查(如上所述)或将大量有效文本输入GLR解析器(如bison生成的解析器)直到报告歧义,通常很容易发现歧义。(或者,您可以使用直接算法从语法中枚举有效文本,并查看文本是否在枚举中出现两次。)

    下面是几个可能相关的问题,以说明分析技术。我相信还有更多


    你能详细说明一下第三点吗?人们应该在继任者身上寻找哪些特征?另外,对于LL语法可以做些什么呢?如果我测试一个语法,发现它不是LR(1)、LR(2)、LR(3)(…),那么在某个时候,我应该开始寻找一些特定的特征,这些特征可以帮助建立这样一个案例,即这个语法可能根本不是LR。这些特征是否存在?如果存在,它们会是什么样子?如果这是可能的,那么类似的事情对LL案件是否可行?@Eternal_Light:我试图回答你的问题,但我担心这仍然不够具体。在SO中有许多非LR(1)语法的例子,其中大多数都有一个问题“我如何解决这个冲突”和q