收藏 分享(赏)

网络编程 第7章.ppt

上传人:tkhy51908 文档编号:8023911 上传时间:2019-06-04 格式:PPT 页数:91 大小:2.10MB
下载 相关 举报
网络编程  第7章.ppt_第1页
第1页 / 共91页
网络编程  第7章.ppt_第2页
第2页 / 共91页
网络编程  第7章.ppt_第3页
第3页 / 共91页
网络编程  第7章.ppt_第4页
第4页 / 共91页
网络编程  第7章.ppt_第5页
第5页 / 共91页
点击查看更多>>
资源描述

1、1,第 七 章 LR分析法,2,【学习目标】,本章将介绍自底向上分析的另一种方法,即LR分析 理解LR分析法的基本思想 理解可归前缀和活前缀概念 理解识别活前缀的有限自动机概念 掌握LR分析器的构造思想和方法 对给定的文法能构造LR(0)、SLR(1)、LALR(1)、LR(1)四种分析器,并能判断所给文法是四种分析器的哪几类 对给定的输入符号串能用构造的分析器判断该输入串是否是所给文法的句子 了解某些二义性文法在LR分析中的应用,3,【学习指南】,LR分析过程是一种规范归约过程。LR分析法可根据当 前分析栈中的符号串(通常以状态表示)和向右顺序查看 输入串的K个(K0)符号唯一地确定分析器的

2、动作是移 进还是归约及用哪个产生式归约,即能唯一地确定句 柄。 其中:K=0,为LR(0)分析器,它对文法的限制较大,但 是构造其它LR类分析器的基础。因此,应掌握LR(0)项 目集规范族构造的基本原理和方法。,4,【学习指南】,当K=1时,已能满足当前绝大多数高级语言编译程序实 现的需要。本章介绍三种: SLR(1)分析是为学习LR(1)分析做准备; LR(1)项目集族的构造是LALR(1)分析器的构造原理和基 础。 LALR(1) 分析器是当前大多数高级程序设计语言编译程 序所采用的语法分析技术,也是编译程序语法分析器自 动构造工具YACC(将在第13章介绍)的实现基本原理。,5,简历19

3、60年,开思理工学院毕业1963年获得加州理工学院数学博士学位,留校工作至1968年,然后转入斯坦福大学任教, 1992年在斯坦福大学荣誉退休贡献The Art of Computer Programming TEX排版软件和METAFONT字型设计软件 Utopia 84 “小创造”:Algorithm&Data Structure;双向链表;LR(k)分析法;attribute grammar;Knuth-Bendix算法;Knuth-Morris-Pratt算法荣誉 ACM三个奖项(图灵奖、软件系统奖、霍泼奖) MAA三个奖项(Ford奖、Priestley奖、Steele奖) ,Don

4、ald E. Knuth,6,LR(k)分析法“L”是指从左至右扫描输入符号串,“R”是指构造一个最右推导的逆过程,“k”是指为了作出分析决定而向前看的输入符号的个数。LR分析方法是当前最广义的无回溯的“移进-归约”方法。根据栈中的符号串和向右顺序查看输入串的k(k0)个符号,就能唯一确定分析器的动作是移进还是归约,以及用哪个产生式进行归约。LR(k)分析法knuth于1965年首先提出来的。,LR分析法简介,7,特征: 规范归约 符号栈中的符号是规范句型的前缀,且不含句柄以后的任何符号(活前缀) 分析决策依据栈顶状态和现行输入符号 识别活前缀的 DFA 特点: 适用范围广;分析速度快;报错准

5、确。 构造分析器的工作量很大,不大可能手工构造;用软件工具yacc-Yet Another Compiler Compiler,Bell,1974. 四种分析法LR(0) SLR(1) LR(1) LALR(1),8,分析栈,状态栈,分 析 表,LR分析器的组成: 一个分析栈、一个驱动程序和一张分析表; 一个输入、一个输出,输入 id+id*id#,im im-1 i0,LR驱动程序,动作 转移 action goto,输出,Ym Ym-1 #,符号栈,7.1 LR分析概述,9,特殊性 栈 = 状态栈 + 文法符号栈 分析表 = 动作表 + 状态转移表,分析表 构造方法有四种: LR(0)分析

