假设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将不包含那些内容?
最佳答案
这是因为闭包和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