Download presentation
Presentation is loading. Please wait.
1
主要内容 : SLR(1) 分析方法
2
LR(0) 分析方法的不足 LR(0) 方法对文法的要求严格。 LR(0) 方法容易出现冲突状态。
3
一个文法例 : G E : S→E # [1] E→E + T [2] E→T [3] T→T P [4] T→P [5] P→id [6] P→( E ) [7]
4
图 4.5.5.3 G E 的 LRSM 0 + E P id # + P ( T T ( E ( P ) 4 E→ T T→ T P 7 P→ id 5 E→ E + T T→ T P T→ P P→ id P→ (E) 3 T→ P 4 S→ E # E→ E + T 1 S→ E # [1] E→ E+T [2] E→ T [3] T→ T P [4] T→ P [5] P→ id [6] P→ (E) [7] 0 T→ T P P→ id P→ (E) 8 T→ T * P 9 E→ E+T T→ T P 11 P→ (E ) E→ E +T 12 P→(E) 10 P ( T P → ( E ) E→ E+T E→ T T→ T P T→ P P→ id P→ (E) 6 7 8 S→ E# 2
5
如果某个状态有如下项目集: { A → , B → , D→ d } ,则存在 着归约 - 归约,归约 - 移入冲突 若用 A → 归约,则当前输入符应在 A 的 Follow 集中 若用 B → 归约,则当前输入符应在 B 的 Follow 集 若移入,则当前输入符应为 d 。
6
SLR(1) 分析条件 LRSM 0 中存在着状态 { A 1 → 1 , … , A n → n , B 1 → 1 a 1 r 1 , … , B n → n a n r n } Follow(A 1 ) … Follow(A n ) {a 1,…,a n }=
7
SLR(1) 文法的定义 SLR(1) 文法的投影函数 1 定义如下: 1 : StateSet (V T ∪ {#}) →2 1 (S,a) = {Reduce j |B→ S,a Follow(B),B→ P} ∪ (if 存在 X → a S 且 a V T then {Shift}) 如果 LRSM 0 中的每个状态 S ,对任意 a V T , 使得 | 1 (S,a)| 1 ,则称相应文法为 SLR(1) 文法。
8
SLR(1)__Action 表的构造 若 1 (S,#)={Shift} Action( S, # )=Accept 若 1 (S,a)={Shift } 且 a # Action( S, a) =Shift 若 1 (S,a)={Reduce j} Action( S, a) =Reduce j 若 1 (S,a)= Action( S, a) = Error
9
SLR(1)__GoTo 表的构造 GoTo( S, X) = S , 当 LRSM 0 中有 S S GoTo( S, X) = error ,否则 合并的 SLR(1) 分析表,合并方法 : Action( S, a) = Shift i, 当 Action(S, a)= Shift 且 GoTo(S,a)=S i GoTo( S, X) = S i, 当 GoTo(S,X)=S i 且 X V N X
10
图 4.5.5.3 G E 的 LRSM 0 + E P id # + P ( T T ( E ( P ) 4 E→ T T→ T P 7 P→ id 5 E→ E + T T→ T P T→ P P→ id P→ (E) 3 T→ P 4 S→ E # E→ E + T 1 S→ E # [1] E→ E+T [2] E→ T [3] T→ T P [4] T→ P [5] P→ id [6] P→ (E) [7] 0 T→ T P P→ id P→ (E) 8 T→ T * P 9 E→ E+T T→ T P 11 P→ (E ) E→ E +T 12 P→(E) 10 P ( T P → ( E ) E→ E+T E→ T T→ T P T→ P P→ id P→ (E) 6 7 8 S→ E# 2
11
+ id()# 0SS 1SA 2 3SS 4R5 5R6 6SS 7R3S 8SS 9R4 10R7 11R2SR7 12SS State Action - Lookahead
12
+ id()# ETP 0S5S6 174 1S3A 2 3S5S6114 4R5 5R6 6S5S6 1274 7R3S 8S5S69 9R4 10R7 11R2S8R2 12S3S10 State Action - Lookahead GoTo
13
SLR(1) 驱动器 [1] : Push(S 0 , -) ; [2] : Scan(a) ; [3] : S := TopOf( StateStack) ; [4] : case Action( S,a ) of Error ErrorProcess ; Accept Finish ; Shift i begin Push(S i,a) ; goto2 end ; Reduce j begin Pop(JJ) ; Push( GoTo(S - JJ, L j ),L j ); goto 3 end end
14
分析栈 符号栈 输入串 分析动作 转向状态 0 id id+id# S5 0,5 id id+id# R6 4 0,4 P id+id# R5 7 0,7 T id+id# S8 0,7,8 T id+id# S5 0,7,8,5 T id +id# R6 9 0,7,8,9 T P +id# R4 7 0,7 T +id# R3 1 0,1 E +id# S3 0,1,3 E+ id# S5 0,1,3,5 E+id # R6 4 0,1,3,4 E+P # R5 11 0,1,3,11 E+T # R2 1 0,1 E # Accept
15
SLR(1) 与 LR(0) SLR(1) 和 LR(0) 具有相同的状态机 LR(0) 只看分析栈的内容,不考虑当前输入符 SLR(1) 考虑输入符,用 follow 集来解决冲突, 因此 SLR(1) 要比 LR(0) 分析能力强
16
括号文法定义如下: Z → S # S → (S) S | 构造该文法的 SLR(1) 分析表,并给出输 入流 ( )( ) #的 SLR(1) 分析过程。
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.