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

时间:2013-06-08 18:28:34

标签: parsing lr floyd-warshall transitive-closure

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

我理解它对LR(0)的作用:

  • 图表的节点为LR items,与A → B • C
  • 类似
  • 边缘是从A → B • CC → • D
  • 的“过渡”

问题是,LR(1)需要计算前瞻,我无法弄清楚如何将它们合并到算法中。
在我看来,即使我知道任何给定的LR项目的传递闭包我仍然 需要通过所有相同的计算只是为了找出前瞻为什么设置的每个项目都是。

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

1 个答案:

答案 0 :(得分:1)

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