编译原理5.3.5-LALR分析表的构造-2
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LALR(1)项目集构造核算法-造核算法
End of while End of Algorithm Procedure Insert(I, A→αρ , a) ; if not On[I, A→αρ , a] then Begin 把三元式(I, A→αρ , a) 推进Stack; On[I, A→αρ , a] := True; 把 a 加到I中的项目A→αρ 的搜索符集中 End of Insert
弹出栈顶 (I2 ,S→L=R,#) 引起 (I6 , S→L= R ,#)进栈 弹出栈顶 (I6 , S→L= R ,#)
栈空算法结束
得到LALR(1)集核为: I0: S′→S,# I4: L→ * R,=/# I1 : S′→S ,# I5: L→ i , =/# I2 : S→L=R ,# I6: S→L= R , =/# R→ L ,# I7: L→ * R , =/# I3 : S→R ,# I8: R→L , =/# I9 : S→L= R ,#
例5.14:有如下文法 :有如下文法G[S`]: (0) S` →S (1) S →L=R (2) S →R (3) L →*R (4) L → i (5) R →L 构造文法的LALR项目集 构造文法的 项目集
I0: S`→S S→ L=R S→ R L→ *R L→ i R→ L S L I1: S`→S
则 ‘=’ 是非核项目L→ *R和L→ i的搜索 符, 从而‘=’是I4 的核L→ * R和I5 的核 L→ i 的一个自生搜索符。 将 (I4, L→ * R, =) 推进 Stack 将 (I5, L→ i , =) 推进 Stack
将 (I0, S′→S,#) 推进 Stack 按Sponsor算法重构 的核S→R I4 的核L→ * R I1 的核S′→S
进栈后,考虑可以继续传播的项目 (I4 ,L→ * R ,#) (I2 ,S→L=R,#)
按Sponsor算法将搜索符‘#’传播到 (I9 , S→L= R ,#)(I8 , R→L ,#) (I5 , L→ i ,#) (I4 , L→ * R,#) 但均为归约项目,不会再传播或已在栈中 弹出栈顶 (I4 ,L→ * R ,#) 按Sponsor算法将搜索符‘#’传播到 (I7 , L→ * R ,#),不会再传播
LALR(1)项目集构造算法
构造G的所有LR(0)项目集的核 使用算法Sponsor,对于每个LR(0)集I的核K和每 个文法符号X,确定出GO(I,X)核中的每个项目所 有自生的搜索符,并确定GO(I,X)中哪些项目将 接受到从K中传播过来的搜索符。 传播每个核的自生搜索符,直到无法再传播为止。 o 使用一个栈Stack ,元素为(I, A→α ρ , a ) o 使用数组On[I, A→αρ , a]=true表示已在栈中。 o 使用Insert过程将三元式推进Stack 中。
LALR(1)项目集构造的另一种算法 LALR(1)项目集构造的另一种算法 核: 圆点不在最左端的项目,但初态项目
[S′→S,#] 除外。 用核代替闭包,将缩小项目集所需的存储空间。 若[B→βCγ,#]属于LR(1)项目集I的核K,且有C * Aδ, A →Xρ是一个产生式 ,则GO(I,X)核中[A→ R X ρ, a]中的搜索符a为以下两种情况: 若 a∈FRIST(δγ),则 a 是自生的。
* 若 δγ ε, 则 a = b,则称 I 的核K中的B→βCγ将 R 自己的搜索符传播给GO(I,X)核中的A → X ρ。
搜索符的传播判定算法
Procedure Sponsor(I,X) /* I是一个LR(0)集,X是一个文法符号 */ For I的核中的每个项目B→γδ Do Begin J:=Closure({[B→γδ , ]}) ; # /* 采用 LR(1)项目集求闭包算法 */ # if [A→α X ρ , a] ∈ J但a不等于 then GO(I,X)核中的[A→α X ρ , a] 的搜索符a 是 自生的; if [A→α X ρ , ]#∈ J then GO(I,X)核中的[A→α X ρ , a] 的搜索符a 是 从K中的B→γδ 传播过来的 End
其中I5是归约项目,不会再传播
弹出栈顶 (I4, L→ * R, =) 按Sponsor算法将搜索符‘=’传播到 I7 的核L→ * R I8 的核R→L I5 的核L→ i I4 自身 但I5 、 I7 和 I8都是归约项目,不会再传播 弹出栈顶 (I0, S′→S,#) 按Sponsor算法将搜索符‘#’传播到
LALR(1)项目集构造核算法-造核算法
Begin For 任何I, A→α ρ和 a Do On[I, A→αρ , a]=false Stack:= 空 Insert(I0, S′→S,#) For 每个I, A→α ρ和 a ,a是I中的A→α ρ一个自生搜索 符 Do Insert(I, A→αρ , a) While Stack 非空 Do Begin 移去Stack栈顶的 (I,B→γδ,a ) For 每个文法符号X Do For GO(I,X)中的每个满足下述条件的 A→α ρ: I中的B→γδ把自己的搜索符a传播给GO(I,X)中的A→α ρ Do Insert(Go(I,X), A→αρ , a)
R *
I3:S→R R L I8:R→L I7:L→*R
i
I4:L→*R R→ L * L→ *R L→ i i I5:L→i
* L
I2: S→L=R R→ L LR(0)项目集
i I6: S→L=R = R→ L L→ *R L→ i
R
I9:S→L=R
能够产生搜索符的项目
S`→S 和 S→ L=R 分别拥有搜索符 ‘#’ 和 ‘=’