创建简单的 LR 解析器闭包项
假设 G(增强语法):
E' - > E
E - > E+T|T
T - > T*F|F
F - > (E)|id
所以在 dfa 的创建级别之一中,我已经达到了这一点:(龙书中的 I6)
I6 I9
--------- ---------
|E -> E+.T| | E->E+T. |
|T -> .T*F| T | T->T.*F |
|T -> .F | -----> ---------
|F -> .(E)|
|F -> .id |
---------
我想知道,为什么我们不添加 T->; .F
和 F->.(E)
和 F->.id
到 I9 ?
当我们在输入字符串中达到 T 时,我们应该添加 T->.F,现在我们已经到达 F,我们应该添加 F->.(E) 和 F->.id。
为什么 I9 不包含这些?
Suppose The G (augmented Grammar):
E' - > E
E - > E+T|T
T - > T*F|F
F - > (E)|id
So in one of the levels of creation of the dfa , I had reached to this :(I6 in dragon book)
I6 I9
--------- ---------
|E -> E+.T| | E->E+T. |
|T -> .T*F| T | T->T.*F |
|T -> .F | -----> ---------
|F -> .(E)|
|F -> .id |
---------
I am wondering , why we don't add the T->.F
and F->.(E)
and F->.id
to I9 ?
When We Reach T in input string , we should Add T->.F and Now we have reached to F and we should Add F->.(E) and F->.id.
Why I9 won't contains those ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是因为闭包和 goto 算法的工作原理。因为当您在 I6 上使用 GOTO(T) 创建 I9 时,点在任何 T 上向右移动一步并将其添加到新集合中。该组就是 I9 GOTO 组。 I6 中点右侧没有 T 的那些将不会添加到 I9 GOTO 集中。执行完 GOTO 后,您将得到集合 I9
当您在集合 I9 上应用闭包时,您将展开点右侧的每个非终结符。在 I9 上,点右侧没有非终结符,因此无需扩展。
我最近发表了一篇关于一个非常相似但更复杂的问题的文章,如果您需要额外的说明,可能会有所帮助,计算 LR1 闭包
It's because of the how the closure and goto algorithms works. Since when you create I9 by using GOTO(T) on I6 the dot moves one step to the right over any T and add those to a new set. This set is then the I9 GOTO set. Those that do not have a T to the right of the dot in I6 will not get added to the I9 GOTO set. After doing the GOTO you get set I9
When you apply closure on set I9 you expand every nonterminal on the right of the dot. On I9 you have no non-terminals to the right of the dot so there is nothing to expand.
I recently made a post about a very similar albeit a bit more complex problem that might be of help if you need additional clarification, Computing LR1 closure