gpt4 book ai didi

parsing - LALR解析器生成器实现问题

转载 作者:行者123 更新时间:2023-12-04 19:21:09 25 4
gpt4 key购买 nike

我目前正在尝试实现一个 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?

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

最佳答案

shift 条目由下一个状态归因,但 reduce 条目表示生产。

当你转移时,你将一个状态引用插入你的堆栈并继续到下一个状态。

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

关于parsing - LALR解析器生成器实现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3391117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com