编译原理第4章语法分析自下而上LR分析法.ppt
《编译原理第4章语法分析自下而上LR分析法.ppt》由会员分享,可在线阅读,更多相关《编译原理第4章语法分析自下而上LR分析法.ppt(121页珍藏版)》请在三一办公上搜索。
1、4.3 LR分析法,图 1,语法分析概述,LR分析法是一种自下而上进行规范归约的语法分析方法,L指自左向右扫描输入串,R指最右推导(规范归约)。LR分析法比递归下降分析法、LL(1)分析法对文法的限制要少得多,大多数无二义性CFG语言都可用LR分析器识别,且速度快,并能准确、指出输入串的语法错误及出错位置。LR分析法的主要缺点:手工构造工作量相当大,必须求助自动产生工具。,LR分析程序(器):自左向右扫描,识别句柄,自下而上归约的语法分析程序。LR分析程序生成器:自动生成LR分析程序的程序。,LR分析器(分析表)的分类:LR(0)表构造法。这种方法的局限性较大、但它是建立其它较一般的LR分析法
2、的基础。简单LR(简称SLR)表构造法。虽然一些文法不能构造SLR分析表,但是,它是一种比较容易实现又很有使用价值的方法。规范LR表构造法。这种分析表能力最强,能够适用一大类文法,但实现代价高,或者说,分析表的体积非常大。向前LR表构造法(简称LALR)。这种分析表的能力介于SIR和规范LR之间,可以高效地实现。,LR分析器的工作原理 规范归约(最右推导逆过程)的关键是寻找句柄。LR分析法的基本思想:在规范归约过程中,一方面记住已移进和归约出的符号串,即记住“历史”(栈);另一方面根据所用产生式推测未来可能遇到的输入符,即对未来进行“展望”。当一串貌似句柄的符号串呈现于分析栈栈顶时,希望能根据
3、所记载的“历史”、“展望”及“现实”材料来确定栈顶符号是否构成句柄。,分析表产生器,文法,分析表,LR分析程序结构,一个LR分析器实质上是一个带先进后出存储器(栈)的确定有限状态自动机。我们将把“历史”和“展望”材料综合地抽象成某些“状态”(自动机)。分析栈(先进后出存储器)用来存放状态。栈里的每个状态概括了从分析开始直到某一归约阶段的全部“历史”和“展望”资料。任何时候,栈顶的状态都代表了整个的历史和已推测出的展望。因此,在任何时候都可从栈顶状态得知所想了解的文法的一切信息,而没有必要从底而上翻阅整个栈。LR分析器的每一步工作都是由栈顶状态和现行输入符号所唯一决定的。,4.3.1 LR分析过
4、程,LR分析的核心分析表,分析表由ACTION表和GOTO表两部分组成。ACTION(s,a):表示当状态s面临输入a时的动作GOTO(s,x):规定了状态s面对文法符号X(非终结符)时的下一状态,文法G(1)EE+T(2)ET(3)TT*F(4)TF(5)F(E)(6)Fi,分析表(图),分析表中记号的含义sj:把下一状态 j 和现行输入符号 a 移进栈;rj:按第 j 个产生式进行归约;acc:接受;空白格:出错标志,报错,给出下述文法G的LR分析表,幻灯片 11,ACTIONk,a的动作:(1)移进:设表中ACTIONk,a=Sj,当S栈顶状态为k,现行输入符号为a,总控程序根据“k”和
5、“a”查LR(0)分析表,得:ACTIONk,a=Sj此时,Sj 表示j状态进S栈,a进T栈(文法符号栈)。,(2)归约:设LR(0)分析表中的ACTIONmn,a=rj,其中rj表示使用文法的第j个产生式Ax1x2xp归约;mn表示LR分析表的一个状态。假设总控程序按S栈顶状态mn和现行输入符号a查LR分析表,得ACTIONmn,a=rj此时,S栈的状态为:m1,mn-p+1,mn文法符号T栈的符号为:x1x2xp按ACTIONmn,a=rj 的要求:,S栈应删除栈顶p个状态:mn-p+1,mn删除后,S栈成为:m1,mn-p T栈中x1x2xp归约成A,即T栈栈顶删除p个文法符号,非终极符
6、A进T栈;若GOTOmn-p,A=j,则状态j进S栈。,(3)接受:宣布分析成功,分析器停止工作。当S栈顶状态为k,现行输入符号为a,总控程序根据“k”和“a”查LR分析表得:ACTIONk,a=accacc说明语法分析成功。(4)报错:报告发现源程序有错,调用出错处 理程序。总控程序若按“k”和“a”查表得:ACTIONk,a=空白说明语法分析出错,所给输入串不是本文法的句子。,LR分析器总 控 程 序 的工作十分简单,它的任一步只需按分析栈栈顶状态s和现行输入符a执行ACTIONs,a所规定的动作。LR分析器的工作过 程 可看成是栈中状态序列、已归约串和输入串构成的三元式的变化过程。,2.
7、句型分析过程,设所给输入串为#i*i+i#,则总控程序分析此输入串的过程,如表4-11所示,通过分析,说明i*i+i是文法例4.4的句子。,例 利用上述分析表,假定输入串为 i*i+i,描述LR分析器的工作过程。,状 态,符 号,输入串,(1)0#i*i+i#(2)05#i*i+i#(3)03#F*i+i#(4)02#T*i+i#(5)027#T*i+i#(6)0275#T*i+i#(7)02710#T*F+i#(8)02#T+i#(9)01#E+i#,ACTION 0,i=s5移进 5 和 i,ACTION 5,*=r6按第6个产生式进行归约,即:(6)Fi,GOTO0,F=3移进状态3,A
8、CTION 10,+=r3按第3个产生式进行归约,即(3)TT*F,GOTO0,T=2移进状态2,例 利用上述分析表,假定输入串为 i*i+i,描述LR分析器的工作过程。(续),状 态,符 号,输入串,(10)016#E+i#(11)0165#E+i#(12)0163#E+F#(13)0169#E+T#(14)01#E#,ACTION1,#=acc接受输入串!,LR文法,LR(k)文法:一个文法,如果能用一个每步顶多向前检查k个输入符号的LR分析器进行分析,则这个文法就称为LR(k)文法。,定义:对于一个文法,如果能够构造一张分析表,使得它的每个入口均是唯一确定的,则我们把这个文法称为LR文法
9、。,存在不是LR的上下文无关文法若一个文法的任何“移进-归约”分析器都存在下述情况:尽管栈的内容和下一输入符都已了解,但仍无法确定是“移进”还是“归约”,或无法从几种可能的归约中确定其一,则该文法为非LR文法。注意:(1)LR文法肯定是无二义的,一个二义文法不会是LR文法。(2)LR分析技术可适当修改以适于一定的二义文法。,LR分析法的主要任务:构造一张LR分析表 首先讨论一种只概括“历史”资料而不包含推测性“展望”材料的“状态”。希望仅由这种简单状态就能识别呈现在栈顶的某些句柄。LR(0)项目集就是这样一种简单状态。,、LR(0)项目集规范族和LR(0)分析表,两种LR(0)分析表的构造算法
10、:方法一:先构造识别文法的活前缀非确定有限自动机,然后确定化,再构造LR(0)分析表;方法二:是直接构造LR(0)项目集规范族,再构造LR(0)分析表。,方法一:LR(0)分析表的构造步骤 确定G的LR(0)项目 以LR(0)项目为状态,构造一个能识别文法G的所有活前缀的NFA 利用子集法,将NFA确定化,成为以项目集合为状态的DFA根据 上述DFA可直接构造出LR分析表,定义:文法G每一个产生式的右部添加一个圆点,称为 G的一个LR(0)项目。设文法G的某一产生式为Ax1x2xn,则Ax1xi.xi+1xn称为文法G的LR(0)项目。如:AXY对应三个项目:AXY AXY AXY 而:A的项
11、目 A,B、句型的活前缀及文法的LR(0)分析表,项目的意义:指明在分析过程的某时刻,我们看到产生式多大一部分项目在计算机中的表示:(m,n)int m,n m:代表产生式编号 n:指出圆点的位置,如:abc前缀:,a,ab,abc活前缀:规范句型的一个前缀,该前缀是不含句柄之后 的任何符号。,C、字的前缀:指该字的任意首部,例4.5 文法为:(1)SE(2)EaA(3)AcA(4)Ad其句型“acd”,d是句柄,活前缀为:;a;ac;acd同理,在句型“acA”中,句柄是“cA”活前缀为:;a;ac;acA,称为活前缀原因:在右边增添一些终结符号就可以使它成为一个规范句型。在LR分析工作过程
12、中的任何时候,栈里的文法符号(自栈底而上)X1X2.Xm应该构成活前缀,把输入串的剩余部分配上之后即应成为规范句型(如果整个输入串确实构成一个句子)。因此,只要输入串的已扫描部分保持可归约成一个活前缀,那就意味着所扫描过的部分没有错误。,D、对文法G,构造能识别G的所有活前缀的NFA,识别文法句型活前缀的非确定有限自动机(NFA M)包括:状态、状态转换、初态、终态NFA的状态:是一个LR(0)项目,一个项目指明了在分析过程的某时刻看到产生式多大一部分 构造方法:a.文法开始符号的形如SS的项目为NFA的唯一初态;文法的所有LR(0)项目构成的状态都是识别文法的规范句型的活前缀的终态。活前缀识
13、别态,b.若状态i和j出自同一个产生式,而且j的圆点只落后于i的圆点一个位置,就从i画一条标志为Xi的弧到j。(即,i:XX1Xi-1XiXn j:XX1 Xi-1XiXn)c.若状态i的圆点之后的符号为非终结符,如i为 XA,其中A属于VN,就从状态i画弧到所有A状态。,例.构造以下文法的NFA,文法G的所有LR(0)项目,文法 G S E E aA|bB A cA|d B cB|d,1.S E 2.S E 3.E aA 4.E a A 5.E aA 6.A cA 7.A c A 8.A cA 9.A d 10.A d 11.E bB 12.E b B 13.E bB 14.B cB 15.
14、B c B 16.B cB 17.B d 18.B d,利用上述规则a,b,c构造NFA,如图所示:,E,E、使用子集方法,将NFA确定化,使之成为一个以项目集合为状态的DFA。(1)SE(2)EaA(3)AcA(4)Ad,可将文法的LR(0)项目分成如下四类:A 归约项目S 接收项目,其中,S是开始符号Aa 移进项目,其中,aVTAB 待归约项目,其中,BVN识别例4.5的文法的句型“acd”的过程,先构造识别句型的活前缀NFA M,然后确定化太繁琐,下面给出一种直接构造DFA M的方法,3.LR(0)项目集规范族(方法二)相关定义:定义 4.12 若I是一个LR(0)项目集,则项目集Clo
15、sure(I)的定义如下:(a)Closure(I)=I;(b)若项目ABClosure(I),BVN,则Closure(I)=Closure(I)B;(c)重复(b),直至Closure(I)不再扩大为止。,定义 4.13 设I为LR(0)项目集,X是一文法符号,LR(0)状态转换函数GO(I,X)的定义如下:GO(I,X)=Closure(J)其中:J=任何形如AX的项目|AXI,文法(1)SE(2)EaA(3)AcA(4)Ad若S EI,则Closure(I)=S E,E aA,令I0=SE,EaA,则GO(I0,E)=SE=I1GO(I0,a)=EaA,AcA,Ad=I2 从项目集I0
16、开始,将I0定义成一个状态,按照状态转换函数GO(I,X)的定义可以找出所有的项目集(状态),由GO(I,X)所产生的项目集(状态)全体称为LR(0)项目集规范族。,构造一个G,它包含了整个G,但它引进了一个不出现在G中的非终结符S,并加进一个新产生式SS,而这个S是G的开始符号。称G是G的拓广文法。把文法G进行拓广为了使“接受”状态易于识别,有一个仅含项目SS的状态,这就是唯一的“接受”态。,拓广文法,步骤一:令NFA的初态为I,求其CLOSURE(I),得到初态项目集。即:求CLOSURE(SS)步骤二:对所得项目集I和文法G的每个文法符号X(包括VT和VN)计算GO(I,X)=CLOSU
17、RE(J),得到新的项目集。其中J=任何形如A X 的项目|A X 属于I 步骤三:重复步骤二,直至没有新的项目集出现。经过以上步骤构造出的项目集的全体即为LR(0)项目集规范族。,利用LR(0)项目集规范族和GO函数画出DFA,构造项目集规范族方法,构造LR(0)项目集规范族的,例如,文法G为:SaBCBbCc拓广文法G为:(1)SS(2)SaBC(3)Bb(4)Cc句子“abc”的规范归约过程如下:abc,aBc,aBC,S,S运用图识别输入串“abc”的过程,有效项目(课本P86类似),项目A 1.2对活前缀1是有效的,存在规范推导,在任何时候,分析栈中的活前缀X1X2 Xm的有效项目集
18、正是状态栈顶Sm所代表的那个集合。也正是从识别活前缀的DFA的初态出发,读出X1X2 Xm后到达的那个项目集(状态)。(LR分析的基本定理,陈火旺P108),*,文法G(S)SE EaA|bB AcA|d BcB|d 考虑:项目:B c.BB.cB B.d 活前缀:bcS E bB bc.B(项目B c.B)S E bB bcB bccB(项目B.cB)S E bB bcB bcd(项目B.d),项目A 1.2对活前缀1是有效的,其条件是存在规范推导:,相关定义:LR(0)文法:不存在以下两种冲突的文法 移进归约冲突 归约归约冲突 LR(0)表:由LR(0)文法得到的分析表 LR(0)分析器:
19、使用LR(0)表的分析器,LR(0)分析表的构造,给定文法G,设文法G拓广为文法G,假若文法G的项目集规范族(识别句型的活前缀确定有限自动机)已经给出;其状态(项目集)为I0,I1In,则分析表的构造算法如下(算法中,Ii状态用右下角标i表示,Sj、rk的意义同前):,分析表的构造方法 如下:(1)设GO(Ii,X)=Ij,若XVT,则置Action(i,X)=Sj,表示将状态j和终结符X移进栈;若XVN,则置GOTO(i,X)=j,表示将状态转换为j进栈。(2)设项目AIi,若A不是文法的开始符号,则置Action(i,a)=rk,rk表示用文法的第k个产生式进行归约,“a”表示集合VT#的
20、所有符号,若A是文法的开始符号,则置Action(i,#)=“acc”,符号“#”表示句子右界符。(3)分析表中的空白表示出错。,(1)SS(2)SaBC(3)Bb(4)Cc,练习:假定文法的各个产生式的编号如下,构造其LR(0)项目集规范族 和LR(0)分析表:0、S E 1、E aA 2、E bB 3、A cA 4、A d 5、B cB 6、B d,DFA构造:(部分),CLOSURE(S-E)=S-E,E-aA,E-bB 此即为DFA的状态0,令I=S-E,E-aA,E-bB GO(I,a)=CLOSURE(E-aA)/即I中所有圆点之后紧跟a的=E-aA,A-cA,A-d GO(I,b
21、)=CLOSURE(E-bB)=E-bB,B-cB,B-d GO(I,E)=CLOSURE(S-E)=S-E,同上步骤,依次对各项目集进行计算(略)LR(0)分析表构造,(DFA部分图,全图见下页),文法 G 0、S E 1、E aA 2、E bB 3、A cA 4、A d 5、B cB 6、B d,E,a,b,文法 G 0、S E 1、E aA 2、E bB 3、A cA 4、A d 5、B cB 6、B d,E,该文法的LR(0)分析表?,该文法的LR(0)分析表如下所示:,文法 G 0、S E 1、E aA 2、E bB 3、A cA 4、A d 5、B cB 6、B d,试对acccd
22、进行分析?,例:按上表对acccd进行分析步骤 状态栈 符号栈输入串10#acccd#202#acccd#3024#acccd#40244#acccd#502444#acccd#60244410#acccd#7024448#acccA#802448#accA#90248#acA#10026#aA#1101#E#,文法 G 0、S E 1、E aA 2、E bB 3、A cA 4、A d 5、B cB 6、B d,LR(0)分析法的局限性-语法动作冲突,LR(0)分析法的关键:由项目集规范族构造LR(0)分析表 任给一状态(项目集)和任一符号“a”(aVT#),使得Action(i,a)的值是唯
23、一的(无冲突)。若Action(i,a)值不唯一,我们称为语法动作冲突。分情况讨论:,(1)无冲突:若一个项目集Ii中仅含移进项目或仅含一个规约项目,则Action(i,a)的值是唯一的,其中,aVT。,(2)移进归约冲突:若一个项目集Ii中,既含有移进项目,又含有归约项目,此时,Action(i,a)值不唯一,其中,aVT,i表示状态Ii。,(3)归约归约冲突:若一个项目集Ii中,存在两个或两个以上的归约项目,则Action(i,a)的值不唯一 上述(2)、(3)两种情况中的动作冲突,有一部分可以使用FOLLOW集 解决,即SLR(1)分析法。,例4.6 设文法为:(0)SS(1)SabdD
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 语法分析 自下而上 LR 分析

链接地址:https://www.31ppt.com/p-6486251.html