创建简单的LR解析器关闭项目

时间:2012-02-05 12:34:53

标签: python parsing compiler-construction parser-generator

假设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不包含那些?

1 个答案:

答案 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