辽宁大学编译原理课件part5.ppt

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

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 状态 I 和文法符号 X 的转移函数 go(I,X) = closure([A→αX.β,a]|[A→α.Xβ,a]∈I) A 状态 I 核心 J α . X . β * 计算LR(1)项目集规范族C 即:分析器状态集合 C={I0}∪{I|?J∈C,X∈V∪T,I=go(J,X)}称为G’的LR(1)项目集规范族(算法:P181) begin C:= {closure({ S→.S,#})}; repeat for ?I∈C,? X ∈ V∪T if go(I,X)≠Φ go(I,X)?C then C=C∪go(I,X) until C不变化 end. * 识别活前缀的关于LR(1) 的DFA 识别文法G=(V,T,P,S)的拓广文法G’的所有活前缀的DFA M=(C, V∪T, go, I0, C) I0=CLOSURE({S’ →.S, #} 如果CFG G的LR(1)分析表无冲突则称G为LR(1)文法 * LR(1) 分析表的构造 算法:见教材P154。 与LR(0)的不同点主要在归约动作的选择: LR(0) 分析考虑所有终结符 SLR(1) 分析参考 FOLLOW 集 LR(1) 分析仅考虑 LR(1)项目中的后继符 * 四、LALR(1)分析概述 LR(1)对应的C太大 ?是否可以将某些闭包/状态合并 不同的LR(1)项目闭包可能有相同的LR(0)项目,但后继符可能不同——同心 合并后可能带来归约归约冲突 合并那些不会带来冲突的同心的LR(1)闭包/状态 ( lookahead-LR ) 在不带来移进归约冲突的条件下,合并状态,重构分析表 * LALR(1) 的分析能力 强于 SLR(1) 合并的后继符仍为 FOLLOW 集的子集 局限性 合并中不出现归约-归约冲突 如果CFG G的LALR(1)分析表无冲突则称G为LALR(1)文法 * 二义性文法问题 I1: E’→E. E→E . +E E→E.*E I7: E→E+E. E→E.+E E→E.*E I8: E→E*E. E→E.+E E→E.*E 采用二义性文法,可以减少结果分析器的状态数,并能减少对单非终结符( E→T )的归约。 在构造分析表时采用消除二义性的规则(按优先级) * 二义性文法问题 I4: S→iS.eS S→iS . 选择移进else,以便让它与前面的then配对 * * * * * * * * * * * * * * * * * * * * * * * * * I0: E’→.E E→.E+T E→.T T→.T*F T→.F F→.(E) F→.id E I1: E’→E. E→E.+T T I2: E→T. T→T.*F F I3: T→F. ( I4: F→(.E ) E→.E+T E→.T T→.T*F T→.F F→.(E) F→.id id I5: F→id. + I6: E→E+.T T→.T*F T→.F F→.(E) F→.id * I7: T→T*.F F→.(E) F→.id E I8: F→ (E.) E→E.+T T F ( id T I9: E→E+T. T→T.*F F ( id F I10: T→T*F. ( ) I11: F→(E). + * id 构造LR(0)分析表 * 七、LR(0)分析表构造 设G’的LR(0)项目集规范族:{I0,I1,…,In}用i表示闭包Ii对应的分析器状态(即相应的DFA状态) 1 0为开始状态 2 对Ii∈C if A→α.aβ∈Ii and go(Ii,a)=Ij then action[i,a]=sj ; if A→α.Bβ∈Ii and go(Ii,B)=Ij then goto[i,B]=j ; if A→α.∈Ii then for ?a∈VT∪{#} do action[i,a]=rj ; if S→S.∈Ii then action[i,#]=acc; 3 所有空格置 error 状态 ACCTION GOTO id + * ( ) # E T F 0 S5 S4 1 2 3 1 S6 acc 2 r2 r2 r2/S7 r2 r2 r2 3 r4 r4 r4 r4 r4 r4 4 S5 S4 8 2 3 5 r6

文档评论(0)

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

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

1亿VIP精品文档

相关文档