【问题标题】:How to identify whether a grammar is LR(n), LL(n)如何判断一个文法是LR(n), LL(n)
【发布时间】:2017-01-19 22:12:08
【问题描述】:

对于不是LL(1)LR(1) 的语言,如何尝试找出是否存在某个数字n 使得语法可以是LL(n)LR(n)

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

即使是这种情况,尽管我对此表示怀疑,但我仍在努力思考如何尝试识别(甚至暗示)n,或者它不存在,为此特定语法可以是LR(n) 和/或LL(n),而不需要从任意LR(m) 向上递增检查。

【问题讨论】:

    标签: parsing grammar ll lr


    【解决方案1】:
    1. 如果一个语言对于某些k>1来说是LR(k),那么它就是LR(1)。 (当然,对于文法来说,这不是真的。)也就是说,如果你有一个语言的 LR(k) 文法,那么你可以机械地构造一个 LR(1) 文法,它允许你恢复原始解析树。这不是 LL(k); LL(k) 语言是 LL(k+1) 语言的严格子集。

    2. 您提出的测试确实可以让您确定对于某些给定的 k(或 LL(k))。不幸的是,除了您建议的连续搜索之外,没有办法找出 k 的最小可能值,并且无法保证搜索将永远终止。

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

    在大多数现实世界的语法中,只有少数冲突,因此可以手动检查冲突状态。一般而言,需要弄清楚导致冲突状态的路径以及可能的延续。在许多情况下,很明显,解析冲突可以通过稍微多一点的前瞻来解决。

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

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

    这里有几个可能相关的 SO 问题说明了分析技术。我敢肯定还有更多。

    A yacc shift/reduce conflict on an unambiguous grammar

    Bison reduce/reduce situation

    yacc shift-reduce for ambiguous lambda syntax

    How to understand and fix conflicts in PLY

    【讨论】:

    • 您能否详细说明第 3 点?继任者应该寻找哪些特征?另外,关于 LL 语法可以做些什么?
    • 如果我测试一个语法并发现它不是 LR(1) , LR(2) , LR(3) (...) , 在某个时候我应该开始寻找特定的特征这可以帮助建立一个案例,即这个语法可能根本不是 LR。这些特征是否存在,如果存在,它们会是什么样子?如果可能的话,对于 LL 案例,类似的事情是否可行?
    • @Eternal_Light:我试图解决你的问题,但我担心它仍然相当不具体。 SO中有许多非LR(1)语法的例子,其中大部分都带有“如何解决这个冲突”的问题,其中不少已经在答案中进行了分析。我通常不会为 LL 冲突而烦恼,所以我帮不了你太多; LL 解析器需要无限前瞻更为常见,通常的解决方案是切换到 LR 解析器。
    • 非常感谢您的回答。我发现它的洞察力非常有价值。最后一个问题希望你能回答:一个语法是否可以明确但仍然不是 LR,或者我可以从它的明确性中安全地推断出它的 LR 性吗?
    • 对于任何 k,语法可以是明确的,并且不是 LR(k)。最简单的例子是回文语言,每个字母符号 a 的产生式 S -> aS -> a S a,加上 S -> ε
    猜你喜欢
    • 2016-04-14
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多