东北大学秦皇岛分校编译原理课件-第二章第七章.ppt

东北大学秦皇岛分校编译原理课件-第二章第七章.ppt

  1. 1、本文档共51页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* LR类分析法适用于大多数无二义性的上下文无关文法的语法分析。LR(0)分析法是LR类分析法中最简单的分析方法。相对于我们前面学习过的LL(1)分析法,递归子程序法、以及简单优先分析法和算符优先分析法来讲,LR(0)分析法对所分析的文法的要求要宽松得多。但是,LR(0)分析法仍然要求所分析得文法满足一定得条件。能够用LR(0)分析法进行语法分析的文法称为LR(0)文法。 LR(0)分析法对文法的要求就是,该文法不能含有冲突项目。如果一个项目集,也就是我们构造出来的DFA的一个状态,中既含有移进项目又含有归约项目,或者一个项目集中含有两个或两个以上的不同的归约项目,则称该项目为冲突项目。 根据LR(0)分析法对文法的要求,我们将满足下列条件的文法称为LR(0)文法:即,如果由一个文法构造的识别可归前缀的DFA的每个项目集(或叫状态)均不含有冲突项目,则称该文法为LR(0)文法。 实际上,大多数适用的高级程序设计语言的文法都不能满足LR(0)文法的条件,因此,从事编译理论和方法研究的人们以LR(0)分析法的分析思想和理论基础进一步研究出了其它的LR类分析法。 我们学习编译原理这门课程的目的在于深入地了解由我们所设计的程序在计算机上的运行机理和实际运行情况,而并不是为了要开发一个特定的编译器,因此,对其它的LR类分析方法我们只要求做一般了解,对其分析运行的原理又正确的理解和认识,并不要求大家一定要掌握其具体的分析及实现方法。 * SLR分析法的中文意思是简单的LR分析法。在LR(0)分析法的基础上稍加扩充,使其在一定程度上能够允许有冲突存在并在一定程度上解决冲突,我们就可以对更为广泛的文法施行LR类分析,由此,就产生了简单LR分析法:SLR分析法。其中,SLR(1)分析法是这样来进行分析的: 假设一个状态Ii中含有冲突项目,入:Ii={U1→x·b1y1, U2→x·b2y2,…, U1→x·bmym,V1→x·, V2→x·,… Vn→x·},这个时候只要向前搜索符号集{b1,b2,…,bm}和FOLLW(V1),FOLLOW(V2),…FOLLOW(Vn)两两不相交,就可以采用向前查看一个输入符号的方法来解决状态中的冲突,这也就是SLR(1)分析法中的“1”的含义。我们只需要将教材的130页的LR(0)分析表的构造算法中的第3条做如下修改,就可以实现SLR(1)分析算法:改为:若项目U→x·∈Ii,则对任意的FOLLOW(U)中的符号a均置ACTION[i,a]=“rj”。含义为按文法的j条规则U→x将符号栈顶的符号串x归约为U。其余的都与 LR(0)分析算法相同。 SLR(1)分析法在一定程度上解决了LR(0)分析法不能解决的冲突问题,但是,SLR(1)分析法还存在两个问题,第一,SLR(1)分析法并没有彻底解决所有的冲突问题,第二,SLR(1)分析法要求在出现冲突项目时,向前搜索索符号集{b1,b2,…,bn}和FOLLOW(V1),FOLLOW(V2),…FOLLOW(Vn)两两不相交,但并不是所有的上下文无关文法都满足这一要求。为此,引入了LR(1)项目的概念。 引入LR(1)项目的目的时为了确定一个句型的句柄。引入方法是:在原来的LR项目中加入一个向前搜索符a,及,LR(1)项目的形式为:[U::=x·y,a]这样的二元组。在这里,向前搜索符a只对归约项目:[U::=x·,a]有意义,它表示当它所属的状态处于栈顶,且下一个输入符号ak=a时,才可以将栈顶符号串x归约为U,除此以外的其它符号出现,即使是FOLLOW(U)中的符号,也不归约x。在其它项目中,a只是起一个传递作用,并不能决定任何操作。在引入LR(1)项目的基础上,我们就可以用类似于构造LR(0)分析表的方法来构造LR(1)分析表,。 LR(0)项目集规范族 计算LR(0)项目集规范族 C={I0 ,I1 , ... In } Procedure itemsets(G’); Begin C := { CLOSURE ({S’?.S})} Repeat For C 中每一项目集I和每一文法符号x Do if GO(I,x) 非空且不属于C Then 把 GO(I,x) 放入C中 Until C 不再增大 End; * 例:文法G: (0)S`→E (1) E→aA (2) E→bB (3) A→cA (4) A→d (5) B→cB (7) B→d LR(0) 项目集规范族(识别G的活前缀的DFA): I0: S`→.E

文档评论(0)

懒懒老巢 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档