- 1、本文档共57页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第5章 自顶向下语法分析方法编译原理
第5章 自顶向下语法分析方法 理解 “能使用自顶向下分析技术的文法必须是LL(1)文法” LL(1)文法的充要条件 LL(1)文法的判别 某些 非LL(1)文法 到 LL(1)文法 的等价变换 提取左公共因子 消除左递归(直接左递归、间接左递归) 不确定的自顶向下分析思想 确定的自顶向下分析方法 递归子程序法 预测分析法[判别LL(1)文法;构造预测分析表;分析输入串] 预备知识 5.1 确定的自顶向下分析思想 主要思想: 从文法的开始符号出发,如何根据当前的单词符号, 唯一地确定选用哪个产生式来替换相应的VN向下推导。 文法例1 例1:文法 G1[S]:S→pA S→qB A→cAd A→a B→dB B→b 文法例2 例2: 文法G[S]:S→ApS→BpA→aA→cAB→bB→dB First集合 为得到唯一的推导过程,条件为: 左部相同的产生式,其“右部的首符号集合”不相交。 定义:设 G = (VT ,VN , S , P) 是上下文无关文法,FIRST(α) = {a|α aβ, a∈VT , α,β∈V*}若α ε,则规定ε∈FIRST(α) 文法例3 例3:文法G[S]:S→aAS→dA→bASA→ε Follow集合 定义:设 G = (VT ,VN , S , P) 是上下文无关文法,A∈VN , S是开始符号。 FOLLOW(A)={a|S ?A? 且 a∈FIRST(?), ?∈VT*,?∈V+} 若S ?A? , 且? ε,则规定 #∈FOLLOW(A) #作为输入串的结束符,或称为句子括号, 如:#输入串# SELECT集合 为得到唯一的推导过程,条件为: 当 某一VN的产生式含空产生式, 则 它的非空产生式的First集两两互不相交 且 与推导过程中紧跟该VN可能出现的VT集合也不相交 可得到唯一的推导过程的条件 等价的表示: 若 A→α A→β 其中A∈VN , α, β ∈VN*,α不推导出空,β能推导出空, 则 FIRST(α)∩( (FIRST(β)-{ε}) ∪FOLLOW(A) )=Φ LL(1)文法 定义: 一个上下文无关文法是LL(1)文法的充要条件: 对每个VN,A的两个不同产生式A→α,A→β, 满足 SELECT(A→α) ∩ SELECT(A→β)=φ 其中,α、β不能同时推导出ε。 LL(1)文法判别举例 例4:判断文法G[S]是否为LL(1)文法? G[S]: S → aAS S → b A → bA A → ε 5.2 LL(1)文法的判别 判别步骤: 求出能推出ε的非终结符 计算FIRST集 计算FOLLOW集 计算SELECT集 判别是否是LL(1)文法 例5:设文法G[S] 为: S→ABS→bCA→εA→bB→εB→aDC→ADC→bD→aSD→c 判断它是否是LL(1)文法。 1. 求出能推出ε的非终结符 建立一个以VN的个数为上限的一维数组X[ ],数组元素为VN,对应每个VN有一标志位;(该标志位记录能否推出ε,其值为:“未定”、“是”、“否” ) 置初值——将数组X[ ]中对应的每一个VN的标记置为“未定”; 删除所有右部含VT的产生式,若某一VN为左部的产生式全被删除,则将数组中对应的标记值改为“否”; 若某一的某产生式右部为ε,则数组中对应的标记值为“是”,并删除该VN为左部的所有产生式; 扫描产生式右部的每个VN,若该VN在数组中对应标志为“是”,则删去该VN,转6 ;若该VN在数组中对应标志为“否”,则转7; 若该VN删去后,所在产生式右部为空,则该产生式左部的VN在数组中对应的标志改为“是”,并删去该VN为左部的所有产生式 ;否则转8 ; 删去该产生式,若该产生式左部在剩余的产生式中是唯一的左部(即A→α…,再无其它“A→β”的产生式),则把数组中该VN对应的标志改为“否”; 返回5,直至扫描完一遍文法的产生式后,数组中的标志不再改变。 1. 求出能推出ε的非终结符 S→ABS→bCA→εA→bB→εB→aDC→ADC→bD→aSD→c 2. 计算FIRST集 求First(x)的算法: 若x∈VT ,则first(x)={x} 若X∈VN ,且有产生式 X?a… , a∈VT ,则a∈first(X) 若X∈VN ,x?ε,则ε∈first(X) 若X∈VN ,且有产生式 X?Y1Y2…Yn ,其中Y1,Y2,… Yn都∈VN 当Y1,Y2,… Yi-1都能推导出ε时(1=i=n), 则 first(Y1) - {ε}∈first(X
文档评论(0)