第5章 语法分析-自顶向下分析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
☆ LL(1)文法是无二义的
☆ LL(1)文法不含左递归 • 非LL(1)文法的改造 (1)提左公因子 (2)消除左递归
编译原理 第5章 语法分析—自顶向下分析 (20)
1. 提取左公共因子
文法G的产生式 A→ 1∣ γ
存在左因子 ,这导致了对相同左部的产生式其右部的FIRST集相 交,即SELECT(A 1)∩SELECT(Aγ)φ。
影响分析:遇到 时难以判断用哪一个产生式进行匹配若A→ 1∣ γ 改写成: A→ ( 1∣ γ)
或引入新非终结符 A→A′ A′→1∣ γ
一般: A→ 1∣ 2…… ∣ n ∣ γ1…… ∣ γm
改写成:A→ A′∣ γ1…… ∣ γm A′→1∣2…… ∣n
第5章 语法分析—自顶向下分析
本章介绍编译程序的第二个阶段语法分析的设 计方法和实现原理。 ◎ 确定的自顶向下分析思想 ◎ FIRST、FOLLOW、SELECT ◎ LL(1)文法的判别 ◎ 预测分析方法
教学目的及要求
LL(1)分析法。要求理解递归下降分析、LL(1)文法的基本概念; LL(1)分析表的构造与分析方法。 ◇ 能够对一个给定的文法判断是否是LL(1)文法; ◇ 能构造预测分析表; ◇ 能用预测分析方法判断给定的输入符号串是否是该文 法的句子; ◇ 能对某些非LL(1)文法做等价变换: ① 消除左递归 ② 提取左公共因子 可能会变成LL(1)文法。这样可扩大自顶向下分析方法的应用。
编译原理
第5章 语法分析—自顶向下分析
(6)
编译原理
第5章 语法分析—自顶向下分析
(7)
• 例5-1 若有文法G[S]:
S→pA|qB A→cAd|a B→dB|b
若输入串W= pccadd,自顶向下的推导过程为: S pA pcAd pccAdd pccAdd • 所示文法的两个特点:
编译原理 第5章 语法分析—自顶向下分析 (13)
d
• 例5-3 所示文法的特点
当某一非终结符的产生式中含有空产生式时,它的非空
产生式的右部的首符号集两两不相交,并与在推导过程中 紧跟该非终结符右边可能出现的终结符集也不相交,则仍 可以构造确定的自顶向下分析,为此,需要定义一个文法 符号的后跟符号的集合FOLLOW()。
编译原理
第5章 语法分析—自顶向下分析
(11)
计算FIRST集
1.若XT,则FIRST(X)={X}
2.若XV,且有产生式Xa…,则把a加入到FIRST(X)中; 若X 也是一条产生式,则把 也加到FIRST(X)中。
3.若XY…是一个产生式且YV,则把FIRST(Y)中的所有非 元素都加到FIRST(X)中;若X Y1Y2…YK 是一个产生式, Y1,Y2,…,Y(i-1)都是非终结符,而且,对于任何j,1≤j≤i-1, FIRST(Yj)都含有 (即Y1..Y(i-1)* ),则把FIRST(Yj)中的 所 有 非 元 素 都 加 到 FIRST(X) 中 ; 特 别 是 , 若 所 有 的 FIRST(Yj , j=1,2,…,K)均含有,则把加到FRIST(X)中。
编译原理 第5章 语法分析—自顶向下分析 (5)
3. 语法分析的任务
语法分析是编译过程的核心部分。 检查由扫描器输 出的单词序列是否符合该语言的文法—句子。
§分析器的输入:单词序列
§分析器的输出、分析树 §出错处理:定位、继续编译 §分析方法: (1)自顶向下(预测分析) (2)自底向上(算符优先、LR分析器)
编译原理
第5章 语法分析—自顶向下分析
(12)
• 例5-3 若有文法G[S]: S→aA S→d A→bAS A→ 若输入串W=abd,则试图推导出abd串的推导过程为:
S a A a S A a b A S S A a b A S S A b A S
S aA abAS abS abd
∈ (V∪T)*, 若 >*ε,则 SELECT(A)=FIRST()。 如果 *ε,则
SELECT(A)=(FIRST()-{ε}) ∪ FOLLOW(A)。
• 定义5-4 一个上下文无关文法是LL(1)文法的充分必 要条件是,对每个非终结符A的两个不同产生式, A , A 满足
– (1)每个产生式的右部都由终结符开始。
– (2)如果两个产生式有相同的左部,那么它们的右部 由不同的终结符开始。 • 因此分析过程是唯一确定的。
编译原理 第5章 语法分析—自顶向下分析 (8)
• 例5-2若有文法G[S]:
S→Ap|Bq A→cA|a B→dB|b
若输入串W= ccap,自顶向下的推导过程为:
编译原理
第5章 语法分析—自顶向下分析
(17)
例:G[ E]: (1) E →TE′ (3) E′→ (5) T′→*FT′ (7) F →(E)
(2) E′→+TE′ (4) T →FT′ (6) T′→ (8) F –>i
非终结符的FIRST集合如下: 非终结符的FOLLOW集合为:
FIRST(E)={(,i}
S →AB A →aA A →aA A →aA A → B →b
aaabb S (1) A... S →AB (2) aA... A →aA (3) aaA... A →aA (4) aaaA... A →aA (5) aaa B A → (6) aaa b B B →bB (7) aaabb B →b
编译原理
第5章 语法分析—自顶向下分析 (2)
5.1 确定的自顶向下分析思想
要点: 由根向下构造语法树; 构造最左推导; 推导出的终结符是否与当 前输入符匹配?
S
A a A B
aaab
S →AB A →aA ∣ B →b ∣ bB aaab S AB aAB aaAB aaaAB aaa B aaab
第5章 语法分析—自顶向下分析
(18)
G[ E]: (1) E →TE′ (2) E′ →+TE′ (3) E′ → (4) T →FT′ (5) T′ →*FT′ (6) T′ → (7) F →(E) (8) F →a
E′→+TE′ ∣
FIRST(+TE′)={+}
FOLLOW(E′)={),#}
编译原理
A′→d∣c
(23)
第5章 语法分析—自顶向下分析
• 例5-9 G[S]:(1)S→Ap∣Bq (2)A→aAp∣d (3)B→aBq∣e 用(2)(3)右部替换(1)中的A,B
编译原理 第5章 语法分析—自顶向下分析 (9)
定义 5-1 设G=(V,T,P,S)是上下文无关文法 FIRST()={a∣ * a, a∈T, , ∈(V∪T) }
*ቤተ መጻሕፍቲ ባይዱ
若 * ε则规定ε∈FRIST(),称FIRST()为 的开 始符号集或首符号集。
求例5-2的首符号集如下: FIRST(Ap)={a,c} FIRST(Bq)={b,d} 结论:产生式左部相同,而右部都以非终结符开始, 只要他们右部的符号串可以推导出的首符号集不相交, 仍然可以唯一确定所要选择的产生式。
若1, 2…… n仍有公共左因子,可再次提取,直到无公共左因子
为止。
编译原理 第5章 语法分析—自顶向下分析 (21)
• 例5-6 G[S]: (1)S→aSb (2)S→aS (3)S→ε 提取(1)(2)的左公因子后得: S→aSA A→b∣ε S→ε • 例5-7 S→iEtS∣iEtSeS∣a E→b 其中,i,t,e分别表示if,then和else,E和S分别表示表达式和 语句。 提取了公共左因子之后,文法变为 S→iEtS′∣a S′→ε∣ eS E→b 于是,对于输入i,可以展开S为iEtSS′,直到iEtS分析完 毕再去决定把S′展为eS或ε。
编译原理 第5章 语法分析—自顶向下分析 (22)
• 隐式左公因子: 产生式右部以非终结符开始, 方法:用
该非终结符的右部以终结符开始的产生式去替换它。
• 例5-8 G[S]: S→aSd∣Ac • 把A的产生式代入S中: A→aS∣b
S→aSd∣aSc∣bc
• 提取左因子: S→aSA′∣bc A′→d∣c A→aS∣b A的产生式是多余的,需删除。 • 最终: S→aSA′∣bc
编译原理 第5章 语法分析—自顶向下分析 (10)
5.2 LL(1)文法的判别方法
利用自顶向下的语法分析技术,必须首先判断
给定的文法是否为LL(1)文法。
分别计算FIRST、FOLLOW、SELECT集合,
进而判断给定的文法是否为LL(1)文法。
分析前面的3个例子,找出关键问题,不同的 问题采用不同的方法。
S Ap cAp ccAp ccap
• 所示文法有三个特点
– (1)产生式的右部不全是由终结符开始。 – (2)如果两个产生式有相同的左部,它们的右部由不同的终结符 或非终结符开始。 – (3)文法中无空产生式。 • 对于产生式中相同左部含有非终结符开始的产生式时,为了便于正 确考察和选择需要求出相关产生式的首符号集FIRST()。
T′→*FT′ ∣ FIRST(*FT′)={*}
FOLLOW(T′)={+,),#}
F →(E) ∣ a
FIRST( a)={a}
FIRST( (E))={(}
所以G[E]是LL(1)的
编译原理
第5章 语法分析—自顶向下分析
(19)
5.3 非LL(1)文法与LL(1)文法的等价变换
LL(1)文法的性质:
(4)
编译原理
第5章 语法分析—自顶向下分析
2. 无回溯的自顶向下分析程序
• 特征—根据下一个输入符号为当前要处理的非终结符
选择产生式。
• 要求—文法是LL(1)的
第一个L 从左到右扫描输入串
第二个L 生成的是最左推导
1 向前看一个输入符号(lookahead)
• 预测分析程序的实现技术
(1) 递归下降子程序 (2) 表驱动分析程序
2. 若A Bβ是一个产生式,则把
FIRST(β)∣{#}加至FOLLOW(B)中;
3. 若A B是一个产生式,或A Bβ是一个产生
式而β * (即 FIRST(β)),则把FOLLOW(A)
加至FOLLOW(B)中。
编译原理
第5章 语法分析—自顶向下分析
(15)
• 定义5-3 给定上下文无关文法的产生式A A∈V,
SELECT(A) ∩ SELECT(A)= φ 其中、不同时能 *ε。
编译原理 第5章 语法分析—自顶向下分析 (16)
• LL(1)文法的判别
一个文法G是LL(1)的,当且仅当对于G的每一个非终结 符A的任何两个不同产生式A αβ,下面的条件成立: 1.FIRST(α)∩FIRST(β)=,也就是α和β推导不出以同 一个终结符a为首的符号串;它们不应该都能推出空字 。 2. 假若β * ,那么,FIRST(α)∩FOLLOW(A)=。 也就是,若β * ,则α所能推出的串的首符号不应在 FOLLOW(A)中。
FIRST(E′)={+,ε} FIRST(T)={(,i} FIRST(T′)={*,ε} FIRST(F)={(,i}
FOLLOW(E)={), #} FOLLOW(E′)={),#} FOLLOW(T)={+,),#}
FOLLOW(T′)={+,),#}
FOLLOW(F)={*,+,),#}
编译原理
S →AB A →aA A →aA A →aA A → B →b
编译原理
第5章 语法分析—自顶向下分析
(3)
1. 带回溯的自上而下分析
S →AB A →aA ∣ B →b ∣ bB a aabb S (1) A... (2) aA... (3) aaA... (4) aaaA... (5) aaa B... (6) aaab
• 定义 5-2 FOLLOW(A)=
{aS * A且a∈T, a∈ FRIST(),∈ (V∪T) ,∈ (V∪T) + }
*
若S * A ,且 *ε,则 #∈FOLLOW(A)。
编译原理
第5章 语法分析—自顶向下分析
(14)
计算FOLLOW集
1. 对于文法的开始符号S,置 # 于FOLLOW(S) 中;