自顶向下的语法分析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SELECT(S→aAS)={a} SELECT(S→b)={b}
SELECT(A→bA)={b} SELECT(A→ε)={a,b}
SELECT(S→aAS)∩SELECT(S→b)={a}∩{b}=Ø SELECT(A→bA)∩SELECT(A→ε)={b}∩{a, b}≠Ø 该文法不是LL(1)文法.
(1)A→ad (2)A→aAc (3)A→bBc (4)B→aA (5)B→bB
B→aA
B→bB
引入新终结符A’
(1) A→aA’
(2) A→bBc
(3) A’→d
(4) A’→Ac
(5) B→aA
(6) B→bB
(LL(1)文法)
☺ 注意:
☺ 有些文法不能在有限步骤内提取左公因子。(P86例5.9)
一般而言,假定关于P的全部产生式是 P→P1 | P2 | … | Pm | 1 | 2|…|n
则消除P的直接左递归之后为: P→1P | 2P | … | nP P→1P | 2P |… | mP |
左递归变 右递归
33
消除间接左递归
间接左递归
S Aa | b
终结符开始
文法在推导过程中完全可以根据当前的输入 符号决定选择哪个产生式往下推导,分析过 程唯一确定。
7
例2
文法G2[S]:
S →Ap |Bq A →cA |a B →dB |b
识别输入串
w= ccap# 是否是G2[S]的句
子
推导过程: S# Ap# cAp# ccAp# ccap#
21
第三种情况
文法中含有左递归。
文法G,存在U∈Vn,如果有U->U…, 则G为左递归文 法(直接左递归)
类似的:U->V… V->U…(间接左递归)
如:S->Sa S->b 输入串W=baa的分析:
S=>b =>Sa=>ba
=>Saa=>baa (回溯)
不难证实,若文法中含有间接左递归,也会引起回 溯。
FOLLOW(A)= {a S =*> A ,a∈VT,a∈FRIST(),∈V*,∈V+ }
若S =*> A,且 =*>ε,则#∈FOLLOW(A)
也可定义为:
FOLLOW(A)={a*S => …Aa…,且a∈VT } 若有S =* > …A,则规定#∈FOLLOW(A)
19
第一种情况
关于同一非终结符的不同产生式右部FIRST
集交集不为空而引起回溯: S
S
如:文法S->xAy A->ab|a
xAy xAy
输入串w=xay,分析过程可能为:a b
a
关于同一非终结符的不同产生式右部以相同的符
号串开始(A->|),称为具有左公因子。 左公因子的存在必定会使FIRST集交集不为空。
不能对输入串(如w=ab)进行确定的自顶向下的语法分析。 S=>aAS=>abAS=>abS=>?
=>aS=>ab
18
5.2 不确定的自顶向下分析
当文法不满足LL(1)文法的条件时,不能进 行确定的自顶向下分析,分析过程中会出现 回溯现象,即只能进行不确定的自顶向下分 析。
三种情况下会引起分析过程中的回溯:
(用“#”作为输入串的结束符,或称输入串括号)
12
结论
当文法中含有形如 A→ A→ (A∈VN,,∈V*) 的产生式时,若和不能同时推导出空,假定 =*>ε, =>*ε则当 FIRST()∩(FIRST()∪FOLLOW(A))= Ø 时,若当前非终结符为A,面临某一输入符号x,可
20
第二种情况
关于同一非终结符的不同产生式右部存在能 =* >ε的产生式,且该非终结符的FOLLOW集 与其它产生式右部FIRST集的交集不为空。
如文法G[S]:S→aAS|b A→bA|ε
First(bA)与Follow(A)的交集不为空。对输 入串W=ab的分析存在回溯(前面已经证 明)。
☺ 提取左公因子后若不含空产生式和左递归则文法是LL(1)文法,否 则需进一步判定。
30
消除直接左递归
直接左递归 若文法中含有形如A→Aα|β的产生式,则 称文法中含有直接左递归(生成的串的形式为
. . . )
直接左递归的消除: 将A→Aα|β替换为 A→βA’ A’→αA’|ε 文法S->Sa|b改写后对输入串baaa#是否 可进行确定分析?
8
S →Ap |Bq A →cA |a B →dB |b
具有相同左部的产生式向下推导 时能够推导出不同的终结符
文法特点:
产生式的右部不全是由终结符开始 如果两个产生式有相同的左部,它们的右部由不同的
终结符或非终结符开始
文法中无空产生式
对于产生式中相同左部含有非终结符开始的产 生式时,可通过考察产生式向下推导时能够推 导出的第一个终结符唯一确定该用哪个产生式 进行替换。
交集 为空
使得面向非终结符S为某一输入符号x寻求匹配时,可由x与两 集合的归属关系确定选用哪个产生式进行推导。(文法1同)
无空产 生式 10
例3(含空产生式的文法)
文法G[S]:S → aA |d A →bAA-S>b|εAS|db|ε
识别输入串 w= abd#
推导过程:
S aA abAS abS
14
LL(1)文法
一个上下文无关文法能进行确定的自顶向下语法分 析的充分必要条件是:对每个非终结符A的两个不同 产生式,A→,A→,满足
SELECT(A→)∩SELECT(A→)= Ø 其中、不同时能=* >ε,这样的文法称为LL(1)文法。
LL(1)文法
能够使用自顶向下分析技术的文法是LL(1)文法。 LL(1)的含义
第1个L: 自顶向下分析时从左向右扫描输入串 第2个L: 分析过程中将用最左推导 1:只需向右看一个符号便可决定如何推导即选择哪个产
生式(进行)推导
类似也可以有LL(k)文法,也就是需向前查看k个 符号才可确定选用哪个产生式。
16
例文法G[S]:S→aA|d A→bAS|ε
SELECT(S→aA)={a} SELECT(S→d)={d}
9
FIRST集的定义
设G=(VT,VN,P,S)是上下文无关文
FIRST()={a| =*> a,a∈VT,,∈V* }
若 =*>ε则规定ε∈FRIST()
称FRIST()为的开始符号集或首符号集。
在文法G2中:
S->Ap A->cA|a FRIST(Ap)={a,c} S->Bq B->dB|b FRIST(Bq)={b,d}
确定的自定向下分析方法,是从文法的开始 符号出发,考虑如何根据当前的输入符号 (单词符号)惟一的确定选用哪个产生式替 换相应非终结符向下推导,或如何构造一棵 相应的语法树。
什么样的文法能够进行确定的自顶向下语法 分析?
5
例1
文法G1[S]:
S →pA|qB A →cAd|a B →dB |c
如if语句的文法
S→ if E then S |if E then S else S |other
存在左公因子 if E then S 影响:遇到 if 时难以判断用哪一个产生式进行匹配(推导)
25
提取左公因子
可将文法中的Aβ|变换为:
AB Bβ| (B为新引入的非终结符)
第五章 自顶向下语法分析方法
1
语法分析
语法分析(Ch3:句子分析)是编译程序的核心 部分。其作用是识别由词法分析给出的单词符 号序列是否是给定文法的正确句子(程序)。
自顶向下分析
语法分析方法 自底向上分析
2
自顶向下的语法分析
• 自顶向下分析——面向目标的分析方法
• 确定的自顶向下分析方法需对文法有一定的限 制,但由于实现方法简单、直观,便于手工构 造或自动生成语法分析器,是最常用的方法之 一。
(1)(2)
A Sd |
22
不确定的自顶向下分析
分析过程是一种试探过程,分析过程需进行 回溯,也称这种方法是带回溯的自顶向下分 析方法。
语法分析的同时往往进行语义分析,回溯代 价高,在实际的编译程序设计中很少使用。
23
5.3 非LL(1)文法的改造
若文法中含有左公因子或左递归,则文法肯定不是 LL(1)文法,不能进行确定的自顶向下语法分析。
SELECT(A→bAS)={b} SELECT(A→ε)={a, d, #}
SELECT(S→aA)∩SELECT(S→d)={a}∩{d}=Ø SELECT(A→bAS)∩SELECT(A→ε)={b}∩{a,d,#}= Ø 文法为LL(1)文法,可对输入串进行确定的自顶向下分析。
17
例文法G[S]:S→aAS|b A→bA|ε
识别输入串 w= pccadd# 是否是G1[S]的句子
自顶向下的推导 过程为:
S#pA pcAd pccAdd pccadd #
6
S →pA |qB A →cAd|a B →dB |c
文法特点:
每个产生式右部都由终结符号开始 如果两个产生式有相同的左部,那么它们的右部由不同的
• 不确定的自顶向下分析方法是带回溯的分析方 法,实际是一种穷举的试探方法,效率低,代 价高,使用较少。
3
自顶向下的语法分析
5.1 确定的自顶向下分析思想 5.2 不确定的自顶向下分析 5.3 非LL(1)文法的等价变换 5.4 LL(1)文法的判别 5.5 确定的自顶向下分析方法
4
5.1 确定的自顶向下分析思想
由x的归属决定选择A的哪个候选式对非终结符A
进行替换。
13
Select集(Predict集)
给定上下文无关文法的产生式A→,A∈VN, ∈V*,若 =* >ε,则 SELECT(A→)= FIRST()
如果 =*>ε,则
SELECT(A→)=(FIRST()-{ε})∪FOLLOW(A)
是否是G[S]的句子
abd
当某一非终结符的产生式中含有空产生式时,它的非空产
生式右部的首符号集两两不相交,并与在推导过程紧跟该
非终结符右边可能出现的终结符集也不相交,则仍可构造
确定的自顶向下分析。
11
FOLLOW集的定义
设G=(VT,VN,P,S)是上下文无关文法,A∈VN, S是开始符号
通过提取左公共因子、消除左递归对文法进行等价 变换,在某些特殊情况下可使非LL(1)文法变为 LL(1)文法。
提取左公因子,消除左递归之后文法只是满足LL(1)文法 的必要条件,而不是充分条件,所以不一定是LL(1)文法。
24
提取左公因子
若文法中含有形如Aβ|的产生式,则称文法中含有左公 因子。这将导致关于同一非终结符的不同产生式右部的FIRST 集交集不为空,不满足LL(1)文法的充要条件。
31
表达式文法消除左递归
G[E]: E→E+T|T
T→T*F|F F→i|(E)
消除左递归后为:
E→ T E’ E’→ + T E’|ε T→ F T’ T’→* F T’|ε
F→ ( E )|i
将A→Aα|β替换为 A→βA’ A’→αA’|ε
32
消除直接左递归
A→αβ1|αβ2|…|αβn |γ1|γ2|… | γm
的规则改写为 A→αA’|γ1|γ2|… | γm
A'→β1|β2|…|βn
27
例1:文法G1的产生式为(1) S→aSb (2) S→aS (3) S→
(1)(2)提取左公共因子后得 S→aS(b|) S→
进一步变为G1’: S→aSA S→ A→b A→
(非LL(1)文法)
28
左公共因子可能是隐式的
例2:文法G2的产生式为(1)A→ad (2)A→Bc (3)B→aA (4)B→bB
将(3)(4)代入(2)得到: (1)A→ad (2)A→aAc (3)A→bBc (4)B→aA (5)B→bB
29
提取(1)(2)的左公共因子 A→a(d|Ac) A→bBc
若β和中仍含有左公共因子,可再次提取,直至引入新非 终结符的有关产Leabharlann Baidu式再无左公共因子为止。
如if 语句文法 S→ if E then S
|if E then S else S |other
改写为: S→ if E then SS’|other
S'→ε|else S
26
提取左公因子
更一般的,可将形如
SELECT(A→bA)={b} SELECT(A→ε)={a,b}
SELECT(S→aAS)∩SELECT(S→b)={a}∩{b}=Ø SELECT(A→bA)∩SELECT(A→ε)={b}∩{a, b}≠Ø 该文法不是LL(1)文法.
(1)A→ad (2)A→aAc (3)A→bBc (4)B→aA (5)B→bB
B→aA
B→bB
引入新终结符A’
(1) A→aA’
(2) A→bBc
(3) A’→d
(4) A’→Ac
(5) B→aA
(6) B→bB
(LL(1)文法)
☺ 注意:
☺ 有些文法不能在有限步骤内提取左公因子。(P86例5.9)
一般而言,假定关于P的全部产生式是 P→P1 | P2 | … | Pm | 1 | 2|…|n
则消除P的直接左递归之后为: P→1P | 2P | … | nP P→1P | 2P |… | mP |
左递归变 右递归
33
消除间接左递归
间接左递归
S Aa | b
终结符开始
文法在推导过程中完全可以根据当前的输入 符号决定选择哪个产生式往下推导,分析过 程唯一确定。
7
例2
文法G2[S]:
S →Ap |Bq A →cA |a B →dB |b
识别输入串
w= ccap# 是否是G2[S]的句
子
推导过程: S# Ap# cAp# ccAp# ccap#
21
第三种情况
文法中含有左递归。
文法G,存在U∈Vn,如果有U->U…, 则G为左递归文 法(直接左递归)
类似的:U->V… V->U…(间接左递归)
如:S->Sa S->b 输入串W=baa的分析:
S=>b =>Sa=>ba
=>Saa=>baa (回溯)
不难证实,若文法中含有间接左递归,也会引起回 溯。
FOLLOW(A)= {a S =*> A ,a∈VT,a∈FRIST(),∈V*,∈V+ }
若S =*> A,且 =*>ε,则#∈FOLLOW(A)
也可定义为:
FOLLOW(A)={a*S => …Aa…,且a∈VT } 若有S =* > …A,则规定#∈FOLLOW(A)
19
第一种情况
关于同一非终结符的不同产生式右部FIRST
集交集不为空而引起回溯: S
S
如:文法S->xAy A->ab|a
xAy xAy
输入串w=xay,分析过程可能为:a b
a
关于同一非终结符的不同产生式右部以相同的符
号串开始(A->|),称为具有左公因子。 左公因子的存在必定会使FIRST集交集不为空。
不能对输入串(如w=ab)进行确定的自顶向下的语法分析。 S=>aAS=>abAS=>abS=>?
=>aS=>ab
18
5.2 不确定的自顶向下分析
当文法不满足LL(1)文法的条件时,不能进 行确定的自顶向下分析,分析过程中会出现 回溯现象,即只能进行不确定的自顶向下分 析。
三种情况下会引起分析过程中的回溯:
(用“#”作为输入串的结束符,或称输入串括号)
12
结论
当文法中含有形如 A→ A→ (A∈VN,,∈V*) 的产生式时,若和不能同时推导出空,假定 =*>ε, =>*ε则当 FIRST()∩(FIRST()∪FOLLOW(A))= Ø 时,若当前非终结符为A,面临某一输入符号x,可
20
第二种情况
关于同一非终结符的不同产生式右部存在能 =* >ε的产生式,且该非终结符的FOLLOW集 与其它产生式右部FIRST集的交集不为空。
如文法G[S]:S→aAS|b A→bA|ε
First(bA)与Follow(A)的交集不为空。对输 入串W=ab的分析存在回溯(前面已经证 明)。
☺ 提取左公因子后若不含空产生式和左递归则文法是LL(1)文法,否 则需进一步判定。
30
消除直接左递归
直接左递归 若文法中含有形如A→Aα|β的产生式,则 称文法中含有直接左递归(生成的串的形式为
. . . )
直接左递归的消除: 将A→Aα|β替换为 A→βA’ A’→αA’|ε 文法S->Sa|b改写后对输入串baaa#是否 可进行确定分析?
8
S →Ap |Bq A →cA |a B →dB |b
具有相同左部的产生式向下推导 时能够推导出不同的终结符
文法特点:
产生式的右部不全是由终结符开始 如果两个产生式有相同的左部,它们的右部由不同的
终结符或非终结符开始
文法中无空产生式
对于产生式中相同左部含有非终结符开始的产 生式时,可通过考察产生式向下推导时能够推 导出的第一个终结符唯一确定该用哪个产生式 进行替换。
交集 为空
使得面向非终结符S为某一输入符号x寻求匹配时,可由x与两 集合的归属关系确定选用哪个产生式进行推导。(文法1同)
无空产 生式 10
例3(含空产生式的文法)
文法G[S]:S → aA |d A →bAA-S>b|εAS|db|ε
识别输入串 w= abd#
推导过程:
S aA abAS abS
14
LL(1)文法
一个上下文无关文法能进行确定的自顶向下语法分 析的充分必要条件是:对每个非终结符A的两个不同 产生式,A→,A→,满足
SELECT(A→)∩SELECT(A→)= Ø 其中、不同时能=* >ε,这样的文法称为LL(1)文法。
LL(1)文法
能够使用自顶向下分析技术的文法是LL(1)文法。 LL(1)的含义
第1个L: 自顶向下分析时从左向右扫描输入串 第2个L: 分析过程中将用最左推导 1:只需向右看一个符号便可决定如何推导即选择哪个产
生式(进行)推导
类似也可以有LL(k)文法,也就是需向前查看k个 符号才可确定选用哪个产生式。
16
例文法G[S]:S→aA|d A→bAS|ε
SELECT(S→aA)={a} SELECT(S→d)={d}
9
FIRST集的定义
设G=(VT,VN,P,S)是上下文无关文
FIRST()={a| =*> a,a∈VT,,∈V* }
若 =*>ε则规定ε∈FRIST()
称FRIST()为的开始符号集或首符号集。
在文法G2中:
S->Ap A->cA|a FRIST(Ap)={a,c} S->Bq B->dB|b FRIST(Bq)={b,d}
确定的自定向下分析方法,是从文法的开始 符号出发,考虑如何根据当前的输入符号 (单词符号)惟一的确定选用哪个产生式替 换相应非终结符向下推导,或如何构造一棵 相应的语法树。
什么样的文法能够进行确定的自顶向下语法 分析?
5
例1
文法G1[S]:
S →pA|qB A →cAd|a B →dB |c
如if语句的文法
S→ if E then S |if E then S else S |other
存在左公因子 if E then S 影响:遇到 if 时难以判断用哪一个产生式进行匹配(推导)
25
提取左公因子
可将文法中的Aβ|变换为:
AB Bβ| (B为新引入的非终结符)
第五章 自顶向下语法分析方法
1
语法分析
语法分析(Ch3:句子分析)是编译程序的核心 部分。其作用是识别由词法分析给出的单词符 号序列是否是给定文法的正确句子(程序)。
自顶向下分析
语法分析方法 自底向上分析
2
自顶向下的语法分析
• 自顶向下分析——面向目标的分析方法
• 确定的自顶向下分析方法需对文法有一定的限 制,但由于实现方法简单、直观,便于手工构 造或自动生成语法分析器,是最常用的方法之 一。
(1)(2)
A Sd |
22
不确定的自顶向下分析
分析过程是一种试探过程,分析过程需进行 回溯,也称这种方法是带回溯的自顶向下分 析方法。
语法分析的同时往往进行语义分析,回溯代 价高,在实际的编译程序设计中很少使用。
23
5.3 非LL(1)文法的改造
若文法中含有左公因子或左递归,则文法肯定不是 LL(1)文法,不能进行确定的自顶向下语法分析。
SELECT(A→bAS)={b} SELECT(A→ε)={a, d, #}
SELECT(S→aA)∩SELECT(S→d)={a}∩{d}=Ø SELECT(A→bAS)∩SELECT(A→ε)={b}∩{a,d,#}= Ø 文法为LL(1)文法,可对输入串进行确定的自顶向下分析。
17
例文法G[S]:S→aAS|b A→bA|ε
识别输入串 w= pccadd# 是否是G1[S]的句子
自顶向下的推导 过程为:
S#pA pcAd pccAdd pccadd #
6
S →pA |qB A →cAd|a B →dB |c
文法特点:
每个产生式右部都由终结符号开始 如果两个产生式有相同的左部,那么它们的右部由不同的
• 不确定的自顶向下分析方法是带回溯的分析方 法,实际是一种穷举的试探方法,效率低,代 价高,使用较少。
3
自顶向下的语法分析
5.1 确定的自顶向下分析思想 5.2 不确定的自顶向下分析 5.3 非LL(1)文法的等价变换 5.4 LL(1)文法的判别 5.5 确定的自顶向下分析方法
4
5.1 确定的自顶向下分析思想
由x的归属决定选择A的哪个候选式对非终结符A
进行替换。
13
Select集(Predict集)
给定上下文无关文法的产生式A→,A∈VN, ∈V*,若 =* >ε,则 SELECT(A→)= FIRST()
如果 =*>ε,则
SELECT(A→)=(FIRST()-{ε})∪FOLLOW(A)
是否是G[S]的句子
abd
当某一非终结符的产生式中含有空产生式时,它的非空产
生式右部的首符号集两两不相交,并与在推导过程紧跟该
非终结符右边可能出现的终结符集也不相交,则仍可构造
确定的自顶向下分析。
11
FOLLOW集的定义
设G=(VT,VN,P,S)是上下文无关文法,A∈VN, S是开始符号
通过提取左公共因子、消除左递归对文法进行等价 变换,在某些特殊情况下可使非LL(1)文法变为 LL(1)文法。
提取左公因子,消除左递归之后文法只是满足LL(1)文法 的必要条件,而不是充分条件,所以不一定是LL(1)文法。
24
提取左公因子
若文法中含有形如Aβ|的产生式,则称文法中含有左公 因子。这将导致关于同一非终结符的不同产生式右部的FIRST 集交集不为空,不满足LL(1)文法的充要条件。
31
表达式文法消除左递归
G[E]: E→E+T|T
T→T*F|F F→i|(E)
消除左递归后为:
E→ T E’ E’→ + T E’|ε T→ F T’ T’→* F T’|ε
F→ ( E )|i
将A→Aα|β替换为 A→βA’ A’→αA’|ε
32
消除直接左递归
A→αβ1|αβ2|…|αβn |γ1|γ2|… | γm
的规则改写为 A→αA’|γ1|γ2|… | γm
A'→β1|β2|…|βn
27
例1:文法G1的产生式为(1) S→aSb (2) S→aS (3) S→
(1)(2)提取左公共因子后得 S→aS(b|) S→
进一步变为G1’: S→aSA S→ A→b A→
(非LL(1)文法)
28
左公共因子可能是隐式的
例2:文法G2的产生式为(1)A→ad (2)A→Bc (3)B→aA (4)B→bB
将(3)(4)代入(2)得到: (1)A→ad (2)A→aAc (3)A→bBc (4)B→aA (5)B→bB
29
提取(1)(2)的左公共因子 A→a(d|Ac) A→bBc
若β和中仍含有左公共因子,可再次提取,直至引入新非 终结符的有关产Leabharlann Baidu式再无左公共因子为止。
如if 语句文法 S→ if E then S
|if E then S else S |other
改写为: S→ if E then SS’|other
S'→ε|else S
26
提取左公因子
更一般的,可将形如