【编译原理】轻松学会LR(0)、SLR(1)、LR(1)、LALR(1)

Content

  1. LR完整分析过程
  2. 画LR(0)项目 + 填LR(0)分析表
  3. 画SLR(1)项目 + 填SLR(1)分析表
  4. 画LR(1)项目 + 填LR(1)分析表
  5. 画LALR(1)项目 + 填LALR(1)分析表

 
 
 
 

LR分析过程

已知文法生成式(已标号)

1E → E + T
2E → T
3T → T * F
4T → F
5F → ( E )
6F → I

已知LR分析表(根据项目图+已标号文法写出来的)

在这里插入图片描述
 
完整分析过程

状态栈操作
0#i*i+i#s5
05#i*i+i#r6
03#F*i+I#r4
02#Ti+i#s7
027#T*i+i#s5
0275#T*i+i#r6
027 10#T*F+i#r3
02#T+i#r2
01#E+i#s6
016#E+i#s5
0165#E+i#r6
0163#E+F#r4
0169#E+T#r1
01#E#Accept

 
 
 
 

画LR(0)项目

方法:

  1. 先添加一个 S ‘ → S S‘ → S SS
  2. 不断进行状态转移并求closure闭包

已知文法,画出这个文法的所有LR(0)项目?

E → a A E → aA EaA
E → b B E → bB EbB
A → c A A → cA AcA
A → d A → d Ad
B → c B B → cB BcB
B → d B → d Bd

在这里插入图片描述

 
 

填LR(0)分析表

方法:

  1. 先对文法进行标号
  2. 根据LR(0)项目图画出LR(0)分析表
0S‘ → E
1E → aA
2E → bB
3A → cA
4A → d
5B → cB
6B → d
abcd#EAB
0s2s31
1Accept
2s4s106
3s5s117
4s4s108
5s5s119
6r1r1r1r1r1
7r2r2r2r2r2
8r3r3r3r3r3
9r5r5r5r5r5
10r4r4r4r4r4
11r6r6r6r6r6

 
 
 
 

画SLR(1)项目

和LR(0)的画法项目集的方法完全一样

S ‘ → S S‘ → S SS
S → r D S → rD SrD
D → D ∗ i D → D*i DDi
D → i D → i Di

图略

画完之后你会发现一个问题: I 3 I3 I3集合为  S → r D ⋅ S → rD· SrD D → D ⋅ ∗ i D → D·*i DDi —— 在填分析表的时候会出现多重入口——出现了归约/移进冲突

这个冲突其实是有可能解决的,接着往下看
 
 

填SLR(1)分析表

在填SLR(1)分析表的时候,我们这样解决「归约/移进冲突」:
对于规约的那个式子,求其左侧VN的随符集Follow,只有在Follow中符号对应的地方才填r

 
上面例题的答案大概是下面的样子(可以验证下自己答案):

r*i#SD
0s21
1acc
2s43
3s5r1
4r3r3r3r3
5s6
6r2r2r2r2

 
 
 
 

画LR(1)项目

基本思路差不多与LR(0)和SLR(1)一致,(重点!!!)区别在于:
A → α ⋅ B β , a A→α·Bβ,a AαBβa  求闭包为:
B → ⋅ γ , b B→·γ,b Bγb  其中 b = First(βa)(也就是说,如果B后还有个β,b就为First(β);若B后什么都没有,b就把a继承下来)

S ‘ → S S‘ → S SS
S → B B S → BB SBB
B → a B B → aB BaB
B → b B → b Bb

画出其项目集:

在这里插入图片描述

 
 

填LR(1)分析表

移进的时候(就是s几),还是老样子
归约的时候(就是r几),不是像LR(0)那样全都填满,也不是像SLR(1)那样根据Follow集填,而是根据逗号右边的符号来填

还是给出上面例题的答案(自己对照着验证一下):

ab#SB
0s3s412
1acc
2s6s75
3s3s48
4r3r3
5r1
6s6s79
7r3
8r2r2
9r2

 

 
 
 

画LALR(1)项目

画法和LR(1)项目集的画法完全一样——LALR(1)只需在LR(1)基础上进行小小的改动

 
 

填LALR(1)分析表

合并LR(1)分析表的同心集——LALR(1)只需在LR(1)基础上进行小小的改动

何为同心集?

举个例子很容易明白:上面的 I 8 I8 I8 I 9 I9 I9,即 B → aB,a|bB → aB,#
 
下面话需要理解一下:

  • LR(0)和SLR(1)的项目集画法完全一样——当然 I I I状态的个数完全一样;
  • LR(1)使得同心集分裂, I I I状态的数目急剧增加
  • LALR(1)将LR(1)的同心集全部又合并了回去,也就是说LR(0)、SLR(1)、LALR(1)的状态集数目完全相同

下面给出前一个例题中的分析表进行同心集合并后的结果(自己验证一下答案):

ab#SB
0s3,6s4,712
1acc
2s3,6s4,75
3, 6s3,6s4,78, 9
4, 7r3r3r3
5r1
8, 9r2r2r2

 
 

  • 18
    点赞
  • 121
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值