编译原理语法分析总结PPT课件
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个文法是LR(0)文法一定也是SLR(1) 文法,也是LR(1)、LALR(1)文法,反之 则不一定成立。即
LR(0) SLR(1) LALR(1) LR(1)
例1 考虑文法 S→AS | b A→SA | a
(1) 构造识别文法活前缀的DFA。
第20页/共44页
∩ ∩ ∩
本章小结
(2) 该文法是LR(0)文法吗?请说明理由。
FIR因S为T(从B)=AFIRST(S)∪F*/IRSTε(,cD所)以∪{εε}=F{IaR,dS,Tc,(εA})
FIRST(D)=FIRST(Se)∪{ε}={ a, d, ε}
第10页/共44页
本章小结
FOLLOW(A) ={ a | S * …Aa …且a∈VT } 若有S * …A , 则规定 $∈FOLLOW(A)。
又因为 FOLLOW(S)={b,d,$}∩{a}= Φ 所以项目集I0和I2中移进一归约冲突可以 用SLR(1)方法解决。因此该文法是SLR(1) 文法,但不是LR(0)文法。
第12页/共44页
本章小结
根据LL(1)文法的定义有:
SELECT(S→aAbDe)∩SELECT(S→d) =FIRST(aAbDe)∩FIRST(d)=Φ
SELECT(A→BSD)∩SELECT(A→e) =FIRST(BSD)∩FIRST(e)=Φ
SELECT(B→SAc)∩SELECT(B→cD) =FIRST(SAc)∩FIRST(cD)=Φ
本章小结
4.根据文法规则构造递归下降分析程序 和预测分析表的方法
5. 注意LL(1)分析法与LR分析法的区别 LL(1)分析法(预测分析法)是自上而下 的语法分析法,要求文法为LL(1)文法 LR分析法是自下而上的语法分析法, 只要文法是上下文无关文法
第5页/共44页
本章小结
例1 设有文法G[E]: E→ E+T | E-T | T T→ T*F | T/F | F F→ (E) | id
本章小结
一.确定的自上而下分析法
确定的自上而下分析法要求描述 语言的文法是 LL(1)文法。
1. LL(1)文法的判别方法。 (1) 求文法每个产生式右部符号串的 FIRST集。 (2) 求文法各个非终结符的FOLLOW集。
第1页/共44页
本章小结
(3) 求文法每个产生式的SELECT集。 (4) 求相同左部产生式的SELECT交集。
S →·AS
A →·a
S →·b
b A →·SA
A →·a
S →·AS
A
S →·b
A
a
a a I4: A →a·
I2: S →A·S
A
S →·AS
S →·b
A →·SA
S
A →·a
I3: S →b·
b
A a
b
识别文法G[S]活前缀DFA
第23页/共44页
b
I7: A →S·A A →·SA A →·a S →·AS S →·b
(
I2: S →(·S) S →·(S) S →·
S I1: S'→S.
S I3: S →(S·)
)
( I4: S →(S)·
0. S' →S 1. S →(S) 2. S →ε
见表
该文法不是LR(0)文法。因为I0,I2中含 有移进—归约的冲第突27页。/共44页
本章小结
但是I0,I2中的移进—归约的冲突可以用 SLR(1)方法解决:
(1) 消除文法直接左递归 P→Pα | β 改写为 P→βP' , P'→ αP' | ε
或 P→β{α}
第3页/共44页
本章小结
(2) 提取公共左因子 若 A→ αβ1 | αβ2 | …| αβn 提取公共左因子将文法改写成:
A → αA' A' → β1| β2| …| βn
第4页/共44页
对文法G的每一个非终结符A的产生式 A → α1 | α2 |…| αn 下面条件成立:
SELECT(A→ αi)∩SELECT(A→ αj)=Φ (i≠j) 则文法G是一个LL(1)文法
第2页/共44页
本章小结
2. LL(1)文法是无左递归、无二义性文 法。
3. 将非LL(1)文法改写为LL(1)文法的方 法。
SELECT(B→SAc)∩SELECT(B→ε) =FIRST(SAc)∩{ε , a, d }≠Φ
所以该文法不是LL(1)文法
第13页/共44页
S→aAbDe | d A→BSD | e B→SAc | cD | ε D→Se | ε
FOLLOW(B) ={a,d}
本章小结
(二) LR分析法
1. LR分析法是一种规范归约分析法, 大多数用上下文无关文法描述的语言 都可以用相应的LR分析器予以识别。
I1: S′→S·
I2: S →a·Sb S →a·Sd S →·aSb S →·aSd S →·
I3: S →aS·b S →aS·d
I4: S →aSb· I5: S →aSd·
0. S' →S 2. S →aSb 1. S →aSd 3. S →ε
第31页/共44页
本章小结
检查每个项目集可知,项目集I0和I2中有 移进一归约冲突,因此该文法不是LR(0)文 法。
A
A →·SA
a
A →·a
SA S I6: S →AS·
A →S·A
I3: S →b·
b
A
A →·SA
a
A →·a
b
识别文法G[S]活前缀DFA
第22页/共44页
S →·AS S →·b
(1) 识别文法活前缀的DFA如下图所示。
b I1: S'→S·
SI0: Βιβλιοθήκη '→·SA →S·A
S
A →·SA
S
为消除文法直接左递规,请改写文法,改 写后的文法为:
第6页/共44页
本章小结
E→
E→ E+T | E-T | T T→ T*F | T/F | F F→ (E) | id
T { +T | -T }
T → F { *F | /F } F → (E) | id
第7页/共44页
本章小结
例2 设有文法G[S]
I0:
b
S'→·S S →·AS S →·b A →·SA A →·a
a
a I4: A →a·
b I1:
S
S'→S· A →S·A A →·SA
A →·a
S →·AS
A
S →·b
a
I2: S →A·S S →·AS
S →·b
A →·SA
A →·a
A I5: A →SA· S →A·S
b
S →·AS
S →·b
求FOLLOW(A)的规则:
1. 对文法的开始符号S , 令$∈FOLLOW(S)
2.若 A→αBβ是一条规则, 则将FIRST(β) \ {ε}加到FOLLOW(B)中
3.若 A→αB是一条规则, 或 A→αBβ是一条规则而βε , 则把FOLLOW(A)加到FOLLOW(B)
中
*
第11页/共44页
(3) 该文法是SLR(1)的吗?若是,构造它 的SLR(1)分析表。
(4) 该文法是LR(1)或LALR(1)文法吗?请 说明理由。
解:首先将文法拓广,并对规则进行编号
0. S' →S
3. A →SA
1. S →AS
4. A →a
2. S →b
第21页/共44页
(1) 识别文法活前缀的DFA如下图所示。
第9页/共44页
本章小结
S→aAbDe | d A→BSD | e B→SAc | cD | ε D→Se | ε
问: 能否∪ ε
FIRST(S)=FIRST(aAbDe)∪FIRST(d)={ a,d } FIRST(A)=FIRST(B)∪FIRST(e) =FIRST(S)∪FIRST(cD)∪{e}={ a,d,c,e }
第14页/共44页
本章小结
2. 从给定的上下文无关文法构造 LR分析表的方法是: (1)对LR(0)或 SLR(1)分析表,构造 LR(0)项目集规范族;
对LR(1)或 LALR(1)分析表,构造 LR(1)项目集规范族。
第15页/共44页
本章小结
(2)构造识别文法规范句型活前缀的DFA。 (3)将DFA转换成相应的LR分析表。
S →(S) |ε
试判断该文法是否SLR(1)文法,若 不是,请说明理由;若是,请构造 SLR(1)分析表。
解:首先将文法拓广,并给出每条规则编号
0. S′→S 1. S →(S)
2. S →ε
第26页/共44页
本章小结
构造该文法的LR(0)项目集族和转换函 数如下图所示。
I0: S′→·S S →·(S) S →·
四种分析表的构造基本相同,仅对含 归约项目的项目集构造分析表元素不同。
注意文法一定要拓广。 3. 四种LR文法的判别方法 (1)任何的二义性文法都不是LR类文法。
第16页/共44页
本章小结
(2)根据项目集中是否含冲突项目或相 应分析表中是否含多重定义元素进行判 断:
① LR(0)文法是所有的LR(0)项目集中 没有移进一归约冲突或归约一归约冲突。 (或LR(0)分析表中不含多重定义)
X∈V, 对每一文法符号
求FIRST(X)的规则:
1. 若 X∈VT , 则FIRST(X) ={X}
2. 若 X∈VN 且有 X→ a…, 则把 a 加入 FIRST(X)中
FIRST(X)中 ,若 X→ε , 则把 ε 加入
3. 若 X→Y…, Y∈VN ,则把 FIRST(Y)中所有 非 ε 元素加入FIRST(X)中
第18页/共44页
本章小结
③ LR(1)项目集中无移进一归约冲突或 归约一归约冲突。(或LR(1)分析表中 不含多重定义)
注意搜索符只对归约项目起作用。 ④ LALR(1)项目集中无归约一归约 冲突。(或LALR(1) 分析表中不含多 重定义) 4.四种LR类文法之间的关系
第19页/共44页
本章小结
第24页/共44页
本章小结
S
0. S′→S
A
S
1. S →AS 2. S →b
aA
3. A →SA
S 4. A →a
S AS
S Ab
S Ab
A Sa
ba
ab
所以该文法为二义性文法,任何二义性
文法绝不是SLR(1)文法,也不是LALR(1)
或LR(1)文法。 第25页/共44页
本章小结
例2 设有文法G[S]:
见图
本章小结
例3 设有文法G[S]: S →aSb | aSd |ε 试证明该文法是SLR(1)文法,但不是 LR(0)文法。
解:首先将文法拓广,并对规则进行编号 0. S' →S 2. S →aSd 1. S →aSb 3. S →ε 直接构造LR(0)项目集如下:
第30页/共44页
本章小结
I0: S' →·S S →·aSb S →·aSd S →·
S→aAbDe | d A→BSD | e B→SAc | cD | ε D→Se | ε 1. 计算文法G[S]每个非终结符的FIRST集 和FOLLOW集 。 2. 判断文法G[S] 是否LL(1)文法。
第8页/共44页
本章小结
FIRST(α) = { a | α *a…且 a∈VT } 若α * ε ,则规定 ε∈ FIRST(α)
本章小结
S→aAbDe | d A→BSD | e B→SAc | cD | ε D→Se | ε
FIRST(S)={ a,d } FIRST(A)={ a,d,c,e } FIRST(D)={ a, d, ε }
FOLLOW(S)={$,a,b,c,d,e} FOLLOW(A)={b,c} FOLLOW(B)={a,d} FOLLOW(D)={a,b,c,d,e}
A
I5: A →SA· S →A·S S →·AS S →·b A →·SA A →·a
SA
I6: S →AS· A →S·A A →·SA A →·a S →·AS S →·b
a b a
S
本章小结
(2) 由上图不难看出,项目集I1, I5, I6 中存 在着移进—归约冲突,所以该文法不是 LR(0)文法。 (3) 由于对该文法句子abab对应下面两棵 不同的语法树:(见下图)
FOLLOW(S)={), $}∩{(}= 所以该文法是SLR(1)文法。 其SLR(1)分析表如下表:
第28页/共44页
本章小结
文法G[S]的SLR(1)分析表
ACTION GOTO
()$ S
O S2 r2 r2
1
1
acc
2 S2 r2 r2
3
3
S4
4
r1 r1
第29页/共44页
0. S' →S 1. S →(S) 2. S →ε
② SLR(1)文法是LR(0)项目集中所有 含冲突的项目集都能用SLR规则解决冲 突。 (或SLR(1)分析表中不含多重定义)
第17页/共44页
本章小结
SLR规则: I: { A→α .bβ B 1→ γ1. B2 → γ2. } {b} ∩FOLLOW(B1)=Φ {b} ∩FOLLOW(B2)=Φ a ∈ {b} 移进 FOLLOW(B1)∩FOLLOW(B2)=Φ a ∈ FOLLOW(B1) 用B 1→ γ1 归约 a ∈ FOLLOW(B2) 用B2 → γ2 归约
LR(0) SLR(1) LALR(1) LR(1)
例1 考虑文法 S→AS | b A→SA | a
(1) 构造识别文法活前缀的DFA。
第20页/共44页
∩ ∩ ∩
本章小结
(2) 该文法是LR(0)文法吗?请说明理由。
FIR因S为T(从B)=AFIRST(S)∪F*/IRSTε(,cD所)以∪{εε}=F{IaR,dS,Tc,(εA})
FIRST(D)=FIRST(Se)∪{ε}={ a, d, ε}
第10页/共44页
本章小结
FOLLOW(A) ={ a | S * …Aa …且a∈VT } 若有S * …A , 则规定 $∈FOLLOW(A)。
又因为 FOLLOW(S)={b,d,$}∩{a}= Φ 所以项目集I0和I2中移进一归约冲突可以 用SLR(1)方法解决。因此该文法是SLR(1) 文法,但不是LR(0)文法。
第12页/共44页
本章小结
根据LL(1)文法的定义有:
SELECT(S→aAbDe)∩SELECT(S→d) =FIRST(aAbDe)∩FIRST(d)=Φ
SELECT(A→BSD)∩SELECT(A→e) =FIRST(BSD)∩FIRST(e)=Φ
SELECT(B→SAc)∩SELECT(B→cD) =FIRST(SAc)∩FIRST(cD)=Φ
本章小结
4.根据文法规则构造递归下降分析程序 和预测分析表的方法
5. 注意LL(1)分析法与LR分析法的区别 LL(1)分析法(预测分析法)是自上而下 的语法分析法,要求文法为LL(1)文法 LR分析法是自下而上的语法分析法, 只要文法是上下文无关文法
第5页/共44页
本章小结
例1 设有文法G[E]: E→ E+T | E-T | T T→ T*F | T/F | F F→ (E) | id
本章小结
一.确定的自上而下分析法
确定的自上而下分析法要求描述 语言的文法是 LL(1)文法。
1. LL(1)文法的判别方法。 (1) 求文法每个产生式右部符号串的 FIRST集。 (2) 求文法各个非终结符的FOLLOW集。
第1页/共44页
本章小结
(3) 求文法每个产生式的SELECT集。 (4) 求相同左部产生式的SELECT交集。
S →·AS
A →·a
S →·b
b A →·SA
A →·a
S →·AS
A
S →·b
A
a
a a I4: A →a·
I2: S →A·S
A
S →·AS
S →·b
A →·SA
S
A →·a
I3: S →b·
b
A a
b
识别文法G[S]活前缀DFA
第23页/共44页
b
I7: A →S·A A →·SA A →·a S →·AS S →·b
(
I2: S →(·S) S →·(S) S →·
S I1: S'→S.
S I3: S →(S·)
)
( I4: S →(S)·
0. S' →S 1. S →(S) 2. S →ε
见表
该文法不是LR(0)文法。因为I0,I2中含 有移进—归约的冲第突27页。/共44页
本章小结
但是I0,I2中的移进—归约的冲突可以用 SLR(1)方法解决:
(1) 消除文法直接左递归 P→Pα | β 改写为 P→βP' , P'→ αP' | ε
或 P→β{α}
第3页/共44页
本章小结
(2) 提取公共左因子 若 A→ αβ1 | αβ2 | …| αβn 提取公共左因子将文法改写成:
A → αA' A' → β1| β2| …| βn
第4页/共44页
对文法G的每一个非终结符A的产生式 A → α1 | α2 |…| αn 下面条件成立:
SELECT(A→ αi)∩SELECT(A→ αj)=Φ (i≠j) 则文法G是一个LL(1)文法
第2页/共44页
本章小结
2. LL(1)文法是无左递归、无二义性文 法。
3. 将非LL(1)文法改写为LL(1)文法的方 法。
SELECT(B→SAc)∩SELECT(B→ε) =FIRST(SAc)∩{ε , a, d }≠Φ
所以该文法不是LL(1)文法
第13页/共44页
S→aAbDe | d A→BSD | e B→SAc | cD | ε D→Se | ε
FOLLOW(B) ={a,d}
本章小结
(二) LR分析法
1. LR分析法是一种规范归约分析法, 大多数用上下文无关文法描述的语言 都可以用相应的LR分析器予以识别。
I1: S′→S·
I2: S →a·Sb S →a·Sd S →·aSb S →·aSd S →·
I3: S →aS·b S →aS·d
I4: S →aSb· I5: S →aSd·
0. S' →S 2. S →aSb 1. S →aSd 3. S →ε
第31页/共44页
本章小结
检查每个项目集可知,项目集I0和I2中有 移进一归约冲突,因此该文法不是LR(0)文 法。
A
A →·SA
a
A →·a
SA S I6: S →AS·
A →S·A
I3: S →b·
b
A
A →·SA
a
A →·a
b
识别文法G[S]活前缀DFA
第22页/共44页
S →·AS S →·b
(1) 识别文法活前缀的DFA如下图所示。
b I1: S'→S·
SI0: Βιβλιοθήκη '→·SA →S·A
S
A →·SA
S
为消除文法直接左递规,请改写文法,改 写后的文法为:
第6页/共44页
本章小结
E→
E→ E+T | E-T | T T→ T*F | T/F | F F→ (E) | id
T { +T | -T }
T → F { *F | /F } F → (E) | id
第7页/共44页
本章小结
例2 设有文法G[S]
I0:
b
S'→·S S →·AS S →·b A →·SA A →·a
a
a I4: A →a·
b I1:
S
S'→S· A →S·A A →·SA
A →·a
S →·AS
A
S →·b
a
I2: S →A·S S →·AS
S →·b
A →·SA
A →·a
A I5: A →SA· S →A·S
b
S →·AS
S →·b
求FOLLOW(A)的规则:
1. 对文法的开始符号S , 令$∈FOLLOW(S)
2.若 A→αBβ是一条规则, 则将FIRST(β) \ {ε}加到FOLLOW(B)中
3.若 A→αB是一条规则, 或 A→αBβ是一条规则而βε , 则把FOLLOW(A)加到FOLLOW(B)
中
*
第11页/共44页
(3) 该文法是SLR(1)的吗?若是,构造它 的SLR(1)分析表。
(4) 该文法是LR(1)或LALR(1)文法吗?请 说明理由。
解:首先将文法拓广,并对规则进行编号
0. S' →S
3. A →SA
1. S →AS
4. A →a
2. S →b
第21页/共44页
(1) 识别文法活前缀的DFA如下图所示。
第9页/共44页
本章小结
S→aAbDe | d A→BSD | e B→SAc | cD | ε D→Se | ε
问: 能否∪ ε
FIRST(S)=FIRST(aAbDe)∪FIRST(d)={ a,d } FIRST(A)=FIRST(B)∪FIRST(e) =FIRST(S)∪FIRST(cD)∪{e}={ a,d,c,e }
第14页/共44页
本章小结
2. 从给定的上下文无关文法构造 LR分析表的方法是: (1)对LR(0)或 SLR(1)分析表,构造 LR(0)项目集规范族;
对LR(1)或 LALR(1)分析表,构造 LR(1)项目集规范族。
第15页/共44页
本章小结
(2)构造识别文法规范句型活前缀的DFA。 (3)将DFA转换成相应的LR分析表。
S →(S) |ε
试判断该文法是否SLR(1)文法,若 不是,请说明理由;若是,请构造 SLR(1)分析表。
解:首先将文法拓广,并给出每条规则编号
0. S′→S 1. S →(S)
2. S →ε
第26页/共44页
本章小结
构造该文法的LR(0)项目集族和转换函 数如下图所示。
I0: S′→·S S →·(S) S →·
四种分析表的构造基本相同,仅对含 归约项目的项目集构造分析表元素不同。
注意文法一定要拓广。 3. 四种LR文法的判别方法 (1)任何的二义性文法都不是LR类文法。
第16页/共44页
本章小结
(2)根据项目集中是否含冲突项目或相 应分析表中是否含多重定义元素进行判 断:
① LR(0)文法是所有的LR(0)项目集中 没有移进一归约冲突或归约一归约冲突。 (或LR(0)分析表中不含多重定义)
X∈V, 对每一文法符号
求FIRST(X)的规则:
1. 若 X∈VT , 则FIRST(X) ={X}
2. 若 X∈VN 且有 X→ a…, 则把 a 加入 FIRST(X)中
FIRST(X)中 ,若 X→ε , 则把 ε 加入
3. 若 X→Y…, Y∈VN ,则把 FIRST(Y)中所有 非 ε 元素加入FIRST(X)中
第18页/共44页
本章小结
③ LR(1)项目集中无移进一归约冲突或 归约一归约冲突。(或LR(1)分析表中 不含多重定义)
注意搜索符只对归约项目起作用。 ④ LALR(1)项目集中无归约一归约 冲突。(或LALR(1) 分析表中不含多 重定义) 4.四种LR类文法之间的关系
第19页/共44页
本章小结
第24页/共44页
本章小结
S
0. S′→S
A
S
1. S →AS 2. S →b
aA
3. A →SA
S 4. A →a
S AS
S Ab
S Ab
A Sa
ba
ab
所以该文法为二义性文法,任何二义性
文法绝不是SLR(1)文法,也不是LALR(1)
或LR(1)文法。 第25页/共44页
本章小结
例2 设有文法G[S]:
见图
本章小结
例3 设有文法G[S]: S →aSb | aSd |ε 试证明该文法是SLR(1)文法,但不是 LR(0)文法。
解:首先将文法拓广,并对规则进行编号 0. S' →S 2. S →aSd 1. S →aSb 3. S →ε 直接构造LR(0)项目集如下:
第30页/共44页
本章小结
I0: S' →·S S →·aSb S →·aSd S →·
S→aAbDe | d A→BSD | e B→SAc | cD | ε D→Se | ε 1. 计算文法G[S]每个非终结符的FIRST集 和FOLLOW集 。 2. 判断文法G[S] 是否LL(1)文法。
第8页/共44页
本章小结
FIRST(α) = { a | α *a…且 a∈VT } 若α * ε ,则规定 ε∈ FIRST(α)
本章小结
S→aAbDe | d A→BSD | e B→SAc | cD | ε D→Se | ε
FIRST(S)={ a,d } FIRST(A)={ a,d,c,e } FIRST(D)={ a, d, ε }
FOLLOW(S)={$,a,b,c,d,e} FOLLOW(A)={b,c} FOLLOW(B)={a,d} FOLLOW(D)={a,b,c,d,e}
A
I5: A →SA· S →A·S S →·AS S →·b A →·SA A →·a
SA
I6: S →AS· A →S·A A →·SA A →·a S →·AS S →·b
a b a
S
本章小结
(2) 由上图不难看出,项目集I1, I5, I6 中存 在着移进—归约冲突,所以该文法不是 LR(0)文法。 (3) 由于对该文法句子abab对应下面两棵 不同的语法树:(见下图)
FOLLOW(S)={), $}∩{(}= 所以该文法是SLR(1)文法。 其SLR(1)分析表如下表:
第28页/共44页
本章小结
文法G[S]的SLR(1)分析表
ACTION GOTO
()$ S
O S2 r2 r2
1
1
acc
2 S2 r2 r2
3
3
S4
4
r1 r1
第29页/共44页
0. S' →S 1. S →(S) 2. S →ε
② SLR(1)文法是LR(0)项目集中所有 含冲突的项目集都能用SLR规则解决冲 突。 (或SLR(1)分析表中不含多重定义)
第17页/共44页
本章小结
SLR规则: I: { A→α .bβ B 1→ γ1. B2 → γ2. } {b} ∩FOLLOW(B1)=Φ {b} ∩FOLLOW(B2)=Φ a ∈ {b} 移进 FOLLOW(B1)∩FOLLOW(B2)=Φ a ∈ FOLLOW(B1) 用B 1→ γ1 归约 a ∈ FOLLOW(B2) 用B2 → γ2 归约