网站大量收购独家精品文档,联系QQ:2885784924

[教育学]第7章 LR 分析法.ppt

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

7.4.1 LR(1)项目集族的构造 一个LR(1)项目可以看成两个部分组成,一部分和LR(0)项目相同部分我们称它为心,另一部分为向前搜索符集合。如让S′→·S,#属于初始项目集中,把#号作为向前搜索符,表示活前缀为γ(若γ是有关S产生式的某一右部)要归约成S时,必须面临输入符为#号才行。因此对初始项目[S′→·S,#]求闭包后再用转换函数逐步求出整个文法的LR(1)项目集族。具体构造步骤如下: (1) 构造LR(1)项目集的闭包函数。 a) 项目集I的任何项目都属于CLOSURE(I); b) 若有项目[A→α·Bβ,a]属于CLOSURE(I),B→γ是文法中的产生式,β∈V*,b∈FIRST(βa),则[B→·γ,b]也属于CLOSURE(I)中。 c) 重复b)直到CLOSURE(I)不再增大为止。 (2) 转换函数的构造 LR(1)转换函数的构造与LR(0)的相似,GO(I,X)=CLOSURE(J)   其中I是LR(1)的项目集,X是文法符号:   J={任何形如[A→αX·β,a]的项目|A→α·Xβ,a]∈I} 现给出直接由产生式构造识别活前缀的DFA的LR(1)项目集的闭包CLOSURE的算法: function CLOSURE (I); /* I是项目集*/ { J:= I; repeat 对J中的每个项目[A→α·Bβ,a]和产生式 B→γ;         α,β,γ∈V*;b ∈FIRST(βa),      若B→·γ,b不在J中    Do 将B→·γ,b加到J中 until 再没有项目加到J中 return J }; 对项目[A→α·Bβ,a],计算B的向前搜索符时,应为FIRST(βa),这是因为β∈V*,即β可能为ε,而a是用产生式A→αBβ归约时的向前搜索符,而现在β为ε,就等于用A→αB归约,向前搜索符为a,那么用A→αB归约前,必须先用产生式B→γ归约成B,因此,B的向前搜索符时也应为a。 对文法G′的LR(1)项目集族的构造仍以[S′→·S,#]为初态集的初始项目,然后对其求闭包和转换函数,直到项目集不再增大。 也就是对状态I经过符号X后转向状态J,求出J的基本项目后,对基本项目求闭包即为CLOSURE(J)。 现在我们可以对上面7.4例中不能用SLR(1)方法解决I5,I7中移进-归约冲突的文法构造它的LR(1)项目集规范族如下: I0:S′→·S,#   S→·aAd,#   S→·bAc,#   S→·aec,#   S→·bed,# I1:S′→S·,# I2:S→a·Ad,#   S→a·ec,#   A→·e,d I3:S→b·Ac,#   S→b·ed,#   A→·e,c   I4: S→aA·d,# I5: S→ae·c,#    A→e·,d I6: S→bA·c,# I7: S→be·d,#    A→e·,c I8: S→aAd·,# I9: S→aec·,# I10:S→bAc·,# I11:S→bed·,# (0) S? →S (1) S→aAd (2) S→bAc (3) S→aec (4) S→bed (5) A→e 这样LR(1)方法构造的项目集规范族在项目集I5和I7中的移进-归约冲突,由于归约项目的搜索符集合与移进项目的待移进符号不相交,所以在I5中,当面临输入符为d时归约,为c时移进,而在I7中则当面临输入符为c时归约,为d时移进,冲突已全部可以解决,因此该文法为LR(1)文法。 7.4.2 LR(1)分析表的构造 由于一个LR(1)项目可以看成两个部分组成,一部分和LR(0)项目相同部分我们称它为心,另一部分为向前搜索符集合,因而LR(1)分析表的构造与LR(0)分析表的构造大部分相同,仅对归约项目的归约动作取决于该归约项目的向前搜索符集,只有当面临输入符属于向前搜索符的集合,才做归约动作,其它情况均出错。具体构造过程如下: 若已构造出某文法的LR(1)项目集族C。C={I0,I1,…,In},其中Ik的k为分析器的状态,则动作ACTION表和状态转换GOTO表构造方法如下: (1) 若项目[A→α·aβ,b]属于Ik,且GO(Ik,a)=Ij,其中a∈VT,则置ACTION[k,a]=Sj。其Sj的含义是把输入符号a和状态j分别移入文法符号栈和状态栈。 (2) 若项目[A→α·,a]属于Ik,则置ACTION[k,a]= rj 其中a∈VT,rj 的含义为把当前栈顶符号串α归约为A(即用产生式A→α归约)。j为在文法中对产生式A→α的编号。 (3) 若项目[S?→S·,#]属于Ik,则置ACTION[k,#]=acc,表示接受。 (4) 若GO(Ik,A)=Ij,其中A∈VN,则置GOTO

文档评论(0)

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

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

1亿VIP精品文档

相关文档