假设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不包含那些?
答案 0 :(得分:2)
这是因为闭包和goto算法的工作原理。因为当你在I6上使用GOTO(T)创建I9时,点在任何T上向右移动一步并将它们添加到新的集合中。这套是I9 GOTO套装。那些在I6中没有点到右边的那些T将不会被添加到I9 GOTO集中。完成GOTO后,你得到I9
E->E+T.
T->T.*F
当你在第I9组上应用闭包时,你会扩展点右边的每个非终结符号。在I9上,你的点右边没有非终端,所以没有任何东西可以扩展。
我最近发了一篇关于非常类似的帖子,虽然这个问题有点复杂但如果你需要进一步澄清可能会有所帮助,Computing LR1 closure