- 8
- 0
- 约4.04千字
- 约 29页
- 2017-06-08 发布于湖北
- 举报
第4章 自顶向下的语法分析方法
第4章 自顶向下的语法分析方法; 自顶向下分析法也就是从文法的开始符号出发企图推导出与输入的单词串完全相匹配的句子,若输入串是给定文法的句子,则必能推出,反之必然出错。; 回顾在“文法和语言”一章中介绍的关于句子、句型和语言的定义及什么叫最左推导、最右推导和规范推导的基本概念。;句型的分析 句型分析就是识别一个符号串是否为某文法的句型,是某个推导的构造过程。 ;句型分析的有关问题 ① 如何选择使用哪个产生式进行推导? 假定要被替换的最左非终结符号是V,且左部为V的规则有n条:V→A1|A2|…|An,那么如何确定用哪个右部去替换V呢? ② 如何识别可归约的串? 在自下而上的分析方法中,在分析程序工作的每一步,都是从当前串中寻找一个子串,看它是否能归约到文法的某个非终结符号,该子串称为“可归约串”。;4.1 确定的自顶向下分析思想; ?????;例4.1
若有文法G1[S]: S → pA |qB A →cAd|a B →d B |c
这个文法有以下两个特点: ① 每个产生式的右部都由终结符号开始。 ② 如果两个产生式有相同的左部,那么它们的右部由不同的终结符开始。即每个产生式的右部的开始终结符不同。 对于这样的文法显然在推导过程中完全可以根据当前的输入符号决定选择哪个产生式往下推导,因此分析过程是唯一确定的。;例4.2
若有文法G2[S]: S → Ap |Bq A →a|cA B →b|dB 识别输入串w=ccap是否是G2[S]的句子,那么试探推出输入串的推导过程为 :
S ? Ap ? cAp ? ccAp ? ccap
试探推导成功。;例4.2
若有文法G2[S]: S → Ap |Bq A →a|cA B →b|dB
此文法的特点是:
① 产生式的右部不全是由终结符开始。 ② 如果两个产生式有相同的左部,它们的右部是由不同的终结符或非终结符开始。
③ 文法中无空产生式。;例4.2 若有文法G2[S]: S → Ap |Bq A →a|cA B →b|dB
对于产生式中相同左部含有非终结符开始的产生式时,在推导过程中选用哪个产生式不像例4.1文法那样直观,对于 W=ccap 为输入串时,其第一个符号是c,这时从S出发选择 S→Ap 还是选择 S→Bq,需要知道,Ap或Bq它们的开始终结符号集合是什么?因为c是包含在Ap的开始终结符号集合中,且不包含在Bq的开始终结符号集合中,则选择 S→Ap 往下进行推导。;一个文法符号串的终结符的首符集定义如下:??
定义4.1 设G=(VT,VN,S,P)是上下文无关文法 FIRST(α)={a|α ?? aβ,a∈VT,α,β∈V*} 若α ?? ε,则规定ε∈FIRST(α)。;
FIRST(Ap)={a,c} FIRST(Bq)={b,d} 因此有 FIRST(Ap)∩(FIRST(Bq)= ? ? 此时可以根据当前的输入符号是属于哪个产生式的FIRST集而决定选择相应产生式进行推导,因此仍能构造确定的自顶向下分析。;例4.3 若有文法G3[S]: S → aA|d A →bAS|ε 识别输入串w=abd是否是G3[S]的句子
试探推导出abd的推导过程为: S ? aA ? abAS ? abS ? abd
试探推导成功。
当一个文法中相同左部非终结符的右部存在能 ?? ε的情况则必须知道该非终结符的后跟符号的集合中的符号是否可以唯一地确定选择哪个产生式。;一个文法非终结符的后跟符号的集合如下:
定义4.2: 设 G=(VT,VN,S,P)是上下文无关 文法,A∈VN,S是开始符号 FOLLOW(A)={a|S ?? μAβ,且a∈VT,a∈FIRST(β),μ∈VT* ,β∈V+} 若S ?? μAβ,且β ?? ε, 则#∈FOLLOW(A)。 也可定义为:FOLLOW(A)={a|S ?? …Aa…,a ∈VT} 若有S ?? …A,则规定#∈FOLLOW(A) 这里我们用#作为输入串的结束符,或称为句子括号,如:#输入串#。;因此当文法中含有形如: A→α A→β 的产生式时,其中A∈VN,α,β∈V*,当α,β不同时推导出空时,设α ??ε,β ?? ε,则当FIRST(α)∩( FIRST(β)∪FOLLOW(A))= ? 时,
原创力文档

文档评论(0)