- 1、本文档共53页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第4章自顶向下的语法分析
1
???
2
语法分析是在词法分析识别出的单词符号串的基础上,分析并判定句子的语法结构是否符合语法规则。
3
自顶向下分析法就是从文法的开始符号出发,不断建立直接推导,试图构造一个最左推导序列,最终由它推导出与输入符号串完全匹配(相同)的句子。
从语法树的角度看,自顶向下分析法就是以开始符号为根节点,试图向下构造一棵语法树,其端末结符号串与输入符号串相同。
§4.1 左递归与回溯
4
5
为了得到一个符号串的最左推导,需要对每一步应使用的产生式进行判断,即反复使用有关产生式的各个候选式进行试探,以便找到应该使用的产生式。
分析中出现的问题1:左递归问题
6
若采用自顶向下的语法分析,应消除文法中存在的左递归。
因为左递归的存在,有可能使推导不能结束,分析陷入循环状态。
例如:A → Aa | b
7
从各种可能的选择中随机挑选一种,并希望它是正确的。
如果以后发现它是错误的,必须退回去,再试另外的选择这种方式称为回溯。
回溯代价极高,效率很低。
分析中出现的问题2:回溯问题
8
从文法的开始符号出发,如何根据当前的输入符号(单词符号)唯一地确定选用哪个产生式替换相应非终结符往下推导,或构造一棵相应的语法树。
在自上而下的分析方法中如何选择使用哪个产生式进行推导?
假定要被替换的最左非终结符号是B,且有n条规则:B→A1|A2|…|An,那么如何确定用哪个右部去替代B?
§4.2 FIRST和FOLLOW集合的构造
9
例1:输入串w=pccadd是否是合法的句子?
10
G:S→pA|qB A→cAd|a B→dB|b
总结:本题中对于一个非终结符,存在若干个候选式,即产生式形如:P→α1|α2|……|αn
每个候选式的第一个字符都是终结符,且都不相同。这时可直接选用与当前输入符号相同的那个候选式来替换P。
S=pA=pcAd=pccAdd=pccadd
例2:输入串w=ccap是否是合法的句子?
11
G:S→Ap|Bp A→a|cA B→b|dB
S=Ap=cAp=ccAp=ccap
总结:本题不像上题选用产生式那样直观。
关于S产生式的候选式都以非终结符开始,但它们可推导出的首字符集合不相交,因而可根据当前的输入符号属于哪个候选式的首字符集合而决定选择相应的候选式进行推导。
FIRST集
12
FIRST集就是一个文法符号串的开始符号集合。
设G=(VT,VN,S,P)是上下文无关文法,FIRST(α)={a|α=*aβ,a∈VT,α,β∈v*}
若α=* ε ,则规定ε ∈ FIRST(α)。
FIRST(α)是α的所有可能推导的开头终结符或可能的ε。
计算FIRST集
13
1.若X?V?,则FIRST(X)={X};
2.若X?VN,且有产生式X?a…,则把a加入到FIRST(X)中;若X??也是一条产生式,则把?也加到FIRST(X)中。
3.若X?Y…是一个产生式且Y?VN,则把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)中。
例3:输入串w=abd是否是合法的句子?
14
G:S→aA|d A→bAS|ε
总结:本题中对于一个非终结符,存在若干个候选式,并且其中含有ε,即形如:P→α1|α2|……| ε,情况更为复杂。
因此,当某一非终结符的候选式含有ε时,它的非空候选式的首字符集两两不相交,并与在推导过程中紧跟该非终结符可能出现的终结符集也不相交,即可唯一确定要选用的候选式。
S=aA=abAS=abS=abd
FOLLOW集
15
FOLLOW集就是一个文法符号的后跟终结符号的集合。
设G=(VT,VN,S,P)是上下文无关文法,A∈VN,S是开始符号。
FOLLOW(A)={a|S=*…Aa…,a ∈VT}
若有S=*…A,则规定# ∈ FOLLOW(A)。
FOLLOW(A)是所有出现在紧接
文档评论(0)