【问题标题】:Creation Of Simple LR Parser Closure items创建简单的 LR 解析器闭包项
【发布时间】:2012-02-05 12:34:52
【问题描述】:

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

【问题讨论】:

    标签: python parsing compiler-construction parser-generator


    【解决方案1】:

    这是因为闭包和 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-23
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 2012-04-15
      • 2021-02-02
      相关资源
      最近更新 更多