6、表构造法 简单LR(SLR)分析表构造法 规范LR分析表构造法 向前看LR分析表构造法(LALR) 构造分析表的方法不同 分析能力不同 实现效率不同 共同点 逻辑结构相同 驱动程序相同,10,LR 分析表:actions,a;gotos,X,LR(0)、SLR(1)、LR(1)、LALR将以不同的原则构造这张分析表,11,LR 分析表简介 出现符号的含义:i,j代表状态;X代表非终结符;a代表终结符。 状态转换表GOTOi,X GOTOi,X=j:状态栈栈顶为i,符号栈栈顶为非终结符X时,转向状态j,12,移进Shift: 表示:ACTIONi,a=Sj 动作:状态j和输入符号a分别入状态栈和

7、符号栈,输入串向前进一字符。,j,a,归约reduce: 表示:ACTIONi,a=rk其中: k表示第k个产生式。 动作:设第k个产生式右部长度为m,左边非终结符为A,距状态栈栈顶m个位置的状态为p。 1.从符号栈和状态栈中分别弹出m个符号; 2.非终结符A入符号栈; 3.GOTOp,A=q 入状态栈。,q,A,13,接受accept 表示:ACTIONi,a=acc 动作:符号栈中仅有#和文法开始符号S,输入串仅为#,分析结束。,出错error 表示:ACTIONi,a=空白 动作:出错,终止分析,转出错处理程序。,14,移 入,0入状态栈; #入符号栈; ip指向w#的第一个符号;,LR

