编译原理课件SLR分析法
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
I5: F→id·
F→·id
(
2 E→T 3 T→T*F
id
I7:
T→T*·F F→·(E)
4 T→F 5 F→(E)
F→·id
6 F→id
id
*
I0: E'→·E E
E→·E+T E→·T F T→·T*F T→·F F→·(E) (
F→·id
T
I2:
E→T· T→T·*F
T
id
I1:E'→E· + E→E·+T
F→·id
*
I9:TE→→TE·+*TT·
法 活 前
缀
F
I10:T→T*F·
的 D
F
A
4.5.3 SLR(1)分析法
不难看出在I1,I2,I9中既含有移进项 目,又含有归约项目,因而这个表达式 的文法不是LR(0)文法。
根据构造LR(0)分析表的方法,构造 出的LR(0)分析表中在2状态和9状态下 面临输入符号‘*’时含多重定义元素, 见下表。
表达式文法的LR(0)分析表
状 态 id
ACTION
+ *(
)$
0 S5 1 2 r2 3 r4
4 S5 5 r6
6 S5 7 S5 8 9 r1 10 r3 11 r5
S4 S6 r2 S7r2 r2 r4 r4 r4
S4 r6 r6 r6
S4
S4
S6
S11
r1 S7r1 r1 r3 r3 r3
4.5.3 SLR(1)分析法
IK={ X→δ·bB, A→α·, B→r·}
对归约项目A→α•和B→γ• ,只需要考察 当将句柄α或γ归约为A或B时,直接跟在A 或B后的终结符的集合即FOLLOW(A)和 FOLLOW(B)互不相交且不包含移进符号b, 即满足:
FOLLOW(A)∩FOLLOW(B)=Φ FOLLOW(A)∩{b}=Φ FOLLOW(B)∩{b}=Φ
现在分别考察上例中的三个项目集 I1,I2,I9中冲突能否用SLR(1)方法解决。
I1={ E'→E·, E→E·+T } 由于FOLLOW(E')={$}∩{+}=Φ ,且 E'→E•是“接受”项目,所以I1中的接 受—移进冲突可以用SLR(1)方法解决。
4.5.3 SLR(1)分析法
r5 r5 r5
acc r2 r2 r4 r4 r6 r6
r1 r1 r3 r3 r5 r5
GOTO ETF 123
823 93 10
4.5.3 SLR(1)分析法
为了对语言句子进行确定性的分析, 需要解决 移进—归约或归约—归约冲突。 我们采用对含有冲突的项目集向前查看 一个输入符号的办法来解决冲突,这种 分析法称为简单的LR分析法,即SLR(1) 分析法。
4.5.3 SLR(1)分析法
设a为当前输入符: (1) 若a∈{a1,a2,…,am}则移进。 (2) 若a∈FOLLOW(Bi) ,i=1,2, …,n,
则用Bi→ri进行归约。 (3) 此外报错。 这种用来解决分析动作冲突的方法称 为SLR(1)方法。
4.5.3 SLR(1)分析法
如果对于一个文法的某些LR(0)项目集 或LR(0)分析表中所含有的动作冲突都能 用SLR(1)方法解决,则称这个文法是 SLR(1)文法。
I :{ A1→α1·a1β1 , A2→α2·a2β2 , … , Am→αm·amβm , B1→r1·, B2 →r2·, … , Bn →rn·} 对所有移进项目向前看一符号集合
{a1,a2,…,am}和 FOLLOW(B1), FOLLOW(B2), …,FOLLOW(Bn)两两相交为Φ时,则项目 集 I 中冲突仍可用下述规则解决冲突。
I3:T→F· F
F
(
I4: F→(·E)
E→·E+T
E
E→·T T→·T*F
T→·F
F→·(E) (
I6: E→E+·T
T→·T*F T→·F
id
F→·(E) T F→·id
+
I8:F→ (E·) E→E·+T
识
别
)
表
I11:F→(E) ·
达 式
文
I5: F→id·
id
F→·id
ห้องสมุดไป่ตู้
(
I7:
T→T*·F F→·(E)
T
E F (
I1:E'→E· + E→E·+T
I3:T→F· F
F
(
I4: F→(·E)
E→·E+T
E
E→·T
I6:
E→E+·T T→·T*F
T→·F
id
F→·(E)
F→·i+d I8:F→ (E·)
E→E·+T
*
I2:
E→T· T→T·*F
T
T→·T*F T→·F
0 E'→E
id
F→·(E) (
1 E→E+T
F→(E) | id
4.5.3 SLR(1)分析法
将文法拓广并对规则进行编号
0. E'→E 1. E→E+T
4. T→F 5. F→(E)
2. E→T
6. F→id
3. T→T * F
直接构造出识别文法规范句型活前缀 的DFA下如图所示。
id
I0: E'→·E
E→·E+T E→·T T→·T*F T→·F F→·(E) F→·id
因此,当一个LR(0)项目集规范族中存 在一个含移进—归约冲突和归约—归约冲 突的项目集时
IK={ X→δ·bB, A→α·, B→r·}
则在分析表第K行中遇输入符号b必然 会出现多重定义元素。
对含冲突的项目集,仅根据LR(0)项目 本身的信息是无法解决冲突的。需要向前 查看一个输入符号以考察当前所处的环境。
4.5.3 SLR(1)分析法
那么,当状态K面临输入符号a时,可 按以下规则解决冲突:
(1) 若a=b则移进 (2) 若aFOLLOW(A),则用规则
A进行归约。 (3) 若aFOLLOW(B),则用规则
Br进行归约。 (4) 此外报错。
4.5.3 SLR(1)分析法
一般而言,若一个LR(0)项目集I中有m个 移进项目和n个归约项目时:
4.5.3 SLR(1)分析法
仔细分析构造LR(0)分析表的方法,容 易看出使分析表出现多重定义的原因在 于其中的规则2,即对于每一个项目集Ik 中的归约项目A→α •,不管当前输入符号 是什么,都将ACTION表中第K行的各个 元素均置为rj,其中j为规则A→α的编号。
4.5.3 SLR(1)分析法
4.5.3 SLR(1)分析法
由于LR(0)文法要求文法的每一个LR(0) 项目集中都不含有冲突的项目,这个条件
比较苛刻,对于大多数程序设计语言来说, 一般都不能满足LR(0)文法的条件,即使 是描述一个算述表达式的简单文法也不是 LR(0)文法。
例 考虑算术表达式 E→E+T | T
的文法 :
T→T*F | F