创建简单的LR解析器闭包项

2024-05-23 19:32:45 发布

您现在位置:Python中文网/ 问答频道 /正文

假设G(扩充语法):

E' - > E
E  - > E+T|T
T  - > T*F|F
F -  > (E)|id

所以在dfa的一个创造阶段,我已经达到了这一点:(龙书中的I6)

^{pr2}$

我想知道,为什么我们不在I9中添加T->.F和{}和{}?在

当我们在输入字符串中到达T时,我们应该添加T->;.F,现在我们已经到达了F,我们应该添加F->;(E)和F->;.id

为什么I9不包含这些?在


Tags: 字符串gtid语法阶段dfapr2i6
1条回答
网友
1楼 · 发布于 2024-05-23 19:32:45

这是因为闭包和goto算法是如何工作的。因为当你在I6上使用GOTO(T)创建I9时,点会在任何T上向右移动一步,并将其添加到新的集合中。这个集合就是I9 GOTO集合。那些在I6中的点右边没有T的将不会被添加到I9 GOTO集合中。在完成了GOTO之后,你就可以开始了

E->E+T.
T->T.*F

在集合I9上应用闭包时,展开点右侧的每个非终结点。在I9上,点的右边没有非终端,所以没有什么可以扩展的。在

我最近发了一篇关于一个非常相似但有点复杂的问题的帖子,如果你需要更多的说明,这个问题可能会有帮助,Computing LR1 closure

相关问题 更多 >