我目前正在尝试实现“编译器原理技术和工具”(也称为“龙书”)中所述的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 . , $ |<-----+
            +---------------+

我对实现算法以生成 Action 表感到困惑!
我的算法计算以下输出:
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?

如果没有足够清楚地描述任何内容,请提出要求,我将尽力更好地解释它!
谢谢你的帮助!

最佳答案

下一个状态归因于类次输入,但归约输入表示生产。

转移时,将状态引用压入堆栈,然后进入下一个状态。

当减少时,这是针对特定生产的。生产负责将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减少。

10-01 06:11
查看更多