假设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->.FF->.(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

09-13 06:52