编译原理课件Chapt53学习课件.pptVIP

  1. 1、本文档共83页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理 第五章 语法分析——自下而上分析 SLR 分析 LR(0) 方法对文法的要求严格,现实中很难保证文法的符合LR (0) 通过对非终结符跟随符号的展望可以解决部分 LR(0) 分析冲突 假定一个LR(0)规范族中含有如下的一个项目集(状态): I={X→?·b?,A→?·,B→?·}。 若FOLLOW(A)和FOLLOW(B)的交集为?,且不包含b,那么,当状态I面临任何输入符号a时,可以: 1. 若a=b,则移进; 2. 若a?FOLLOW(A),用产生式A→?进行归约; 3. 若a?FOLLOW(B),用产生式B→?进行归约; 4. 此外,报错。 假定LR(0)规范族的一个项目集 I={A1→?·a1?1,A2→?·a2?2,…,Am→?·am?m,B1→?·,B2→?·,…,Bn→?·} 如果集合{a1,…,am},FOLLOW(B1),…,FOLLOW(Bn)两两不相交(包括不得有两个FOLLOW集合有#),则: 1. 若a是某个ai,i=1,2,…,m,则移进; 2. 若a?FOLLOW(Bi),i=1,2,…,n,则用产生式Bi→?进行归约; 3. 此外,报错。 冲突性动作的这种解决办法叫做SLR(1)解决办法。 SLR 分析的特点 SLR 的 DFA 与 LR(0) 完全相同! 不同在于构造分析表的方法不同 对于 LR(0) 存在冲突的状态,SLR 可以通过计算 Follow 集来判断移进还是规约,以及用哪条产生式规约 SLR(1) 与 LR(0) LR(0)只看分析栈的内容,不考虑当前输入符 SLR(1)考虑输入符,用 Follow 集来解决冲突,因此SLR(1)要比LR(0)分析能力强 构造SLR(1)分析表方法: 首先把G拓广为G?,对G?构造LR(0)项目集规范族C和活前缀识别自动机的状态转换函数GO. 然后使用G?和GO,按下面的算法构造SLR分析表: 令每个项目集Ik的下标k作为分析器的状态,包含项目S?→·S的集合Ik的下标k为分析器的初态。 分析表的ACTION和GOTO子表构造方法: 1. 若项目A→?·a?属于Ik且GO(Ik,a)=Ij,a为终结符,则置ACTION[k,a]为 “sj”; 2. 若项目A→?·属于Ik,那么,对任何终结符a,a?FOLLOW(A),置ACTION[k,a]为 “rj”;其中,假定A??为文法G?的第j个产生式; 3. 若项目S?→S·属于Ik,则置ACTION[k,#]为“acc”; 4. 若GO(Ik,A)=Ij,A为非终结符,则置GOTO[k,A]=j; 5. 分析表中凡不能用规则1至4填入信息的空白格均置上“出错标志”。 按上述方法构造出的ACTION与GOTO表如果不含多重入口,则称该文法为SLR(1)文法。 使用SLR表的分析器叫做一个SLR分析器。 每个SLR(1)文法都是无二义的。但也存在许多无二义文法不是SLR(1)的. 例5.11 考察下面的拓广文法: (0) S?→E (1) E→E+T (2) E→T (3) T→T*F (4) T→F (5) F→(E) (6) F→i 这个文法的LR(0)项目集规范族为: I1、I2和I9都含有“移进-归约”冲突。 FOLLOW(E)={#, ), +} FOLLOW(S’)={#} FOLLOW(T)={*,#,),+} 非SLR文法示例:考虑如下文法: (0) S?→S (1) S→L=R (2) S→R (3) L→*R (4) L→i (5) R→L I2含有“移进-归约”冲突。 FOLLOW(R)={#, =}, SLR在方法中,如果项目集Ii含项目A??.而且下一输入符号a?FOLLOW(A),则状态i面临a时,可选用“用A??归约”动作。 但在有些情况下,当状态i显现于栈顶时,栈里的活前缀未必允许把?归约为A,因为可能根本就不存在一个形如“?Aa”的规范句型。因此,在这种情况下,用“ A?? ”归约不一定合适。 FOLLOW集合提供的信息太泛! LR(k) 分析法 Donald E. Knuth LR(k)分析器(第6章)和属性文法(14章) 的发明者 最强大的无回溯自底向上分析器 LR(1) 分析法 LR(0) 方法不依赖输入流,直接判定归约,容易出现冲突。 SLR(1) 方法简单的把非终结符的Follow 集做为可归约的依据,并不精确。 SLR(1) 文法的局限性 判断是否能用A-?将#??a?归约成#?Aa… 前提条件不仅仅是要求a∈ Follow(A) 还必须要求 ?Aa 是某规范句型的前缀。 LR(1) 项目 在之前的方法LR(0) 或SLR(1) 中,只要某状态中含有归约项目A→α?,那么当

文档评论(0)

ipad0d + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档