8、驱动程序算法流程,开始,令S是状态栈栈顶; a是ip指向的符号;,执行ACTIONs,a,接 受,报 错,归 约,直到(ip指向输入串的尾部# AND 符号栈栈顶为E);,初始化,a入符号栈; 状态j入状态栈; 使ip指向下一个符号;,从符号栈弹出|个符号; 从状态栈弹出|个符号; 令S是状态栈栈顶; A入符号栈; gotoS,A入状态栈; 输出产生式A;,error(); /*调出错 函数*/,return;,p14,15,注意:在分析过程中,符号栈内容连接剩余输入串恰为句型。,a,b,b,c,d,e,A,A,B,S,a,b,b,c,d,e,b,b,A,d,abbcde,aAbcde,aAc

9、de,aAcBe,S,步骤 状态栈 符号栈 输入串 动作,1 0 # abbcde# 移进,2 02 #a bbcde# 移进,3 024 #ab bcde# 归约(Ab),4 023 #aA bcde# 移进,5 0236 #aAb cde# 归约(AAb),6 023 #aA cde# 移进,7 0235 #aAc de# 移进,8 02358 #aAcd e# 归约(Bd),9 02357 #aAcB e# 移进,10 023579 #aAcBe # 归约(SaAcBe),11 01 #S # 接受,文法GS: (1)SaAcBe (2)Ab (3)AAb (4)Bd,最右推导过程,输出

10、结果,p13,p16,16,7.2 LR(0)分析表的构造,LR(0)分析法不需要向前看符号就可以确定是归约(到哪个符号)还是移入。 适用于LR(0)文法LR(0)文法能力最弱,理论上最重要 存在FA识别活前缀 识别活前缀的DFA如何构造(LR(0)项目集规范族的构造)LR(0)分析表的构造,17,可归前缀:一个句型的某个前缀的后缀是该句型的句 柄,则这个前缀称为该句型的可归前缀。活前缀:S Aw w ,wVT* r是的前 缀,则称r是G的一个活前缀。即一个规范句型的一个前缀,若不含句柄之后的任何 符号,则称它为该句型的一个活前缀。,* rm,abbcde,aAcde,aAcBe,S,a,aA

11、,aAc,aAcB,aAcBe,a,ab,a,aA,aAb,a,aA,aAc,aAcd,S,右句型 活前缀,例如 文法GS: (1)SaAcBe (2)Ab (3)AAb (4)Bd,aAbcde,* rm,一、相关概念,p14,18,1.活前缀不含有句柄的任何符号,此时期望从输入串中看到A的右部所推出的符号串 2.活前缀只含句柄的一部分符号,表明A12的右部子串1已出现在栈顶,期待从输入串中看到2推出的符号。 3.活前缀已含有句柄的全部符号,表明产生式A的 右部已出现在栈顶。 如:右句型aAbcde的活前缀,a,aA,aAb 其中: ,a不含有句柄的任何符号;aA只含句柄的一部分符号;aAb

12、含有句柄的全部符号。,活前缀和句柄的关系:,约定:为该句型的句柄,对应产生式为A,=12,19,说明:句型确定,则句柄随之确定,即最左简单短语确定一个可用文法具有无穷数目的活前缀。因为文法有无穷的句型,所以具有无穷的活前缀可构造一个有穷自动机识别一个具体文法的所有活前缀根据DFA可以构造出LR(0)分析器中的一个重要部分LR(0)分析表,20,拓广文法: 引入一新非终结符作为文法的新开始符,添加一新产生式:SS :S为新开始符,S为原来的开始符号。 拓展文法的目的:使文法只有一个以识别符号作为左部的产生式,从而使构造出来的分析器有唯一的接受状态。,21,引入标有圆点的产生式,指示分析过程中文法

13、G的产生 式的右部符号已有多少被识别(出现在栈顶)的情况 定义:在文法的每个产生式的右部添加一个圆点“”,称为G的一个LR(0)项目(项目)。圆点是表示项目的一种标记。 项目的意义:用项目表示分析的进程。 作用:圆点表示识别一个产生式右部符号所到达的位置,已从输入串看到可由圆点左部推出的符号串,希望看到圆点右部推出的符号串。即在产生式右部加一圆点以分割已获取的内容和待获取的内容:构成句柄。,二、LR(0)项目,22,例如: 若有产生式SaAcBe,则有下面六个项目:,特别地:A, A ,A B , BVN 待归约项目,A a , aVT 移进项目,A 归约项目,S S, 为初态 SS 接受项目

14、,以上项目称作LR(0)项目。,根据圆点所在的位置和圆点后是终结符还是非终结符或 为空把项目分为以下几种:,SaAcBe,SaAcBe,SaAcBe,SaAcBe,SaAcBe,SaAcBe,23,活前缀,与句柄 ,与 LR(0)项目,移进项目或待归约项目A. 刻划没有句柄的任何符号在栈顶,此时期望A的右部所推出的符号串。 活前缀不含有句柄的任何符号。 移进项目或待归约项目A1.2 刻划A12的右部子串1已出现在栈顶,期待从输入串中看到2推出的符号。 活前缀只含句柄的一部分符号。 归约项目A 刻划产生式A的右部已出现在栈顶。 活前缀已含有句柄的全部符号。,24,三、构造识别活前缀的确定有穷自动

15、机,1.构造一个状态 2.后继状态定义 3.构造转移函数,25,1.构造一个状态,定义:设I是文法G的一个LR(0)项目集合,构造closure(I)作为DFA的一个状态。closure(I)是从I出发用下面三个规则构造的项目集: 1.I中每一个项目都属于closure(I)。 2.若项目ABclosure(I)且有BP则将B .加进closure(I)中。 3.重复执行2直到closure(I)不再增大为止。 在closure(I)中的每个项目是等价的,即从期待归约的 角度来看是相同的; 核:圆点不在产生式最左边的项目,除SS。 初态:置项目SS 为初态集的核,求得closure(SS)即为

16、初态的项目集,26,例示 (0)SE (拓广文法) (1) E aA (2) E bB (3) A cA (4) A d (5) B cB (6) B d,S E,E aA,E bB,closure(SE)的结果为:,27,2.后继状态定义,(1)后继项目定义 令项目A.X是对应某个状态U的项目集中的一个项目,则称项目AX.为A.X的后继项目,其中X为文法符号字母表中的任一符号 (2)后继状态定义closure(AX)为状态U的一个后继状态,3.构造转换函数,定义 (转换函数) 若I是G的一个LR(0)项目集, X VTVN go(I,X)=closure( AX|AXI), go(I,X)称

17、为转换函数。,I:,AX,J:,AX,X,用状态转换图表示为:,28,定义:识别活前缀的DFA项目集(状态)的全体称为LR(0)项目集规范族。 求法: 1)初态: closure(SS) 2)求出新状态, go(I,X)=closure(J) 其中I为已求出的状态 3)重复2)直到不出现新的状态集为止。,1.LR(0)项目集规范族的计算,四、LR(0)分析表的构造,29,例示(0)SE (拓广文法) (1) E aA (2) E bB (3) A cA (4) A d (5) B cB (6) B d,B,I0,S E,E aA,E bB,a,E aA,A cA,A d,SE,E,b,E bB

