第5章 自顶向下语法分析方法3
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
w=abd试图推导的过程: S aA abAS abS abd
选择A的产生式的依据 FIRST(bAS)={b} FIRST(ε)={ε} 分析:
无d,但若A为ε,则A的后面能推出d
思考:若A有一条产生式能推出ε,则需要寻找什么?
FOLLOW(A)定义:设 G = (VT ,VN , S , P) 是上下文无关 文法,A∈VN , S是开始符号。 FOLLOW(A) = {a|S* A且a∈FIRST(), ∈VT*,∈V+ } * * 若S A,且 ε,则规定 #∈FOLLOW(A) 直观定义理解: FOLLOW(A)={a|S * …Aa…,a∈VT } 若S * … … A,则规定 #∈FOLLOW(A) #作为输入串的结束符,或称为句子括号,如: #输入串# FOLLOW(A)表示句型中可能紧跟在A后面的终结符号 例:G3[S]: S→aA|d A→bAS|ε 求FOLLOW(A) =?
例3 文法 G3[S]: S→aA S→d A→bAS A→ε
w=abd试图推导的过程: S aA abAS abS abd
选择A的产生式的依据 FIRST(bAS)={b} FIRST(ε) ∪FOLLOW(A) = {ε,a,d,#}
思考: 若2型文法中含有ε产生式,如何唯一确定候 选产生式?
SELECT(S→aA) ∩ SELECT(S→d) ={a}∩{d}=Φ SELECT(A→bAS)∩SELECT(A→ε) ={b}∩{a,d,#}=Φ 所以该文法是LL(1)文法。
例:设文法G[S] 为: S→aAS|b A→bA|ε
SELECT(S→aAS) SELECT(S→b) SELECT(A→bA) SELECT(A→ε) ={a} ={b} ={b} ={a,b}
2型文法中对于 A→α A→β其中A∈VN , α,β∈VN*, 当α和β不同时推导出空时(设 α不推导出空,β推导出 空),则当
FIRST(α)∩(FIRST(β)∪FOLLOW(A))=Φ时,对于 非终结符A的替换仍可唯一地确定候选。
SELECT定义:给定上下文无关文法的产生式A→α, A∈VN , α∈V*, ① 若α *ε,则SELECT(A→α)=FIRST(α) ② 如果α * ε,则 SELECT(A→α)={FIRST(α)-{ε}}∪FOLLOW(A) P72 SELECT(A→α) 表示选择此产生式得到的终结符号集 定义:一个上下文无关文法是LL(1)文法充要条件: 对每个非终结符A两个不同产生式A→α和A→β,满 足:SELECT(A→α)∩SELECT(A→β)=Φ 其中α,β不能同时 * ε
FIRST(S)={a,b,ε} FIRST(A)={b, ε} FIRST(B)={a, ε} FIRST(C)={a,b,c} FIRST(D)={a,c} FIRST(AB)={a,b,ε} FIRST(AD)={a,b,c} FOLLOW(S)= {#} FOLLOW(A)= {a,c,#} FOLLOW(B)= {#} FOLLOW(C)= {#} FOLLOW(D)= {#}
SELECT(S→aAS) ∩ SELECT(S→b)={a}∩{b}=Φ SELECT(A→bA)∩SELECT(A→ε)={b}∩{a,b}≠Φ 所以该文法不是LL(1)文法。 思考:输入串 #ab#的推导?
例文法: G[S]: S→aAS|b A→bA|ε
SELECT(S→aAS) SELECT(S→b) SELECT(A→bA) SELECT(A→ε)
第一个L:自顶向下分析是从左向右扫描输入串。 第二个L:分析过程中将用最左推导。 1:只需向右看一个符号可决定选择哪个产生式进行推导。
例:文法G[S]是否是LL(1)文法? S→aA|d A→bAS|ε
SELECT(S→aA) SELECT(S→d) SELECT(A→bAS) SELECT(A→ε) ={a} ={d} ={b} ={a,d,#}
例:设文法G[S] :
S→AB S→bC A→ε A→b B→ε B→aD C→AD C→b D→aS D→c
1.求出能推出ε的非终结符
非终结符 初值 第一次扫描 第二次扫描 是
S
A
B
C
D
未定 未定 未定 未定 未定 是 是 否 否
能推出ε的非终结符: S、A、D
判断否是LLБайду номын сангаас1)文法?
2.计算FIRST集
FOLLOW(S)={#}∪FOLLOW(D) FOLLOW(A)={a}∪{a,c}∪FOLLOW(S) //? FOLLOW(B)=FOLLOW(S) FOLLOW(C)=FOLLOW(S) FOLLOW(D)=FOLLOW(B)∪FOLLOW(C) FOLLOW(S)= {#} //??? FOLLOW(A)= {a,c,#} FOLLOW(B)= {#} FOLLOW(C)= {#} FOLLOW(D)= {#}
思考:该文法的特点? ① 2型文法且无空产生式。 ② 如果两个产生式有相同左部,那么它们右部由不同终结 符或非终结符开始。
分析能确定推导原因:
① ②
前提:2型文法中无空产生式
在文法中,对于每个非终结符A的定义
A→α1|α2|...|αn 任给i,j(1≤i,j≤n,i<>j),从αi和αj推导出来的第一个 终结符号集合(称为开始符号集FIRST)不相交, 即:FIRST(αi)∩FIRST(αj)=Φ
③
结论 : 在推导过程中完全可以根据向前看符号 是属于哪个产生式右部的开始符号集合而决定选 择相应的产生式进行推导,因此,分析过程是完 全确定的。
FIRST定义:设 G = (VT ,VN , S , P) 是2型文法, * FIRST(α) = {a|α aβ,a∈ VT,α,β ∈ V*} * 若α ε,则规定ε∈FIRST(α) 直观定义理解: FIRST(α)={a|α *a … … ,a∈VT } FIRST(α)包含了α对应的串的所有可能的首终结 符号集(选择产生式的依据)
说明:找出所有关于含某个非终结符的左部的 产生式,结合右部特点,求FIRST。
FIRST(S)=FIRST(AB) ∪{b}={a,b,ε}
S→AB S→bC A→ε A→b B→ε B→aD C→AD C→b D→aS D→c
FIRST(A)={b, ε} FIRST(B)={a, ε} FIRST(C)= FIRST(AD) ∪{b}={a,b,c} FIRST(D)={a,c} FIRST(AB)=(FIRST(A)-{ε}) ∪(FIRST(B)-{ε}) ∪{ε}={a,b,ε} FIRST(AD)=(FIRST(A)-{ε}) ∪FIRST(D)={a,b,c}
3.计算FOLLOW集 对于文法的开始符号S,置#于FOLLOW(S) 中; ② 若A→αBβ是一个产生式,则把FIRST(β)-{}加至 FOLLOW(B)中; ③ 若A→αB是一个产生式,或A→αBβ是一个产生 * 式,而β (即FIRST(β)),则把FOLLOW (A)加至FOLLOW(B)中. (第3点举例说明)
={a} ={b} ={b} ={a,b}
对输入串w=ab进行推导: S aAS abAS abS S aAS aS ab 说明: 只有是LL(1)文法,自顶而下方法分析才是确定的
出错
正确
5.2 LL(1)文法的判别
1. 2. 3. 4.
5.
求出能推出ε的非终结符 计算FIRST集 计算FOLLOW集 计算SELECT集 判别是否是LL(1)文法
1.
例1: 文法G1[S]: S→pA|qB A→cAd|a B→dB|b
例2: 文法G2[S]: S→Ap|Bq A→a|cA B→b|dB
w=pccadd自顶向下的推导过程:
S pA pcAd pccAdd pccadd
w=ccap自顶向下的推导过程: S Ap cAp ccAp ccap
1.
5.1 确定的自顶向下分析思想
确定的自顶向下的分析方法 在推导过程中,可以完全根据向前看符号唯一 决定选择哪个产生式往下推导,因此,分析过程是 完全确定的。这种分析称为确定的自顶向下分析 方法。 特征——根据下一个输入符号为当前要处理的非 终结符选择产生式 要求——文法是LL(1)的 第一个L从左到右扫描输入串 第二个L 生成的是最左推导 向前看一个输入符号(lookahead)
①
文法G3[S]: S→aAe|Ad A→bB|bBf B→c
思考:
FOLLOW(S) = FOLLOW(A) = {e,d} FOLLOW(B) = {f,..?}
说明:找出所有关于含某个非终结符的右部的 产生式,结合右部特点,求FOLLOW。
S→AB S→bC A→ε A→b B→ε B→aD C→AD C→b D→aS D→c
③ A→αβ1|αβ2|…|αβn 变换为
w=ccap自顶向下的推导过程: 如例2文法G2[S]: S Ap cAp ccAp ccap
S→Ap|Bq A→a|cA B→b|dB
选择S的产生式的依据
FIRST(Ap)={a,c} FIRST(Bq)={b,d}
思考:FIRST(S)=?意味?
例3 文法 G3[S]: S→aA S→d A→bAS A→ε
① 若XV,则FIRST(X)={X} ② 若XVN,且有产生式Xa…,则a∈FIRST(X);
若X也是一条产生式,则∈FIRST(X). ③ 若XY…是一个产生式且YVN,则把FIRST(Y)中的 所有非元素都加到FIRST(X)中; 若X Y1Y2…YK 是一个产生式,Y1,Y2,…,Y(k-1)都 是非终结符,而且,对于任何j,1≤j ≤k-1,FIRST(Yj)都 含有(即Y1..Y(k-1) * ),则把FIRST(Yj)中的所有 非元素与FIRST(Yk)都加到FIRST(X)中; 特别是,若所有的FIRST(Yj, j=1,2,…,K)均含有,则 把加到FIRST(X)中. (注意第3点)
4.计算SELECT集
S→AB S→bC A→ε A→b B→ε B→aD C→AD C→b D→aS D→c
SELECT(S→AB)={a,b,#} SELECT(S→bC)={b} SELECT(A→ε)={a,c,#} SELECT(A→b)={b} SELECT(B→ε)={#} SELECT(B→aD)={a} SELECT(C→AD)={a,b,c} SELECT(C→b)={b} SELECT(D→aS)={a} SELECT(D→c)={c}
第5章 自顶向下语法分析方法
考查重点 1. 自上而下语法分析的基本思想 2. 求FIRST、FOLLOW、SELECT集合 的方法 3. 提取左公因子与消除左递归的方法 4. 递归下降分析程序的构造 5. LL(1)文法的判定,分析表的构造与 输入串的分析过程
语法分析的任务
语法分析是编译过程的核心部分。 2. 语法分析的作用:识别由词法分析输出的单词序列是否 符合该语言的文法(?)正确句子(程序)。 3. 分析方法 ① 自顶向下分析法(确定与不确定 ) 从推导的角度看,从识别符号出发,试图推导出与输入 符号串相同的符号串。一般来讲,推导是最左推导。 构造推导的关键问题: 在构造最左推导的过程中,面对当前读入的单词符号(向 前看符号)和当前被替换的非终结符两者,应该选择这个 非终结符的哪条候选式去替换它(推导)。 ② 自底向上分析法(算符优先、LR分析器)
该文法不是LL(1)文法。
5.3某些非LL(1)文法到LL(1)文法的等价变换
提取左公共因子 消除左递归
一、提取左公共因子
①
A→αβ|αγ导致SELECT(A→αβ)∩ SELECT(A→αγ)≠Φ,因此非LL(1)文法。
② 等价变换为A→α(β|γ),然后:
A→αA' A' → β|γ