编译原理 第四节 语法分析-自上而下分析.ppt

编译原理 第四节 语法分析-自上而下分析.ppt

  1. 1、本文档共34页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四章 语法分析-自上而下分析 4.1 语法分析器的功能 4.2 自上而下分析面临的问题 4.3 LL(1)分析法 4.4 递归下降分析程序构造 4.5 预测分析程序 4.6 LL(1)分析中的错误处理 4.1 语法分析器的功能 功能定义: 按照文法产生式,识别输入符号串是否为一个句子。 技术路线: 是否能从文法的开始符号出发推导出这个输入串。或者,建立一颗与输入串相匹配的语法分析树。 策略: 自上而下分析法,自下而上分析法。 4.2 自上而下分析面临的问题 例4.1 假定有文法 (1) S?xAy (2)A?**|* 对输入串x*y,构造语法树。 构造过程: (1)把S作为根 (2)用S的产生式构造子树 (3)让输入串指示器IP指向输入串的第一个符号。 (4)调整输入串指示器IP与叶结点进行匹配。 (5)如果为非终结符,用A的下一个产生式构建子树。 (6)如果匹配成功则结束;否则,回溯到步骤(4)。 自上而下分析法的缺点: 是文法的左递归性问题。一个文法是含有左递归的自上而下的分析过程陷入无限循环。如P?P?。 由于有回溯,就会产生一大堆麻烦事情。 在上述的自上而下分析过程中,当一个非终结符用某一候选匹配成功时,这种成功可能仅是暂时的。这种虚假现象,我们需要更复杂的回溯技术。一般说,要消除虚假匹配是很困难的。 当最终报告分析不成功时,我们不知道输入串中出错的确切位置。 4.3 LL(1)分析法 4.3.1 左递归的消除 4.3.2 消除回溯、提左因子 4.3.3 LL(1)分析条件 4.3.1左递归的消除 一个简单例子: 已知文法:P?P?|?是一个左递归文法,它的等价的非左递归文法为: P?? P’ P’ ? ?P’|? 例2.2 一般转换规则有: P?P?1| P?2| …| P?m| ?1 | ?2 |…| ?n改写成 P??1P’|?2P’ |…|?nP’ P’??1P’ |?2P’| …|?mP’ | ? 其中: ?i都不以P开头, ?I不等于? 一个反例: 文法:S?Qc|c;Q?Rb|b;R?Sa|a虽然不是直接左递归,但S、Q、R都是左递归。 消除左递归算法: 算法的思想是: 首先构造直接左递归; 再利用一般转换规则,消除直接左递归 化简文法。 下面算法在不含P?P,也不含?在右部产生式时可以消除左递归。 消除一个文法的左递归算法: (1)把文法G的所有非终结符按任一种顺利排列成P1…Pn;按此顺序执行; (2) FOR i:=1 TO n DO BEGIN FOR j:=1 TO i-1 DO 把形如Pj+1→Pj ?的规则改写成 Pj+1??1?|?1?|…?k?|。其中Pj??1|?1|…?k是关于Pj的 所有规则; 消除关于Pi规则的直接左递归性。 END 化简由(2)所得的文法。即去除那些从开始符号出发永远无法到达的非终结符的产生规则。 例子4.3: 对4.3文法,它的非终结符排序为R,Q,S。把R代入Q,Q代入S得到:S?Sabc|abc|bc|c 消除左递归后得到: S?abcS’|bcS’|cS’ S’?abcS’|? Q?Sab|ab|b(化简消去) R?Sa|a(化简后消去) 对不同的排列,会有不同形式的无左递归文法,但它们等价。 4.3.2 消除回溯、提左因子 消除回溯的思路: 对输入符号a,指派一个A的候选式?1与a匹配,而再没有其他候选式?i的字符与a匹配。 通过提取公共左因子,判断首字符集的差异。 首字符集定义: 对G的所有非终结符的每个候选?,它的首字符集为 FIRST(?)={a| ??a…,a?VT},若??*?,则规定? ? FIRST(?)。 提取公共左因子算法: A???1|??2|…|??n|?1|?2|… |?m(其中每个? 不以?开头) 那么可以把这些规则改写成: A??A’|?1|?2|… |?m A’??1|?2|…|?n 例4.4 上述算法的不足: 当非终结符A面临输入符号a,且a不属于A的任意候选首符集,但A的某个候选首符集包?含时,就一定可以使A自动匹配。这是一种错误。 4.3.3 LL(1)分析条件 定义FOLLOW(A) 集合: 假定S是文法G的开始符号,对于G的任何非终结符A,我们定义 FOLLOW(A)={a|S?*…Aa…,a∈VT} 若S?*…A,则规定#∈FOLLOW(A)。 LL(1)文法的充分必要条件: 文法不含左递归。 若A→?1|?2|…|?n,则FIRST(?i)∩FIRST(?j)=Φ (i≠j) 对文法中的每个非终结符A,若它存在某个候选首符集包含ε,则FIRST(A)∩FOLLOW(A)=Φ LL(1)匹配算法: 对输入符号a,A

您可能关注的文档

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档