18、,B cB,B d,c,A c A,A cA,A d,c,Ad,d,d,I1,I2,I3,I5,I6,B cB,B cB,B d,I8,E bB,I7,B d,I9,B cB,I11,c,d,AcA,I10,A,B,c,A,E aA,I4,d,识别文法的活前缀的DFA,p36,30,LR(0)项目族集,由算法构造出的是一个DFA,对状态图的说明: (1)每个DFA的状态是一个项目集,称作LR(0)项目集,整个状态集称LR(0)项目集规范族; (2)在DFA的任意项目集内,每个项目是等价的,指从期待归约的角度来看是相同的; (3)有一个唯一的初态和若干个终态,表示有若干种活前缀的识别状态; (4

19、)活前缀的求法:从初始状态出发,沿着DFA可到达的状态的路的标记。 (5)状态反映了识别句柄的情况。,31,LR(0) 项目集规范族(识别G的活前缀的DFA): I0: SE I1: SE I2: EaA EaA A.cA EbB ADI3:EbB I4: EaA I5: Ac.A BcB AcABd A .dI6: Ad I7: EbB I8: BcB BcB BdI9: Bd I10: AcA I11: BcB,32,一个项目集I不能有下列情况: (a)移进和归约项目同时存在Aa B 则称I有移进归约冲突(Shift/Reduce Conflict) (b)归约和归约项目同时存在 A B

20、则称I有归约归约冲突(Reduce/Reduce Conflict) 如果不存在移进-归约冲突,归约-归约冲突,则称构造出该LR(0)项目集规范族的文法为LR(0)文法。 显然,LR(0)文法的每个项目集中不包含有任何冲突项目。LR(0)文法的能力很弱,连表达式文法也不属于LR(0)。,33,示例(0)SE (拓广文法) (1) E Y;E (2) E Y (3) Y (4) Y i:t,I0,S E,E Y;E,E Y,Y,E Y.;E,E Y.,SE,E,i,Y i:t,I1,I2,I3,Y ,Y i:t,非LR(0)文法,34,2.LR(0)分析表的构造,前提:该文法为LR(0)文法 输

21、入:一个拓广文法G 。 输出:G的分析表的action子表和goto子表。 方法: 1.构造C=I0,I1,I2,In,G的LR(0)项目集规范族,即识别活前缀的DFA。 2.对于状态k(在分析表中,我们用项目集Ik的下标k代表对应的状态)的分析动作如下: (a)若Aa属于Ik 且GO(Ik,a)=Ij, a为终结符号, 则置 actionk,a=Sj(shift j ),Ij :closure(Aa),a,Ik :Aa,35,(c)若go(Ik,A)=Ij,A为非终结符号,则置 gotok,A= j,Ik :A,Ij : closure (AA),A,Ik:AA,(d)若SS 属于Ik,则置

