如何使用 Warshall 的传递闭包算法来确定规范的 LR(1) 解析器闭包?
Posted
技术标签:
【中文标题】如何使用 Warshall 的传递闭包算法来确定规范的 LR(1) 解析器闭包?【英文标题】:How to use Warshall's algorithm for transitive closure to determine canonical LR(1) parser closures? 【发布时间】:2013-06-04 20:22:52 【问题描述】:我正在尝试实现 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) 等)?
【问题讨论】:
【参考方案1】:我认为您不能为此使用 Warshall 算法,因为每次添加新项目时,您可能都必须添加其他项目。这是一个迭代的过程。有向图或连接矩阵会不断变化。我可能错了。我使用迭代过程计算了 LR(1) 项集的闭包,同时保留了已包含在闭包集中的项数组。您可以下载我的LRSTAR Parser Generator,并且您可能会决定不需要编写自己的解析器生成器。注意:我使用 DeRemer 论文中的 Digraph 算法而不是 Warshall 算法来计算前瞻集。请参阅list of papers implemented in LRSTAR。
【讨论】:
+1 谢谢!实际上(很久以后)我最终没有使用任何特定的算法,因为我看的时间越长,我看到的潜在改进空间就越小。我最终制作了自己的 LR(k) 解析器生成器,尽管它非常痛苦! (它适用于每个 k,但根据语法,它可能会在 k 中成倍增长。)以上是关于如何使用 Warshall 的传递闭包算法来确定规范的 LR(1) 解析器闭包?的主要内容,如果未能解决你的问题,请参考以下文章