一、实验内容
以LR(1)为代表的LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法,具体包括LR(0),LR(1),SLR(1),LALR(1)四类。不同于自上而下的LL(1)分析法,LR(K)分析过程基本有三大步:写出自动机(即 LR(0)或 LR(1)项集族,后面都称作自动机) -> 构造文法分析表-> 进行文法分析过程。第一步中的自动机有两种: LR(0)自动机和 LR(1)自动机。LR(0) 和 SLR文法分析用的是 LR(0)自动机,LR(1)和 LALR文法分析用的是 LR(1)自动机。而LR(1)自动机构造方法和LR(0)自动机的构造方法相同,只是多增加了向前搜索符号。
- 已知本次实验考虑文法如下:
(1)E->E+T
(2)E->E—T
(3)E->T
(4)T->T*F
(5)T->T/F
(6)T->F
(7)F->(E)
(8)F->i
- 首先拓广文法,加入(0)S->E
- 然后需要构造 LR(1)自动机,就是加入了一个圆点,圆点后的符号是即将处理的符号,如果圆点后是非终结符时,则要写出该终结符为产生式左部的所有产生式。反复以上过程,直到不再扩大。给它们编号并写出读入下一个符号(即圆点后的符号)会跳转到哪。LR(1)分析中的特色之一是考虑“展望符”,即当前状态可能遇到的下一个输入符号。这个符号将影响分析器的动作决策,特别是对于归约动作至关重要。确定的项目集、LR(1)自动机及LR(1)分析表分别如下图所示。
其中:为优化分析表的构建,使用LALR(1)实现对LR(1)文法的合理简化,既保留了强大的语法分析能力,又显著减少了状态数量和解析表的复杂性。具体来说,LALR(1)通过合并产生相同核心(即项集的第一分量)但搜索符不同的项集,减少了状态数量。
状态 |
ACTION |
GOTO |
|||||||||
+ |
- |
* |
/ |
( |
) |
i |
# |
E |
T |
F |
|
0 |
S4 |
S5 |
1 |
2 |
3 |
||||||
1 |
S6 |
S7 |
acc |