parsing - 如何使用 Warshall 的传递闭包算法来确定规范的 LR(1) 解析器闭包?

标签 parsing lr floyd-warshall transitive-closure

我正在尝试实现 Warshall 算法来快速计算 LR(1) 闭包。

我想我明白 LR(0) 是如何工作的:

  • 图的节点为LR items , 喜欢 A → B • C
  • 边缘是从 A → B • C 开始的“过渡”至 C → • D

  • 问题是,LR(1) 需要计算前瞻,我不知道如何将它们合并到算法中。
    在我看来,即使我知道任何给定 LR 项的传递闭包,我仍然需要通过所有相同的计算来确定每个项的前瞻集是什么。

    甚至可以使用 Warshall 的算法来计算规范的 LR(1) 闭包,还是只能用于更受限制的情况(如 LR(0)、SLR(1) 等)?

    最佳答案

    我认为您不能为此使用 Warshall 的算法,因为每次添加新项目时,您可能都必须添加其他项目。这是一个迭代过程。有向图或连接矩阵会不断变化。我可能是错的。我使用迭代过程计算了 LR(1) 项集的闭包,同时保留了已包含在闭包集中的一组项。你可以下载我的LRSTAR Parser Generator并且您可能决定不需要编写自己的解析器生成器。注意:我使用 DeRemer 论文中的 Digraph 算法而不是 Warshall 算法来计算前瞻集。见 list of papers implemented in LRSTAR .

    关于parsing - 如何使用 Warshall 的传递闭包算法来确定规范的 LR(1) 解析器闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17002542/

    相关文章:

    javascript - 如何将 HTML 字符串转换成 HTML 文档?

    c# - 使用正确的时区和类型解析日期时间 c#

    c# - string.contains 和 string.replace 在一行代码中

    compiler-construction - 每个 LR(0) 文法都是 SLR(1) 但反之亦然不一定为真,为什么?

    algorithm - Floyd-Warshall 算法的最小重量循环

    algorithm - 允许最大步数的 Floyd Warshall 算法

    java - JSON VS 简单的字符串操作来解析 Android 中的 HttpRequest

    parsing - LR(0)、LL(0)、LALR(1)等之间的关系?

    parsing - 每个 LL(1) 文法也是 LR(0) 文法吗?

    python-3.x - 重建 2 个顶点之间的多条最短路径的路径