22、 action k,# acc (accept) (e)分析表中凡不能用以上规则填入信息的空白格上均置出错标志“error”。,(b)若A属于Ik,则对所有aVT和#号,置 actionk,a=rj (reduce A) (AS) 体现了LR(0)的特点:无须向前查看输入符号。,36,根据上图的DFAm,其LR(0)分析表如下:,p29,37,对给定的文法,利用LR(0)方法判断符 号串是否为该文法的句子: 1.扩充文法为拓广文法; 2.构造识别此文法的全部活前缀的DFA,即构造LR(0)项目集规范族; 3.判断是否为LR(0)文法; 4.是 构造LR(0)分析表 利用LR分析算法分析符号串。

23、 5.否,做其他处理。,LR(0)分析法总结,38,大多数适用的程序设计语言的文法不能满足LR(0)文法的条件,即其规范族中会有含有冲突的项目集(状态)。如果解决这种冲突?直觉:对于有冲突的状态,向前查看一个符号,以确定采用的动作,7.3 SLR分析表的构造,39,文法G: (0) S S (1) S rD (2) D D,i (3) D i,I0: S S S rD,I2: S rD D D,i D i,I3: S rD D D ,i,I4: D i ,I5: D D,i,I1: S S ,I6: D D,i ,S,r,i,D,i,LR(0)分析表,40,I3: S rD D D ,i,向前

