自顶向下语法分析方法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
自顶向下方法的关键: 是在推导过程中如何确定的选择候选式的问题。
自顶向下的主要思想: 从开始符出发导出句型并一个符号一个符号地与 给定输入串 (终结符串)进行匹配。如果全部匹配成功, 则表示开始符号可推导出给定的终结符串。因此判定 给定终结符号串是正确句子。
武汉理工大学计算机科学系陈天煌
自顶向下的缺点:
小 结:
从上述推导过程中我们可以在第二步到第三步的推 导中,即abAS abS时,因当前面临输入符号为d,而 最左非终结符A的产生式右部的开始集合都不包括d,但 有ε,因此对于d的匹配自然认为只能依赖于在可能的推 导过程中A的后面的符号。所以这时选用产生式A →ε 往 下推导,而当前A后面的符号为S,S产生式右部的开始 符号包括了d,所以匹配。 由此可以看出,当某一非终结符的产生式中含有空产 生式时,它的非空产生式右部的首符号集两两不相交, 并与在推导过程中紧跟该非终结符右边可能出现的终结 符集也不相交,则仍可构造确定的自顶向下分析。为此 可定义一个文法符号的后继符集合为: (定义5.2)
武汉理工大学计算机科学系陈天煌
定义5Βιβλιοθήκη Baidu2:
设G=(VN , VT ,P,S)是上下文无关文法,A∈VN的后继符集合为: FOLLOW(A)={a|S * μAβ且a∈VT ,a∈ FIRST(β), μ∈VT*,β∈V*} 或 FOLLOW(A)={a | S * …Aa… ,a∈VT} 特别地,若S * …A,则#∈FOLLOW(A) (这里#不是文法中的符号,而一个特别的表示输入串的结束符 或称句子括号如 #输入串#) 表示:所有在句型中紧挨着A后面出现的终结符或#均是 FOLLOW(A)的元素。 因此当文法中含有形如: A→α和 A→β的产生式时,其中 A∈VN ,α,β∈V*,当α和β不同时推导出空串时,设α * * ε, \ ε,β 则当FIRST(α) ∩(FIRST(β)∪FOLLOW(A))=φ时,对于非终结符 A的替代仍可唯一地确定候选。
武汉理工大学计算机科学系陈天煌
(四) 求SELECT(A→α)的算法: (a)求FIRST(α);
(b)若ε∈FIRST(α),则令SELECT(A→α)=FIRST(α)
否则求FOLLOW(A), 并令SELECT(A→α)= (FIRST(α)-{ε})∪FOLLOW(A). 例:有文法:E→TE' E'→+TE' |ε T→FT' T'→*FT' |ε F→i | ( E ) 求其三种集合。
(d)若 X∈VN, y1, y2,…..yi都∈VN,且有产生式X→ y1 y2…..yn, 当y1, y2,…..yi-1 都 * ε时,(其中1≤i≤n),则FIRST(y1)-{ε},
FIRST(y2 )-{ε},….,FIRST(yi-1 ) -{ε},FIRST(yi)都包含在 FIRST(X)中。 (e)当(d)中所有yi * ε(i= 1,2,….,n),
(一) 求FIRST(X)的算法
注:三种集合均为终结符集
对每一文法符号X∈(VN∪VT),求FIRST(X). (a)若X∈VT,则令FIRST(X)={X}; (b)若X∈VN,且有产生式X→a….,(a∈VT),则令a∈FIRST(X); (c) 若X∈VN,有X→ε,则令 ε∈FIRST(X);
武汉理工大学计算机科学系陈天煌
5.1
确定的自顶向下分析思想
例5.1若有文法G[S]: S → pA S S → qB A → cAd A p A→a 若有输入串w = pccadd. c A d 考察自顶向下的推导过程。 解:推导过程为: c A d pccAdd pccadd pA pcAd S a 其相应的语法树见右图: 这个文法的特点: [1]每个产生式的右部都由终结符号开始。 [2]如果两个产生式有相同的左部,那么它们的右部由不同的 终结符开始。 显然对于这样的推导中完全可以根据当前的输入符号决定选择 哪个产生式往下推导。因此分析过程是唯一的。 武汉理工大学计算机科学系陈天煌
在推导过程中,如果对文法不做限制。那么产生 式的选择成为无根据的,只好一一去试所有可能的产 生式,直至成功为止。这种方法的致命弱点是不断地 回溯,大大影响速度。 所以自顶向下分析法又分为确定的和不确定的两种: 确定的分析方法需对文法有一定的限制,但由于 实现方法简单,直观,便于手工构造或自动生成语法 分析器,因此仍是目前常有的方法之一。 不确定的方法即回溯的分析方法。这种方法实际 上是一种穷举的试探方法,因此效率低,代价高,因 此极少使用。
武汉理工大学计算机科学系陈天煌
定义5.3:
定义选择符集合SELECT如下: 对于给出上下文无关文法的产生式 A→α,A∈VN,α∈V*,则
SELECT(A→α) = FIRST(α),
* 当α ﹨ ε时
(FIRST(α)-{ε})∪FOLLOW(A),否则
武汉理工大学计算机科学系陈天煌
三种集合的构造算法:
第5章 自顶向下语法分析方法
语法分析的主要工作: 是识别由词法分析给出的单词序列是否是给定的 语法上正确的句子(程序)。
语法分析常用的方法: 自顶向下的语法分析和自底向上的语法分析两大 类。
武汉理工大学计算机科学系陈天煌
自顶向下分析思想
自顶向下的方法: 从文法的开始符号(设为〈程序〉)开始进行分析, 逐步推导的往下构造语法树,使构造出的树叶正好与所 给定的源程序串(输入串)相同。
武汉理工大学计算机科学系陈天煌
5.2 LL(1)文法的判别
定义5.4:一个上下文无关文法是LL(1)文法的充分必要条件是每个 非终结符A的两个不同产生式,A →α ,A →β ;满足 SELECT(A →α ) ∩ SELECT(A →β )= Ф 。 其中, α、 β 不能同时 * ε。 当一个文法是LL(1)文法时,则该文法一定能够采用确定的 自顶向下的分析方法进行分析。
武汉理工大学计算机科学系陈天煌
(三) 求FOLLOW(A)的算法(A∈ VN): (a)对文法开始符号S,令# ∈ FOLLOW(S). (b)若B→α Aβ 是一个产生式,则令FIRST(β)-{ε} 属于FOLLOW(A); (c) 若B→αA是一个产生式,或B→αAβ是一个产生 式且有ε∈FIRST (β),则令FOLLOW(B)是 FOLLOW(A)的子集。即把FOLLOW(A)的所有元素 加入到FOLLOW(B)中。 (d)反复使用(b)直到每个非终结符的 FOLLOW集合 不再增加为止。
即: FIRST(α)是从α出发推导出的所有符号串首终结
符或可能的ε构成的集合。
武汉理工大学计算机科学系陈天煌
关于文法G2[S]: S Ap S Bq A a A cA B b B dB
文法 G2中,关于S的两个产生式虽然都以非终结 符开始,但它们右部符号串可以推导出首符集合互不 相交,因此可根据当前的输入符号是属于哪个产生式 右部的首符号集合而决定选择相应产生式进行推导。 因此是确定的自顶向下分析。
小结: 在上述推导过程中,对于产生式中相同左部含有 非终结符打头的右部时,在推导中选用哪个产生式是 不能直接知道的。
对输入串W=ccap为输入串时,其第一个当前输入 符号为c,这时从S出发选择S → Ap,还是选择S →Bq。 其根据是要知道 A或B它们是否能推导以c打头的符号 串,即它们的首符集是什么。若c是Ap的首符集的元素, 且不在Bq的首符集中,则选择S →Ap往下推导。反之, 若c在Bq的首符集中,不在Ap的首符集中,则选择S →Bq往下推导。其它情况为不确定推导或出错。 因此,有必要在推导前求出每个文法符号的首符集。
则 FIRST(X)=FIRST(y1)∪FIRST(y2)∪….∪FIRST(yn)∪{ε}
反复使用上述(b)~(d) 步直到每个符号的FIRST集合不再增加 为止。
武汉理工大学计算机科学系陈天煌
(二)求 FIRST(α)的算法(α= x1 x2 …. xn): 1.若n=0,即α=ε,则令FIRST(α)={ε}; 2.否则,对1≤i≤n,求FIRST(xi) 3.若n=1,则令 FIRST(α)=FIRST(x1); 4.若n≥2且对一切j=1,2,….,i-1都有ε∈FIRST(xj). 则令FIRST(xi )-{ε} FIRST(α),其中2≤i≤n; 若对一切 j=1,2,…,n都有ε∈FIRST(xj),则令ε∈FIRST(α) 或:1.把FIRST(x1)中所有非ε元素加入到FIRST(α)中,即 FIRST(α )=FIRST(x1)-{ε }; 若FIRST(x1)包含有ε,则把FIRST(x2)的所有非ε元素加入到 FIRST(α)中,即FIRST(α)=FIRST(α)∪ (FIRST(x2)-{ε}); 若FIRST(x1)和FIRST(x2)都包含有 ε,则把FIRST(x3)的所有 非ε元素加到FIRST(α)中;…… 照此方法继续,一直到考察到xn。 2.若FIRST(xi ),i= 1,2,…,n;即每个FIRST(xi )中都有ε。则将ε加 到FIRST(α)中。特别地, 若 α=ε ,则FIRST(α)={ε}.
例5.2: 若有文法G2[S]:
S Ap S S Bq p A a A A cA B b c A B dB 若有输入串w = ccap。 A c 考察自顶向下的推导过程。 a 解:自顶向下的推导过程为: S Ap cAp ccAp ccap 其相应的语法树见右图: 这个文法的特点: [1]产生式的右部不全是由终结符号开始。 [2]如果两个产生式有相同的左部,它们的右部由不同的终结 符或非终结符开始。 [3]文法中无空产生式。 武汉理工大学计算机科学系陈天煌
武汉理工大学计算机科学系陈天煌
解:
例:有文法:E→TE' E'→+TE'|ε FIRST(E)=FIRST(T)=FIRST(F)={i, ( } FIRST(E')={+,ε} T→FT' FIRST(T')={*,ε} T'→*FT'|ε FOLLOW(E)=FOLLOW(E')={ ),#} F→i| (E) FOLLOW(T)=FOLLOW(T')={+,),#} 求其三种集合。 FOLLOW(F)={*,+,),#} SELECT(E→TE')=FIRST(T)={i,( } SELECT(E'→+TE')=FIRST(+TE')={+} SELECT(E'→ε)=(FIRST(ε)-{ε})∪FOLLOW(E')={),#} SELECT(T→FT')=FIRST(F)={i,(} SELECT(T'→*FT')=FIRST(*FT')={*} SELECT(T'→ε )=(FIRST(ε)-{ε}) ∪FOLLOW(T')={+,),#} SELECT(F→i)=FIRST(i)={i} SELECT(F→(E))=FIRST(i) ={(}
例:设有文法G[S]:S→aAS , S→b , A→bA , A →ε
SELECT(S→aAS)=FIRST(aAS)={a} SELECT(S→b)={b} SELECT(A→bA)={b} SELECT(A→ε)=(FIRST(ε)-{ε}) ∪FOLLOW(A)={a,b} ∵SELECT(S→aAS)∩SELECT(S→b)={a}∩{b}=φ SELECT(A→bA)∩SELECT(A→ε)={b}∩{a,b}≠φ 故文法 G[S]不是LL(1)文法。
武汉理工大学计算机科学系陈天煌
一.首符集,后继符集与选择集的定义: 定义4-1(首符集定义): 设G=(VN ,VT ,P,S)是上下文无关文法,α是 G的任一符号串,则有:
FIRST(α)={a | α * aβ,a∈ VT, α、β ∈V* }
特别地,若α * ε,则规定ε ∈FIRST(α)
武汉理工大学计算机科学系陈天煌
当文法中有空产生式时,如例:
例5.3:
若有文法G3[S]: S→aA S →d A→ bAS A→ε 若有输入串W=abd。 考察自顶向下的推导过程。 解:
S aA abAS abS abd
S a A b A S ε d
相应语法树为右图:
武汉理工大学计算机科学系陈天煌