- 1、本文档共169页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
LALR(1)分析 文法G‘:(0) S’ ? S(1) B ? aB (2) S ? BB(3) B ? b 文法G‘:(0) S’ ? S(1) B ? aB (2) S ? BB(3) B ? b I0: S’ ? ? S, # S ? ? BB, # B ? ? aB, a/b B ? ? b, a/b I1: S’ ? S ?, # I2: S ? B ? B, # B ? ? a B, # B ? ? b, # I5: S ? B B ?, # I6: S ? a ? B, # B ? ? aB, # B ? ? b, # I9: B ? a B ?, # I4: B ? b ?, a/b I3: B ? a ? B, a/b B ? ? aB, a/b B ? ? b, a/b I8: B ? a B ?, a/b I7: B ? b ?, # S B b b B b b a a a a B B LR(1)项目集和转换函数 分析可发现I3和I6 , I4和I7 , I8和I9分别为同心集 I3: B ? a ? B, a/b B ? ? aB, a/b B ? ? b, a/b I6: S ? a ? B, # B ? ? aB, # B ? ? b, # I4: B ? b ?, a/b I7: B ? b ?, # I8: B ? a B ?, a/b I9: B ? a B ?, # I3,6: S ? a ? B, a/b/# B ? ? aB, a/b/# B ? ? b, a/b/# I4,7: B ? b ?, a/b/# I8,9: B ? a B ?, a/b/# 合并为 合并为 合并为 如果两个LR(1)项目集去掉搜索符之后是相同的,则称这两个项目集具有相同的心。 例:G’[S’]: (0) S’?S (1) S ? L=R (2) S ? R (3) L ? *R (4) L ? i (5) R ? L 判断该文法是否是LR(0)、SLR(1)、LR(1)、LALR(1)文法。 构造LR(0)项目集规范族 If 所有的项目集都是相容的,则为LR(0)文法; Else if 冲突项目可以通过考察非终结符的后跟符号集来解决,则为SLR(1)文法; Else 构造LR(1)项目集规范族 If 任何项目集中都不存在动作冲突,则为LR(1)文法; 对LR(1)项目集规范族进行同心集的合并,如合并之后仍不存在冲突,则为LALR(1)文法。 几种文法的比较 LR(0) SLR(1): 生成的LR(0)项目集如有冲突,则根据非终结符的FOLLOW集决定 LR(1)、LR(k): 项由 核心与向前搜索符组成,搜索符长度为1或k LALR(1): 对LR(1)项目集规范族合并同心集 由弱到强:LR(0)、SLR(1)、LALR(1)、LR(1) LR(1)中的向前搜索符号集合是与该项目相关的非终结符号的Follow集的子集; LALR项目的搜索符一般是与该项目相关的非终结符号的Follow集的子集,这正是LALR分析法比SLR分析法强的原因。 5.8 二义文法的应用 任何二义文法决不是LR(k)的,但是二义文法却很有用。能否让二义文法也使用LR分析法? 方法是:当发生冲突时,规定其解决冲突的方法,也即规定算符之间的优先级。 例:文法 二义化处理后得到如下文法: (1) (2) (3) (4) 其LR分析表如下 构造DAG图如下: 例2.文法 LR分析表如下: 2、SLR(1)分析表的构造方法思想 在构造SLR(1)分析表时,根据不同的向前看符号,将Si中的各项目所对应的动作加以区分,从而即可使冲突动作得到解决。 假定一个LR(0)规范族中含有如下的项目集(状态)Si? Si={ X→? · bβ, A → ? · , B→δ· } 也就是在该项目集中含有移进-归约冲突和归约-归约冲突。其中?,β, ? ,δ为文法符号串,b为终结符。方法如下: 对于归约项目A? ? · ,B ? δ · 分别求Follow(A)和Follow(B ), Follow(A)是所有句型中出现在紧接A之后的终结符或“#”。 如果满足如下条件: FOLLOW(A)∩FOLLOW(B)=φ FOLLOW(A)∩{b}=φ FOLLOW(B)∩{b}=φ 那么,当在状态Si时面临某输入符号为a时,则构造分析表时用以下方法即
文档评论(0)