软件工程 编译原理 第五章 自顶向下的语法分析方法.ppt

软件工程 编译原理 第五章 自顶向下的语法分析方法.ppt

  1. 1、本文档共51页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
软件工程 编译原理 第五章 自顶向下的语法分析方法

第5章 自顶向下的语法分析方法 语法分析的作用是识别由词法分析给出的单词符号序列是否是给定文法的正确句子(程序)。 目前语法分析常用的方法有: 1、自顶向下(自上而下)分析 2、自底向上(自下而上)分析 5.3非LL(1)文法到LL(1)文法的等价转换 确定的自顶向下分析要求给定语言的文法必须是 LL(1)形式。然而,不一定每个语言都是LL(1)文法,对一个语言的非LL(1)文法是否能变换为等价的LL(1)形式以及如何变换是我们讨论的主要问题。由LL(1)文法的定义可知若文法中含有左递归或含有左公共因子,则该文法肯定不是LL(1)文法,因而,我们设法消除文法中的左递归,提取左公共因子对文法进行等价变换。 1、提取公共左因子 若文法中含有形如:A→αβ|αγ的产生式,这导致了对相同左部的产生式其右部的FIRST集相交,也就是 SELECT(A→αβ)∩SELECT(A→αγ) ≠ φ ? ,不满足LL(1)文法的充分必要条件。 1、提取公共左因子 方法:假定关于A的规则是: A→?? 1 | ?? 2 | …| ?? n | ? 1 | ? 2 | … | ?m (其中,每个? 不以?开头) 那么,可以把这些规则改写成 A→?A? | ? 1 | ? 2 | … | ? m A?→? 1 | ? 2 | … | ? n 经过反复提取左因子,就能够把每个非终结符(包括新引进者)的所有候选首符集变成为两两不相交。 2、消除左递归 (1)直接消除产生式中的左递归:假定关于非终结符P的规则为: P→P? | ? 其中?不以P开头。 可以把P的规则等价地改写为如下的非直接左递归形式: P→?P? P?→?P?|? 一般而言,假定P关于的全部产生式是 P→P?1 | P?2 | … | P?m | ?1 | ?2|…|?n 其中,每个?都不等于?,每个?都不以P开头 那么,消除P的直接左递归性就是把这些规则改写成: P→?1P? | ?2P? | … | ?nP? P?→?1P? | ?2P? |… | ?mP? | ? 例 文法G(E): E→E+T | T T→T*F | F F→(E) | i 经消去直接左递归后变成: E→TE? E?→+TE? | ? T→FT? T?→*FT? | ? F→(E) | i (3)消除间接左递归的算法 把文法G的所有非终结符按任一种顺序排列成P1,P2,…,Pn;按此顺序执行; FOR i:=1 TO n DO BEGIN FOR j:=1 TO i-1 DO 把形如Pi→Pj?的规则改写成 Pi→?1?|?2?|…|?k? ; (其中Pj→?1|?2|…|?k是关于Pj的所有规则) 消除关于Pi规则的直接左递归性 END 化简由2所得的文法。去除那些从开始符号出发永远无法到达的非终结符的产生规则。 例 考虑文法G(S) S→Qc|c Q→Rb|b R→Sa|a 令它的非终结符的排序为R、Q、S。 对于R,不存在直接左递归。 把R代入到Q的有关候选后,把Q的规则变为 Q→Sab | ab | b 例 考虑文法G(S) S→Qc|c Q→Rb|b R→Sa|a 令它的非终结符的排序为R、Q、S。 Q的规则变为 Q→Sab | ab | b 现在的Q不含直接左递归,把它代入到S的有关候选后,S变成 S→Sabc | abc | bc | c 例 考虑文法G(S) S→Qc|c Q→Rb|b R→Sa|a S变成 S→Sabc | abc | bc | c 消除S的直接左递归后: S→abcS? | bcS? | cS? S?→abcS? | ? Q→Sab |ab | b R→Sa|a 例 考虑文法G(S) S→Qc|c Q→Rb|b R→Sa|a 消除S的直接左递归后: S→abcS? | bcS? | cS? S?→abcS? | ? Q→Sab |ab | b R→Sa|a 关于Q和R的规则已是多余的,化简为: S→abcS? | bcS? | cS? S?→abcS? | ?

文档评论(0)

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

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

1亿VIP精品文档

相关文档