24、查看一个符号,看其是否是S的后跟符号(FOLLOW(S)),若否则移进,是则归约。,SLR(1)分析表,41,例: (0) SE (1) E E+T(2) E T(3) T T*F(4) T F(5) F (E)(6) F id,SE,E E+T,E T,T T*F,T F,F (E),F id,(0)SE (1)E E+T (2)E T (3)T T*F (4)T F (5)F (E) (6)F id,EE+T T T*F T FF (E)F id,id,SE,E E+T,E T,T T*F,T F,F (E),F id,E,SE E E+T,T,ETT T*F,(,F(E) E E+T E

25、 T T T*F T FF (E)F id,I0,I1,I2,I6,F,T F,I3,F id,id,I5,T,I2,F,I3,id,I5,(,+,*,TT*F F (E)F id,I7,F(E) EE+T,I8,T,EE+T T T*F,I9,I3,I5,(,F,TT*F,I10,id,I4,(,I4,*,I7,),F (E),I6,I11,F,+,E,43,I1:EE I2: E T I9: E E+T E E+T T T*F T T*F I=Xb , A , B 若(条件) FOLLOW(A) FOLLOW(B)= b FOLLOW(A)= b FOLLOW(B)= 则,面对当前读入符号

26、a,状态I的解决方法: 1.若a=b,则移进。 2.若aFOLLOW(A),则ACTIONI,a=r(A) 3.若aFOLLOW(B),则ACTIONI,a=r(B) 4.此外,报错。,1.解决方法,44,推广: I=A11a11, A22a22,Ammamm, B11 ,B22 , Bnn 若a1,a2, am和FOLLOW(B1),FOLLOW(B2), , FOLLOW(Bn)两两互不相交, 则,面对当前读入符号a,状态I的解决方法: 1.若aa1,a2, aM,则移进。 2.若aFOLLOW(Bi),i=1,2, ,n,则ACTIONI,a=r(Bi) 3.此外,报错。,45,“改进的

27、”SLR(1)分析:,对所有非终结符都求出其FOLLOW集合,这样只有归约项目仅对面临输入符号包含在该归约项目左部非终结符的FOLLOW集合中,才采取用该产生式归约的动作。 这种解决方法是比较简单的,采用向前看一个输入符号的方法解决状态中的冲突,因此称作SLR(1)分析,由此构造的分析表,称作SLR(1)分析表。 能用SLR(1)法解决冲突的文法称为SLR(1)文法 SLR(1)文法是无二义的。,46,2.SLR(1)分析表的构造,输入:一个拓广文法G 。 输出:G的分析表的action子表和goto子表。 方法: 1.构造C=I0,I1,I2,In,G的LR(0)项目集规范族,即DFA。 2

28、.求出所有非终结符的FOLLOW集。 3.对于状态k(在分析表中,我们用项目集Ik的下标k代表对应的状态)的分析动作如下: (a)若Aa属于Ik 且GO(Ik,a)=Ij, a为终结符号,则置 actionk,a=Sj(shift j ),Ij : closure(Aa),a,Ik :Aa,47,(b)若A属于Ik,则对aVT或#和aFOLLOW(A),置 actionk,a=rj (reduce A) (AS),(c)若go(Ik,A)=Ij,A为非终结符号,则置 gotok,A= j,Ik :A,Ij : closure(AA),A,Ik :AA,(d)若SS 属于Ik,则置 action

29、 k,# acc (accept) (e)分析表中凡不能用以上规则填入信息的空白格上均置出错标志“error”。,48,对于表达式文法的例子,FOLLOW集如下:,I1: EE EE+T I2: ET T T *F I9:EE+T T T *F,49,文法的SLR分析表,I1: EE EE+T I2: ET T T *F I9:EE+T T T *F,50,SLR(1)和LR(0)分析,LR(0) 与 SLR(1) 的区别 分析表的构造算法不同 第2步b)项的处理中的区别: LR(0) 分析对所有终结符均采用归约动作 SLR(1) 分析参考 FOLLOW 集,为了确定归约动作。,51,SLR(

30、1) 分析的特点,描述能力强于 LL(1) SLR(1)还考虑Follow集中的符号 LL(1) 仅考虑产生式的首符号 SLR(1)文法的分析能力强于LR(0)方法 SLR(1) 文法 如果文法的SLR(1)分析表无冲突则称G为SLR(1) 文法,52,对给定的文法,利用SLR(1)方法判断符号串是否为该文法的句子: 1.扩充文法为拓广文法; 2.构造识别此文法的全部活前缀的DFA,即构造LR(0)项目集规范族。 3.计算各非终结符的FOLLOW集合; 4.判断是否为SLR(1)文法; 5.是-构造SLR(1)分析表-利用LR分析算法分析符号串。 6.否,做其他处理。,SLR(1)分析法总结,

31、53,3. 非SLR(1)文法例(0) SS (1) S aAd (2) S bAc (3)S aec (4)S bed (5) A e,SS S aAd S bAc S aec S bed,I0,S,SS ,I1,a,S a Ad S a ec A e,I2,b,S b Ac S b ed A e,I3,A,S aA d,I4,FOLLOW(A)=c,d,非SLR(1)文法。,e,S aec A e ,I5,S bAc,I6,A,e,Sbed A e ,I7,d,S aAd ,I8,c,S aec,I9,d,S bed,I11,c,S bAc,I10,(0) SS (1) S aAd (2)

32、 S bAc (3)S aec (4)S bed (5) A e,Sbed A e ,S aec A e ,55,SLR(1)分析的局限性,如果 SLR(1) 分析表仍有多重入口(移进归约冲突或归约归约冲突),则说明该文法不是 SLR(1) 文法; 说明仅使用 LR(0) 项目集和 FOLLOW 集还不足以分析这种文法,56,7.4 LR(1)分析引论,LR(0)不考虑搜索符,SLR(1)仅在分析时考虑搜索符,因此,对搜索符所含信息量的利用有限 希望在构造状态时就考虑搜索符的作用:考虑对于产生式 A的归约,不同使用位置的 A 会要求不同的后继符号,57,后继符的概念,E,E + T,( E )

33、,T * F,不同的归约中有不同 的后继符。,已知文法: EE+T|T TT*F|F F(E)|iFOLLOW(E)=+,),#句型:(T*F)+T,特定位置的后继符是FOLLOW集的子集,58,一. LR(1) 项目形式:A ,a其中: A 为LR(0)项目,称为心;a为终结符或#,称为向前搜索符。注意:,移进或待归约项目,a不起作用。对归约项目A,a,仅当前输入符号是a 时,才能用A进行归约。,LR(1)分析表的构造,59,1、构造一个状态即LR(1)有效项目集 设I是G的一个LR(1)项目集,closure(I)是从I出发用下面三个规则构造的项目集 : 1.每一个I中的项目都属于clos

34、ure(I)。 2.若项目AB,a属于closure(I)且 B P,则对任何bFIRST(a),把B,b加进closure(I)中。 3.重复执行2直到closure(I)不再增大为止。 初态:closure(SS,#),二. LR(1)的有效项目集和转移函数,60,2.后继状态定义,(1)后继项目定义 令项目AX,a是对应某个状态U的项目集中的一个项目,则称项目AX,a为AX,a的后继项目,其中X VTVN。 (2)后继状态定义closure(AX,a)为状态U的一个后继状态。,3.构造转换函数,定义 (转换函数) 若I是G的一个LR(1)项目集, X VTVN go(I,X)=closu

35、re(AX,a| AX,a I), go(I,X)称为转换函数。,I:,AX,a,J:,AX,a,X,用状态转换图表示为:,SS,# S aAd,# S bAc,# S aec,# S bed,#,I0,S,SS,#,I1,a,SaAd,# Saec,# Ae,d,I2,b,SbAc,# Sbed,# Ae,c,I3,A,SaAd,#,I4,e,Saec,# Ae,d,I5,SbAc,#,I6,A,e,Sbed,# Ae,c,I7,d,SaAd,#,I8,c,Saec,#,I9,d,Sbed,#,I11,c,SbAc,#,I10,(0) SS (1) SaAd (2) S bAc (3)S a

36、ec (4)S bed (5) A e,LR(1)状态比LR(0)状态多,p66,62,三. LR(1)分析表的构造,1.LR(1)项目集规范族的计算 定义:识别活前缀的DFA项目集(状态)的全体称为LR(1)项目集规范族。 求法: 1)初态: closure(SS,#) 2)求出新状态, go(I,X)=closure(J) 其中I为已求出的状态 3)重复2)直到不出现新的状态集为止。,63,2、算法 LR(1)分析表的构造 输入:一个拓广的文法G。 输出:对应G 的LR(1)分析表。 方法: 1.构造G的LR(1)有效项目集族C=I0,I1,,In2.对于代表项目集Ik 的状态k,分析动作

37、如下: (a)若Aa,bIK 且go(IK,a)=Ij,则置 actionk,a=Sj,Ij :closure(Aa,b),a,Ik : Aa,b,64,(b)若A,aIk 且AS,则置 actionk,a=r(A),(c) 若BVn, AB,bIK go(Ik,B)=Ij,则置gotok,Bj,Ij : closure(AB,b),B,Ik:AB,b,(d)若SS,#Ik,则置 action k,# acc (accept) (e)分析表中凡不能用以上规则填入信息的空白格上均置出错标志“error”。,Ik :A,a,65,按上述算法构造的分析表,如果不存在多重定义的入口(即不存在动作冲突)

38、,则称它是文法G的一张LR(1)分析表(规范LR分析表)。使用这张分析表的分析器,称为LR(1)分析器(规范LR分析器)。具有LR(1)分析表的文法,称为一个LR(1)文法。LR(1)分析法强于LR(0)分析法,66,文法的LR(1)分析表,p61,67,LR(1) 分析表的构造,状态集的计算方法和 LR(0) 基本相同分析表的构造方法和 LR(0) 基本相同构造方法的不同点:归约动作的选择: LR(0) 分析考虑所有终结符 SLR(1) 分析参考 FOLLOW 集,为了确定归约 LR(1) 分析仅考虑 LR(1)项目中的后继符(归约展望集),简化 LR(1) 分析 减少资源开销( looka

39、head-LA ) 在不带来移进归约冲突的条件下,合并状态,重构分析表 可行性(合并条件) LR(1) 项目有相同的 LR(0) 项目,但后继符可能不同 (可能带来归约-归约冲突),7.5 LALR分析表的构造,69,LALR(1) 的分析能力,1.高于 SLR(1) 分析合并的后继符仍为 FOLLOW 集的子集 2.低于 LR(1) 分析 3.局限性 合并中不出现归约-归约冲突 LALR(1) 文法定义的依据,70,LALR(lookahead-LR即先行LR)法。这种方法在实际中是经常使用的。定义:如果两个LR(1)项目集去掉向前搜索符之后是相同的,则称这两个项目集具有相同的心(core)

40、。 一个心就是一个LR(0)项目集。 思路:对于文法G,构造LR(1)项目集规范族(DFA),然后,合并同心集,若合并后的同心集中没有冲突,则用其构造LR分析表,这种分析表称作LALR分析表。,SS,# SBB,# BaB,a/b Bb,a/b,I0,S,SS,#,I1,B,SBB,# BaB,# Bb,#,I2,a,BaB,a/b B aB,a/b Bb,a/b,I3,b,Bb,a/b,I4,B,SBB,#,I5,a,BaB,# BaB,# Bb,#,I6,B,BaB ,#,I9,b,Bb,#,I7,a,b,a,B,BaB,a/b,I8,b,I3、I6 I4、I7 I8、I9,例 G(S):

41、 (0) SS (1) S BB(2) BaB (3) Bb,b,BaB ,a/b,BaB ,a/b/#,Bb,a/b,Bb,a/b/#,Bb,#,SS,# SBB,# BaB,a/b Bb,a/b,I0,S,SS,#,I1,B,SBB,# BaB,# Bb,#,I2,a,BaB,a/b B aB,a/b Bb,a/b,I3,b,I4,B,SBB ,#,I5,a,BaB,# BaB,# Bb,#,I6,B,BaB ,#,I9,b,I7,a,a,B,I8,b,a,BaB,a/b/#,BaB,a/b/#,Bb,a/b/#,I47,I89,I36,I47,LALR(1)状态与LR(0)状态一样多,7

42、3,注意: 1)合并同心集是指心相同的项目集合并在一起,合并后心相同,向前搜索符合并在一起。I47=Bb,a/b/# 2)同心集的后继状态仍为同心集,由于go(I,X)仅仅依赖于I的心,因此 LR(1)项目集合并后的转换函数go(I,X)随自身的合并而得到。 3)同心集不会产生新的移进-归约冲突;Ik:A,u1 Ba,b au1=Ij:A,u2 Ba,c au2=Ikj:A,u1/u2 Ba,b/c au1, u2=但可能引起新的归约-归约冲突。 Ik:A, a B,b ab=Ij:A,b B,a ab=Ikj:A,a/b B,a/b,74,LR(1)和LALR(1)分析上的差别输入:ab#L

43、R: 0 34 #ab 报错LALR: 0 36 47 #ab0 36 89 #aB 0 2 #B 报错 结论 :LALR(1)分析法比LR(1)分析法对某些错误发现的时间推迟。一个文法是LALR(1)文法,也是LR(1)文法,不一定是SLR(1),LR(0)文法。 一个文法是LR(1)文法,不一定也是LALR(1)文法。,75,例:下面文法是LR(1)的,但不是LALR(1)的。SS S aAd bBd aBe bAeA c B c,S S,# S aAd, # S bBd, # S aBe, # S bAe, #,S S ,#,S a Ad, # S a Be, # A c, d B c, e,a,S,S b Bd, # S b Ae, # A c, e B c, d,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报