编译基本原理复习.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
5.1.2 规范归约 定义:令G是一个文法,S是文法的开始符号,假定???是文法G的一个句型,如果有 且 则?称是句型???相对于非终结符A的短语。 特别是,如果有A??,则称?是句型???相对于规则A? ?的直接短语。一个句型的最左直接短语称为该句型的句柄。 把上例倒过来写,则得到: S ? aAcBe? aAcde ? aAbcde ? abbcde 显然这是一个最右推导。 规范归约是一个最右推导的逆过程 最左归约 规范推导 由规范推导推出的句型称为规范句型。 首先必须定义任何两个可能相继出现的终结符a与b (可能中间有VN), 的优先关系 三种关系 a·b a的优先级低于b a b a的优先级等于b a·b a的优先级高于b 注意:与数学上的,,=不同 a · b并不意味着b·a 算符优先分析法 5.2.1 算符优先文法及优先表构造 一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下形式的产生式右部: …QR… 则我们称该文法为算符文法。 约定: a、b代表任意终结符; P、Q、R代表任意非终结符; ‘…’代表由终结符和非终结符组成的任意序列,包括空字。 假定G是一个不含?-产生式的算符文法。对于任何一对终结符a、b,我们说: 1. a b 当且仅当文法G中含有形如P→…ab…或P→…aQb…的产生式; 3. a · b 当且仅当G中含有形如P→…Rb…的产生式,而 R …a或R …aQ。 2. a · b 当且仅当G中含有形如P→…aR…的产生式, 而R b…或R Qb…; 如果一个算符文法G中的任何终结符对(a,b)至多只满足下述三关系之一: a · b,a b, a · b 则称G是一个算符优先文法。 从算符优先文法G构造优先关系表的算法。 通过检查G的每个产生式的每个候选式,可找出所有满足a b的终结符对。 确定满足关系· 和· 的所有终结符对: 首先需要对G的每个非终结符P构造两个集合FIRSTVT(P)和LASTVT(P): a · b 当且仅当G中含有形如P?…aR…的产生式, 而R b…或R Qb…; 从算符优先文法G构造优先关系表的算法。 通过检查G的每个产生式的每个候选式,可找出所有满足ab的终结符对。 确定满足关系· 和· 的所有终结符对: 首先需要对G的每个非终结符P构造两个集合FIRSTVT(P)和LASTVT(P): a · b 当且仅当G中含有形如P?…Rb…的产生式,而 R …a或R …aQ。 从算符优先文法G构造优先关系表的算法。 通过检查G的每个产生式的每个候选式,可找出所有满足ab的终结符对。 确定满足关系· 和· 的所有终结符对: 首先需要对G的每个非终结符P构造两个集合FIRSTVT(P)和LASTVT(P): 比较 比较 有了这两个集合之后,就可以通过检查每个产生式的候选式确定满足关系· 和·的所有终结符对。 假定有个产生式的一个候选形为 …aP… 那么,对任何b?FIRSTVT(P),有 a · b。 假定有个产生式的一个候选形为 …Pb… 那么,对任何a?LASTVT(P),有 a · b。 数据结构: 布尔数组F[P,a],使得F[P,a]为真的条件是,当且仅当a?FIRSTVT(P)。开始时,按上述的规则(1)对每个数组元素F[P,a]赋初值。 栈STACK,把所有初值为真的数组元素F[P,a]的符号对(P,a)全都放在STACK之中。 运算: 如果栈STACK不空,就将顶项逐出,记此项为(Q,a)。对于每个形如 P→Q… 的产生式,若F[P,a]为假,则变其值为真且将(P,a)推进STACK栈。 上述过程必须一直重复,直至栈STACK拆空为止。 如果把这个算法稍为形式化一点,我们可得如下所示的一个程序(包括一个过程和主程序): PROCEDURE INSERT(P,a); IF NOT F[P,a] THEN BEGIN F[P,a]:=TRUE; 把(P,a)下推进STACK栈 END; 主程序: BEGIN FOR 每个非终结符P和终结符a DO F[P,a]:=FALSE; FOR 每个形如P→a…或P→Qa…的产生式 DO INSERT(P,a); WHILE STACK 非空 DO BEGIN 把STACK的顶项,记为(Q,a),上托出去; FOR 每条形如P→Q…的产生式 DO INSERT(P,a); END OF WHIL

文档评论(0)

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

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

1亿VIP精品文档

相关文档