编译原理 自顶向下语法分析方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

S→d
A→bAS
A→ε
SELECT(S→aA)=FIRST(aA)={a} SELECT(S→d)=FIRST(d)={d}
SELECT(ABaidu NhomakorabeabAS)=FIRST(bAS)={b}
SELECT(A→ε) =(FIRST(ε)-{ε})+ FOLLOW(A)={#,a,d}
结论三
同一非终结符的不同产生式A→α与A→β,若

回顾——自上而下的分析方法 例 文法G:S → cAd A → ab A→ a 识别输入串w=cabd是否为该文法的句子 S =>cAd =>cabd S c 成功 A d
S =>cAd =>cad S
c A d a 不成功
a
b
本章内容
4.1 4.2 4.3 确定的自顶向下分析思想 LL(1)文法的判别 某些非LL(1)文法到LL(1)文法的等价变换
4.4
4.5
不确定的自顶向下分析思想
确定的自顶向下分析方法
4.1 确定的自顶向下分析思想
1 确定分析的条件 2 开始符号集FIRST(α)的定义
3 后跟符号集FOLLOW(A)的定义
4 选择集合SELECT(A→α)的定义 5 LL(1)文法的定义
1. 确定分析的条件
从文法的开始符出发,如能根据当前 的输入符号(单词符号)唯一地确定选用 哪个产生式进行推导,则分析是确定的。
1. 求出能推出ε的非终结符集
算法描述:
用T表示能推出ε的非终结符集


令T={ Aj | (Aj→ε) 产生式集}
对于产生式Ap→A1....An
若A1....AnT,则 T = T {Ap }

重复②,直至T 收敛(不再变化)为止
例G[S]:
S→AB|bC A→b|ε B→aD|ε C→AD|b D→aS|c
SELECT(A→α)∩SELECT(A→β)=Φ,则一定可
以进行确定的自顶向下分析
5. LL(1)文法的定义
定义 : 上下文无关文法为LL(1)文法的充分必要条件是,对 每个非终结符A的两个不同产生式A→α与A→β,满 足SELECT(A→α)∩SELECT(A→β)=Φ LL(1)文法的含义是: 第一个L——从左到右扫描输入串 第二个L——分析过程用最左推导 (1)——表明只需向前看 1 个输入符号便可以决定选 哪个产生式进行推导(类似地,LL(k) 文法则需要 向前看 k 个输入符号才可以确定选用哪个产生式)

例 有文法G[S]为: SELECT(S→aAS)= {a} S→aAS
S→b A→bA A→ε SELECT(S→b)= {b} SELECT(A→bA)= {b} SELECT(A→ε)= {a,b}
由于SELECT(A→bA)∩SELECT(A→ε)={b}≠Φ,所以 文法G[S]不是LL(1)文法,当A遇输入符b时,不能确 定选A→bA还是A→ε去推导。
得 d ∈FOLLOW(S)
FOLLOW(S)={#,a,d}
解释 当A面对应输入符a,在自顶向下的分析中应选择这 样的产生式A→i( i可导出空串)进行推导:

若a ∈ First(i),则 A→i 可选 因 i 可能导出空串,A自动获得匹配,输入符a有可能与 A 后的一个符号匹配,故当 a ∈ Follow(A) 时,产生式 A→ i 亦可选
自顶向下基本思想: 从文法的开始符出发企图推导出与输入的单词串完 全相匹配的句子.
回顾——自上而下的分析方法 定义: 从文法的开始符号出发,反复使用文法的 产生式,寻找与输入符号串匹配的推导。 语法树的构造: 将文法的开始符号作为语法树的根,向下 逐步建立语法树,使语法树的末端结点符 号串正好是输入符号串。 自上而下分析的主要问题 选定产生式
c
A d
a S =>pA =>pcAd =>pccAdd =>pccadd
例2:设有文法G2[S]为:
S→Ap|Bq
A→a|cA
若输入串W=ccap,自顶向下的推导过程为: 该例说明,当 (1)产生式右部以终结符或非终结符开头(无空产 生式); (2)同一非终结符的不同产生式的右部由不同的符 号开头。 对于这种文法,在推导过程选用哪个产生式不直 观,关键是判断产生式右部推出的开始符号 (集),分析过程可能是确定的
第四章 自顶向下语法分析方法
学习目标:
掌握:LL(1)文法的判别,预测分析法,
递归子程序的构造方法
理解:LL(1)文法 了解:不确定的自顶向下分析
语法分析的作用是识别由词法分析给出的单词序列 是否是给定文法的正确句子 分类:
确定的
自顶向下分析 语法分析 自底向上分析 LR分析(第五章) 不确定的 算法优先分析(第六章)
例文法G2[S]: S→Ap S→Bq FIRST(Ap)={a,c} FIRST(Bq)={b,d}
A→a
A→cA
FIRST(a)={a }
FIRST(cA)={c}
B→b
B→dB
FIRST(b)={b}
FIRST(dB)={d}
结论一
针对无空产生式的文法G,同一非终结符的任两 个产生式的右部串的First集无交集,即可进行确定的 自顶向下分析。
[例] 文法G3[S]:
FOLLOW(A)
S→aA|d
A→bAS|ε
由S=>* aA 得 # ∈FOLLOW(A)
由S=>* abAS =>* abAaA 得 a ∈FOLLOW(A)
… =>* abAd 得 d ∈FOLLOW(A) FOLLOW(A)={#,a,d}
FOLLOW(S)
由 S=>* S 得 # ∈FOLLOW(S) 由S=>aA=>abAS=>abbASS =>abbASaA 得 a ∈FOLLOW(S) …=>abbASd
4. 选择集合SELECT(A→ )的定义
定义 对给定的上下文无关文法的产生式 A→ (A∈VN, ∈V*) 若 ≠>*ε,则SELECT(A→ )=FIRST() 若 =>*ε, 则SELECT(A→ ) =(FIRST()-{ε})∪FOLLOW(A)
解释
A的产生式A→1 |2 | 3 | …(A面对应输入符a)
3. 后跟符号集FOLLOW(A)的定义
定义 设G=(VT, VN, P, S)是上下文无关文法, B→xAy (A,B ∈VN x,y ∈(VNVT)* ) FOLLOW(A)={a|S=>*…Aa…,a ∈VT}, 若有S=>* …A,则规定 # ∈FOLLOW(A) (注: # 输入串#,‘#’做为输入串的结束符) 直观上说,非终结符A的后跟符号集是由句型中紧跟A后的那 些终结符(包括#)组成。
初值 第一次 第二次
非终结符集T {A,B} {A,B,S} {A,B,S}收敛
能推出ε的非终结符集T为{A,B,S}
2. 计算每个产生式右部β的FIRST(β)集
首先对文法符号X (XVT VN),求FIRST(X) :
① ②

对每个a VT :First(a)={ a } 对每个AVN :若 A *ε 则 当前First(A)={ε} 否则 当前First(A)={ } 对每个产生式 A→X1…Xj…Xn : First(A)=First(A) SectionFirst(X1…Xj…Xn)
回顾——后跟符号集FOLLOW(A)的定义
定义 设G=(VT, VN, P, S)是上下文无关文法, B→xAy (A,B ∈VN x,y ∈(VNVT)* ) FOLLOW(A)={a|S=>*…Aa…,a ∈VT}, 若有S=>* …A,则规定 # ∈FOLLOW(A) (注: # 输入串#,‘#’做为输入串的结束符) 直观上说,非终结符A的后跟符号集是由句型中紧跟A后的那 些终结符(包括#)组成。
若X1…Xn全可推出ε
则SectionFirst(X1…Xn)= (First(X1) -{ε})∪…∪(FIRST(Xn)-{ε})

重复3直到每个符号的FIRST集合都不再增大为止
例G[S]: S→AB|bC A→b|ε B→aD|ε C→AD|b D→aS|c
ε
d
S =>aA =>abAS =>abS =>abd
要进行确定的自顶向下的分析,文法要满 足一定的限制——即文法是LL(1)文法 先研究三个定义
开始符号集FIRST 后跟符号集FOLLOW
选择集合SELECT
2. 开始符号集FIRST( )的定义
定义:设G=(VN, VT, P, S)是上下文无关文法, α→β (α∈VN , (VNVT)* ) FIRST() = {a | a VT 且* a......} (若* ε 则规定ε ∈FIRST()) 直观上说文法符号串 的开始符号集是由推 导出的所有的终结符开头和可能的ε组成。
其中 SectionFirst(X1…Xj…Xn)
= (First(X1) -{ε}) (First(X2)-{ε})… (First(Xj) -{ε}) First(Xj+1)
Xj+1是产生式右部中第一个不能推出ε的符号
若X1 ≠>*ε 则SectionFirst(X1…Xj…Xn)=First(X1)
在自顶向下的分析中:

对于A→ i且 i ≠>*ε, 若a ∈ First( i ),
则A→i可选

对于A→ j且 j =>*ε,
若a ∈ (First( j)-{ε})∪Follow(A),则A→ j可选
[例] G3[S]: S→aA
若 ≠>*ε,则SELECT(A→ )=FIRST( ) 若 =>*ε, 则SELECT(A→ ) =(FIRST( )-{ε})∪FOLLOW(A)
B→b|dB
S A p
c
c
A
A a
S =>Ap =>cAp =>ccAp =>ccap
例3:设有文法G3[S]
S→aA|d A→bAS| ε 若输入串W=abd,自顶向下的推导过程为: S a A b A S
对于空产生式左部的非终结符,关键是判断 该非终结符的后跟符号(集),分析过程可 能是确定的。 文法的特点——包含空产生式
结论一
针对无空产生式的文法G,同一非终结符的任两个 产生式的右部串的First集无交集,即可进行确定的 自顶向下分析。
结论二
[例] 文法G3[S]:
S→aA|d
A→bAS|ε
{S→aA} = First(aA) = { a }
{S→d} = First(d) = { d } {A→bAS} = First(bAS) = { b } {A→ε} = First(ε) + Follow(A) = {ε} + { #,a,d }
= {ε, # , a , d }
= {#,a,d}
回顾——开始符号集FIRST( )的定义
定义:设G=(VN, VT, P, S)是上下文无关文法, A →β (A∈VN , (VNVT)* ) FIRST() = {a | a VT 且* a......} (若 *ε, 则规定ε∈FIRST()) 直观上说文法符号串 的开始符号集是由推 导出的所有的终结符开头和可能的ε组成。
例1 设有文法G1[S]: S→pA|qB A→cAd|a B→dB|b 若输入串W=pccadd。自顶向下的推导过程为: S p c A A d
G1[S]有如下特点: (1) 每个产生式的右部由终结符开头; (2) 同一非终结符的不同产生式的右部由不 同的终结符开头。
对于这种文法,在推导过程可以根据当前的 输入符号唯一确定选哪个产生式往下推导, 即分析过程是确定的。
SectionFirst(X1…Xj…Xn)
= (First(X1) -{ε}) (First(X2)-{ε})… (First(Xj) -{ε}) First(Xj+1) Xj+1是产生式右部中第一个不能推出ε的符号

对每个产生式 A→X1…Xj…Xn 做:
First(A)=First(A) SectionFirst(X1…Xj…Xn )
4.2 LL(1)文法的判别
要判别一个上下文无关文法是否是LL(1)文法 分为五步: 1. 求能推出ε的非终结符集 2. 计算每个产生式右部β的FIRST(β)集 3. 计算每个非终结符A的FOLLOW(A)集 4. 计算每个产生式A→β的SELECT(A→β)集 5. 按LL(1)文法的定义判别
相关文档
最新文档