【问题标题】:LALR Parser Generator Implementation ProblemLALR 解析器生成器实现问题
【发布时间】:2010-08-02 19:32:42
【问题描述】:

我目前正在尝试实现一个 LALR 解析器生成器,如“编译器原理技术和工具”(也称为“龙书”)中所述。

很多已经奏效了。解析器生成器目前能够生成完整的 goto-graph。

Example Grammar:
                   S' --> S
                   S  --> C C
                   C  --> c C
                   C  --> d

Nonterminals: S', S, C
Terminals: c, d
Start: S'

转到图:

I[0]---------------+      I[1]-------------+
| S' --> . S   , $ |--S-->| S' --> S . , $ |
| S  --> . C C , $ |      +----------------+
| C  --> . c C , c |
| C  --> . c C , d |      I[2]--------------+
| C  --> . d   , c |      | S --> C . C , $ |      I[3]--------------+
| C  --> . d   , d |--C-->| C --> . c C , $ |--C-->| S --> C C . , $ |
+------------------+      | C --> . d   , $ |      +-----------------+
   |  |                   +-----------------+
   |  |           +--c--+   |      |
   |  |           |     |   c      |
   |  |           |     v   v      |
   |  |     I[4]--------------+    |
   |  c     | C --> c . C , c |    |
   |  |     | C --> c . C , d |    |
   |  |     | C --> c . C , $ |    d
   |  |     | C --> . c C , c |    |
   |  +---->| C --> . c C , d |    |
   |        | C --> . c C , $ |    |
   d        | C --> . d   , c |--+ |
   |  +-----| C --> . d   , d |  | |
   |  |     | C --> . d   , $ |  | |
   |  |     +-----------------+  | |
   |  C                          | |
   |  |     I[6]--------------+  | |
   |  |     | C --> c C . , c |  d |
   |  +---->| C --> c C . , d |  | |
   |        | C --> c C . , $ |  | |
   |        +-----------------+  | |
   |                             | |
   |        I[5]------------+    | |
   |        | C --> d . , c |<---+ |
   +------->| C --> d . , d |      |
            | C --> d . , $ |<-----+
            +---------------+

我在实现生成动作表的算法时遇到了麻烦! 我的算法计算以下输出:

state |    action      
      |  c  |  d  |  $   
------------------------
    0 |  s4 |  s5 |
------------------------
    1 |     |     | acc
------------------------
    2 |  s4 |  s5 |
------------------------
    3 |     |     |  r?
------------------------
    4 |  s4 |  s5 |
------------------------
    5 |  r? |  r? |  r?
------------------------
    6 |  r? |  r? |  r?

sx... 转移到状态 x
rx... 归约到状态 x

r?意味着我不知道如何获取解析器应该减少的状态(?)。有谁知道一个算法得到?使用上面的 goto-graph?

如果有什么描述不够清楚,请询问,我会尽力解释得更好! 感谢您的帮助!

【问题讨论】:

    标签: parsing context-free-grammar parser-generator lalr


    【解决方案1】:

    轮班条目由下一个状态赋予,但减少条目表示生产。

    当你转换时,你将一个状态引用压入你的堆栈并进入下一个状态。

    当您减少时,这是针对特定生产的。产生式负责将 n 个状态转移到您的堆栈上,其中 n 是该产生式中的符号数。例如。一个代表 S',两个代表 S,两个或一个代表 C(即 C 的第一个或第二个备选方案)。

    从堆栈中弹出 n 个条目后,您将返回到开始处理该产品的状态。对于该状态和产生式产生的非终结符,您可以查找 goto 表以找到下一个状态,然后将其推送。

    因此,reduce 条目标识了一个产生式。事实上,知道生成的非终结符以及要弹出的符号数可能就足够了。

    因此你的表格应该是这样的

    state |    action       |  goto
          |  c  |  d  |  $  |  C  |  S   
    ------------------------------------
        0 |  s4 |  s5 |     |  2  |  1
    ------------------------------------
        1 |     |     | acc |     |
    ------------------------------------
        2 |  s4 |  s5 |     |  3  |
    ------------------------------------
        3 |     |     |  r0 |     |
    ------------------------------------
        4 |  s4 |  s5 |     |     |  6
    ------------------------------------
        5 |  r3 |  r3 |  r3 |     |
    ------------------------------------
        6 |  r2 |  r2 |  r2 |     |
    

    其中 rx 表示通过生产 x 减少。

    【讨论】:

      【解决方案2】:

      您需要弹出堆栈并从那里找到下一个状态。

      【讨论】:

      • 所以我不需要知道rx?只是我必须减少?书上说第一个 r 的值? = r1;接下来的三个 = r4;最后三个 = r2;如果你是对的,知道这意味着什么吗?
      【解决方案3】:

      rx 表示:使用数字 x 的产生式减少!
      然后一切都清楚了! 简单地弹出制作的主体并将头部移回顶部!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-23
        • 2020-08-21
        • 2012-11-04
        • 2023-03-14
        • 1970-01-01
        • 2010-10-28
        • 1970-01-01
        相关资源
        最近更新 更多