我正在尝试实现LALR解析器生成器,如“编译器原理技术和工具”(也称为“龙书”)中所述。
很多已经有效。解析器生成器当前能够生成完整的转到图。
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 . , $ |<-----+
+---------------+
我有实现算法的trubbles来生成actions-table! 我的算法计算以下输出:
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图?
如果有任何描述不够清楚,请询问,我会尝试更好地解释它! 谢谢你的帮助!
答案 0 :(得分:4)
转换条目由下一个状态归因,但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。
答案 1 :(得分:1)
你需要弹出堆栈并从那里找到下一个状态。
答案 2 :(得分:0)
rx表示:使用数字x减少使用生产! 然后一切都清楚了! 简单地弹出生产体并将头部移回顶部!