收藏 分享(赏)

编译原理第4章 语法分析(自下而上分析).ppt

上传人:fmgc7290 文档编号:8311992 上传时间:2019-06-19 格式:PPT 页数:124 大小:903.50KB
下载 相关 举报
编译原理第4章 语法分析(自下而上分析).ppt_第1页
第1页 / 共124页
编译原理第4章 语法分析(自下而上分析).ppt_第2页
第2页 / 共124页
编译原理第4章 语法分析(自下而上分析).ppt_第3页
第3页 / 共124页
编译原理第4章 语法分析(自下而上分析).ppt_第4页
第4页 / 共124页
编译原理第4章 语法分析(自下而上分析).ppt_第5页
第5页 / 共124页
点击查看更多>>
资源描述

1、1,第四章 语法分析,2,4.6 语法分析自下而上分析,一、基本思想:从给定的符号串出发,反复使用文法中有关产生式的左部去替换当前符号串中的相应子串,逐步归约成文法开始符号的一种方法。如果从语法树的角度看,自下而上分析的过程是输入符号串作为末端结点符号串,向着根结点的方向往上构造语法树,使识别符号正好是该语法树的根结点。,3,二、移进归约法,自下而上分析法的基本实现方法是移进归约法。移进归约法:从左到右把输入串的符号一一移进符号栈里,一旦发现栈顶形成一个可归约串时,就把这个串用相应的归约符号(在规范归约的情况下用相应产生式的左部符号)代替。重复这个过程,直至最终形成如下格局:符号栈 输入串#S

2、 #这种格局表示分析成功;若达不到这种格局,意味着输入串含有语法错误。,4,例:设文法GS: SaAcBeAb | AbBd 问abbcde是不是该文法的句子?步骤 符号栈 输入流 动作0 # abbcde#1 #a bbcde# 移进2 #ab bcde# 移进3 #aA bcde# 归约,用Ab4 #aAb cde# 移进5 #aA cde# 归约,用AAb6 #aAc de# 移进7 #aAcd e# 移进8 #aAcB e# 归约,用Bd9 #aAcBe # 移进10 #S # 归约,用S aAcBe11 #S # 成功,Sa A c B eA b d b,5,三、关键问题,1 精确定

3、义可归约串:不同的定义形式形成不同的归约法。在规范归约、LR分析法中,可归约串是句柄在算符优先分析法中,可归约串是最左素短语。2 如何识别可归约串:=不同的分析法LR分析法中:历史,现实,展望。算符优先分析法中:符号之间的优先关系。,6,优先分析法有两种:简单优先分析法(规范归约)求出文法所有符号之间的优先关系,以此确定归约过程中的句柄。算符优先分析法(不规范归约)求出文法所有终结符之间的优先关系,以此确定归约过程中的可归约串。,4.7 优先分析法,7,4.7.1、简单优先分析法概述,基本思想 简单优先分析法的基本思想是对一个文法按一定原则求出该文法的所有符号之间的优先关系,按照这种关系确定归

4、约过程中的句柄以进行归约。,8,优先关系的定义,XY 表示X与Y的优先关系相等 XY 表示X优先级小于Y的优先级 XY 表示X优先级大于Y的优先级注意:这里、与数学中的=、 不同。,9,优先关系确定,定理 XY 当且仅当G中存在产生式AXY XY 当且仅当G中存在产生式AXB,且BY XY 当且仅当G中存在产生式ABD,且BX,DY,+,+,*,10,相邻文法符号之间的优先关系 在句型中,句柄内各相邻符号之间具有相同的优先级。相同优先级用“ ”。 由于句柄要先归约,所以规定句柄两端符号的优先级要比位于句柄之外的相邻符号的优先级高。优先级低于表示为“ ”,优先级高于表示为:“ ”。 某句型中:N

5、1Ni-1 Ni Nj N j+1Nn.,11,优先关系的例子,文法:SbAb A(B | a /SbAb BAa) /A(Aa)|a 语言:bab, b(aa)b, b(aa)a)b, 可以从语法树里面导出部分优先关系。,12,优先关系矩阵,可以将优先关系填写到一个矩阵,得到优先矩阵。(将矩阵作为关系的表示形式),13,# b ( ( a a ) a ) b #, ,句柄: a 归约为A,# b ( ( A a ) a ) b #,句柄: A a) 归约为B,# b ( ( B a ) b #,句柄: (B 归约为A,14,识别过程(例子续),# b ( B b #,句柄: (B 归约为A,

6、# b ( A a ) b #,句柄: Aa) 归约为B,# b ( A a ) b #,句柄: Aa) 归约为B,# b A b #,句柄: bAb 归约为S,# b ( B b #,句柄: (B 归约为A,15,若有文法GS :S bAb A (B | a B Aa) 根据关系的定义,由文法产生式可求得各个文法符号之间的优先关系。 1.求关系:由S bAb A (B | a B Aa)可知:b=A, A=b, (=B, A=a, a=)。/ A XY,X=Y 2.求关系: 由S bAb ,且A + ) ,A + B, A +a , 可知: )b,ab,Bb ; 由B Aa)且A + ) ,

7、A +a ,A + B ,可知: )a,aa,Ba ; /A BD B+X D*Y XY,16,简单优先文法,若一个文法是简单优先文法,必须满足以下条件: 在文法符号集V中,任意两个符号之间最多只有一种优先关系成立; 在文法中任意两个产生式没有相同的右部。 简单优先分析法的基本思想是找到形如 Sj-1SjSj+1SiSi+1的句柄。简单优先分析法的算法思想是:在不断将输入符号移进分析栈的过程中通过比较优先级,首先发现句柄的尾,然后再反向找到句柄的头,从而找到句柄。之后寻找句柄以句柄为右部的规则,如找到则进行规约,否则出错,17,4.7.2 算符优先分析法,算符优先分析法 是Floyd在1963

8、年首先提出来的,Greis在1971年将它形式化。这是一种古典而又实用的方法,用这种方法分析程序设计语言中的各类表达式尤为有效。不少编译程序使用这种方法分析表达式,而使用其它方法分析其余语言部分。这种方法简单直观,特别便于手工实现。,18,2 两个相邻终结符 a , b 之间的优先关系:a b a的优先级高于b,1 算符优先分析法:就是仿照算术表达式的四则运算过程而设计的一种分析方法。这种方法首先规定运算符之间(终结符号之间)的优先关系和结合性质,然后,利用这种关系用比较相邻运算符之间的优先顺序来确定句型的可归约串并进行归约。,一、概述,.,.,.,19,注意:优先关系与符号出现的左右顺序有关

9、 数学中: a b 可以 b b 不能 b a 例如:EE+E | E*E | (E) | i( + 但是 + ( 3 逻辑结构图:,.,.,.,.,优先关系表,算符优先分析程序,符 号 栈,产生式 文 法,词法分析后单词串,语法树,20,二、算符优先文法和优先表的构造 1 算符优先文法(OPG文法),(1)算符文法(OG文法):设有一文法G,若G中没有形如 SQR产生式,(S,Q,RVN)则称文法G为算符文法。 (2)定义优先关系:设文法G是一个OG文法,令a,b是任意两个终结符号,P , G , R 是非终结符号,定义: a = b 当且仅当文法G中含有形如Pab或 PaQb规则。 a b

10、或R=Qb。 a b 当且仅当文法G中含有形如PRb的 规则, 其中:R=a 或 R=aQ。,两个非终结符相邻,.,.,.,21,三种关系的语法树: ab 其中为或为B,这样a, b在同一句柄中同时归约所以优先级相同。 a b 其中为或为C,a、b不在同一句柄中,a先归约,所以a的优先性大于b。,22,(3)OPG文法:设有一个OG文法,如果在任意两个终结符号之间,在 、E* 有 + +E 有 + * 它是OG文法,但它不是OPG文法。 改写: EE+T | TTT*F | FF(E) | i是 OPG文法,.,.,.,.,.,23,2 优先关系表的构造方法,(1)为每一个非终结符P定义二个集

11、合: FirstVT(P)=a | P=a或 P=Qa, aVT , QVN 非终结符P的首终结符的集合 LastVT(P)=a | P=a 或 P=aQ , aVT , QVN 非终结符P的尾终结符的集合 例如:表达式文法:EE+T | T TT*F | F F(E) | i,+,+,+,+,24,(2)构造优先关系表的算法: 输入:算符文法G 输出:关于G的优先关系表 方法: 为每一个非终结符P计算FirstVT(P)和LastVT(P) 执行算法: for 每个产生式Px1x2xn dofor i=1 to n-1 dobegin if xi和xi-1都为终结符 then 置 xi=xi

12、-1;if in-2 且xi和xi+2都为VT ,但xi+1为VN then 置 xi=xi+2;if xi为VT 而xi+1为VN then for FirstVT(xi+1)中的每一个b do置 xixi+1; end;,.,.,.,.,25,例如: EE+T | T TT*F | F F(E) | i(3)对FirstVT(S)中的所有b置 # #置 # = #,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,26,例:构造下面文法的算符优先表。S if Eb then E else E E E+T|TT T*F

13、|F F i Eb b 解:1)求各非终结符的首终结符集和尾终结符集。为了考虑语句的开始和结束符号“”,对文法拓广,加一个产生式SS FIRSTVT(S)=if LASTVT(S)=else,+,*,iFIRSTVT(E)=+,*,i LASTVT(E)=+,*,iFIRSTVT(T)=*,i LASTVT(T)=*,iFIRSTVT(F)=i LASTVT(F)=iFIRSTVT(Eb )=b LASTVT(Eb)=b2)填写算符优先表,27,28,三、算符优先分析法 1 素短语,素短语:素短语是一种短语。 至少包含一个终结符。 除自身外不再包含其它素短语。 例如:句型 T+T*F+i,EE

14、 + TE + T F T T * F i,短语: T+T*F+i T+T*F T*F 最左素短语 T 句柄 I 素短语,29,2 识别最左素短语的方法,对OG文法,任何句型都没有相邻的两个非终结符,其句型总可以表示成:#N1a1N2a2 NnanNn+1#其中:NiVN aiVT定理:一个OPG文法任何句型的最左素短语是满足下列条件的最左子串NiaiNi+1ai+1 ajNj+1ai-1 aiai=ai+1 aj-1=ajaj aj+1,.,.,30,例如: EE+T | T TT*F | F F(E) | i句型 #T+T*F+i# 有 # + # 因此,最左素短语是T*F。,.,.,.,

15、.,.,.,.,.,.,.,.,.,.,31,3 算符优先分析算法,输入:输入符号串w和优先关系表 输出:若w是正确的句子,则接收,否则输出错误信息。方法:根据最左素短语定理,利用符号栈来识别最左素短语(先找尾,后找头),然后归约。,32,33,例:i*(i+i)S栈 关系 a 输入流# * * (i+i)#F + + i)# #F*(F ) ) #F*(F+F () ) #F*(E = ) #F*(E) *# # #F*F #E # #,34,算符优先分析的优缺点 A、算符优先分析比规范归约要快得多,因为它跳过了许多单非终结符的归约。但是,由于忽略了非终结符在归约中的作用,它可能会把错误的输

16、入串误认为是句子。 B、算符优先文法适用范围比简单优先文法大得多,许多程序设计语言都可以用它来分析。算符优先分析优先表构造简单,甚至可以用手工构造。 C、缺点在于有些文法不满足算符优先文法,必须先改写,有些甚至无法改写。若终结符数目多,优先表可能会占有太多空间。,35,四、优先函数 1、定义,若1 2 则令 f(1) g(2) 优点:节省内存空间n*n=2n便于执行比较运算 缺点:掩盖某些输入串错误 说明:有些优先关系矩阵不存在相应的优先函数。 优先关系表的优先函数不唯一。,其中: f 称为入栈(栈内)优先函数。 g 称为比较(栈外)优先函数。,1 2之间的优先关系可以通过比较f(1)和g(2

17、)的大小来决定。,36,2、优先表向优先函数的转化 算法1:逐次加1法 1)对所有终结符a(包括#),令f(a)g(a)=c,c为一任意常数。 2)对所有终结符: 若a b 而f(a)=g(b),则取g(b) = f(a)+1; 若a b 而f(a)g(b),则取f(a)=g(b)=max(f(a),g(b); 3)重复步骤2)直到f(a),g(b)不再改变为止。若存在f(a)或g(b)值=2n+c而步骤2)还未结束,则优先函数不存在。,37,例:优先表如下,构造优先函数表,38,步骤1:置初值,设c=1,步骤2:对第一步结果进行迭代,执行算法第二步,39,步骤3:对第2步结果进行迭代,执行算

18、法第二步,步骤4:对第3步结果进行迭代,执行算法第二步,步骤4与步骤3的结果相同,迭代收敛,步骤5的结果即为优先函数。,40,2、优先表向优先函数的转化,输入:一张优先关系表。 输出:关于优先关系表的优先函数。 算法2:Bell有向图法。 对每一个终结符a(包括#)令其对应两个符号fa和ga,画一张以fa和ga为结点的方向图。如果 a b , 就画一条从fa到gb 的方向弧。如果 a b , 就画一条从gb 到fa的方向弧。 对每个结点都赋予一个数,此数等于从该结点出发所能到达的结点(包括结点自身)个数。赋给结点fa的数作为函数fa的值,赋给结点gb的数作为函数gb的值。 检查优先函数f和g,

19、看是否有矛盾。若没有矛盾,则f和g就是所求优先函数;否则,不存在优先函数。,41,例:优先表如下,构造优先函数,42,43,注:用两种算法得到的优先函数表不同,说明了如果存在一对优先函数,就存在无穷多对优先函数。,44,3、优先表与优先函数的关系 1)优先函数并不等价于优先表,在优先表中没有关系的终结符对也存在优先函数。优先表能发现的错误优先函数不能发现。优先函数的能力弱于优先表。 2)有些优先表不存在优先函数,例如因为:f(a)=g(a) , f(a)g(b), f(b)=g(a), f(b)=g(b) 导致结果f(a)g(b)f(b)=g(a)=f(a),出现矛盾,45,3、优先表与优先函

20、数的关系 3)如果存在一对优先函数,就存在无穷多对优先函数。 注:由于优先函数是在优先表的基础上才能构造出来,能力又弱于优先表,唯一优点是节省空间,所以近来优先函数用作语法分析已不多见了。,46,算符优先分析法的局限性 由于算符优先分析法去掉了单非终结符之间的归约,尽管在分析过程中,当决定是否为句柄时采取一些检查措施,但仍难完全避免把错误的句子得到正确的归约。 例如,下述文法是一个算符优先文法,其产生式为: SS;D|D DD(T)|H Ha|(S) TT+S|S 其中VNS,D,T,H,VT;,(,),a,+,S为开始符号。,47,对应的算符优先关系矩阵为,用算符优先分析法对输入串(a+a)

21、#进行分析,不难发现它可以完全正确地进行归约,然而(a+a)#却不是该文法能推导出的句子。 此外,通常一个适用语言的文法也很难满足算符优先文法的条件,因而致使算符优先分析法仅适用于表达式的语法分析。,48,五、典型例题及解答,已知布尔表达式文法GB为: B BoT |T T TaF |F F nF | (B) | t | f GB是算符优先文法吗? 若GB是算符优先文法,请给出输入串ntofat的分析过程 1.计算FIRSTVT和LASTVT集合:FIRSTVT(B)=o,a,n,(,t,f LASTVT (B) =o,a,n,),t,f FIRSTVT(T)=a,n,(,t,f LASTVT

22、 (T) =a,n,),t,fFIRSTVT(F)=n,(,t,f LASTVT (F) =n,),t,f,49,构造文法的算符优先关系矩阵,表中终结符之间的优先关系是唯一的,因此该文法是算符优先文法,50,对输入串ntofat的分析过程:,51,4.8 LR分析法,LR分析法是一种规范归约的语法分析方法。L表示从左到右扫描符号串,R表示构造一个最右推导的逆过程。这种分析法比递归下降分析法、预测分析法和算符优先分析法对文法的限制要少得多,大多数无二义性上下文无关文法描述的语言都可以用LR分析法进行有效的分析。优点:分析速度快;准时指出错误以及位置。缺点:工作量大,具体实现较困难。,52,一、L

23、R分析器的工作原理和过程 1、LR分析器的基本思想,所谓LR(k)分析,是指从左到右扫描和自下而上的语法分析,且在分析的每一步,只需根据分析栈当前已移进和归约的全部文法符号(历史);并至多向前查看k个符号(展望);以及目前读到的输入符号(现实)就能确定句柄是否在分析栈的顶部形成,从而决定当前应该采取的动作。,53,2、LR分析器的逻辑结构,LR分析表,总控程序,分析栈,输出,54,分析栈:在分析的某一时刻,分析栈中记录了从分析开始到某一归约阶段的分析历史和对未来进行的展望。栈的内容包括状态S和文法符号X两部分。 LR分析表:(包括两部分) 分析动作表 ACTIONS , a :规定了当状态S面

24、临输入符号a时应执行的动作。 Si :移进,转状态i 。 ri :归约,用第 i条产生式归约。 acc :接受,表示分析成功。 空:报错。表示输入串有错误。 状态转换表GOTOS , X:规定了当状态S面临文法符号X时应转移的下一个状态。,55,3、LR分析器的工作过程,分析栈的初始格局:设在分析某一步分析栈处于如下格局:以符号对(Sm , ai)去查分析动作表,执行ACTIONSm , ai 规定的动作。,a1a2 an# ,aiai+1 an# ,56,若ACTIONSm , ai =Sm+1,则: 若ACTIONSm , ai =rj,按第j条产生式A进行归约,| |=,且GOTOSm-

25、 , A=Sk,则: 若ACTIONSm , ai =acc,则分析成功。 若ACTIONSm , ai =error,则表示输入串有错误。,ai+1ai+2 an# ,ai+1ai+2 an# ,57,例如:设有文法GE: (1)SA (2)SB (3)AaAb (4)Ac (5)BaBb (6)Bd,58,4、LR分析器总控程序框图,59,5、LR文法,对于一个文法,如果能够构造一张分析表,使得它的每一个入口均是唯一确定的,则我们把这个文法称为LR文法。一般而言,一个文法,如果能用每步顶多向前查看k个输入符号的LR分析器进行分析,则这个文法称为LR(k)文法。注意,LR文法肯定是无二义的。

26、一个二义文法决不会是LR的。,60,二、LR(0)分析表的构造(历史+现实,无展望),基本思想:上下文无关文法=识别文法所有规范句型活前缀DFA=LR分析表 1、规范句型的活前缀 前缀:指字符串的任意首部。例:abc 前缀为: , a , ab , abc 规范句型活前缀:不包括句柄右部任何符号的前缀。 上例中:aaAbb的活前缀为: , a, aa, aaA, aaAb一个LR分析器的工作过程实质上是一个逐步识别所给文法规范句型活前缀的过程。,句柄,61,2、LR(0)项目,句柄与活前缀之间有三种关系: 活前缀中包含句柄的全部符号 活前缀中只包含句柄的一部分符号 活前缀中不包含句柄的任何符号

27、为了刻画在分析过程中文法的一个产生式右部符号串已有多大一部分被识别,我们在产生式右部加上圆点来表示。A . A1 . 2 A . 把右部某位置上标有圆点的产生式称为相应文法的一个LR(0)项目。 注意:对A仅有LR(0)项目 A .,62,例:设有文法GS: SA | BAaAb | cBaBb | d 求该文法的所有LR(0)项目。 解:首先将文法拓广,使接收项目唯一 (SS) (1)S.S (2)SS . (3)S . A (4)SA . (5)S . B (6)SB . (7)A . aAb (8)Aa . Ab (9)AaA . B (10)AaAb . (11)A . c (12)A

28、c . (13)B . aBb (14)Ba . Bb (15)BaB . B (16)BaBb . (17)B . d (18)Bd .,63,项目分类: 归约项目:A . 句柄已形成,按产生式归约。 移进项目:A . X XVT,期待从输入串中移进一个符号,以待形成句柄。 待约项目:A . X XVN,期待从剩余的输入串中进行归约而得到X,然后才能继续分析A的右部。 接受项目:SS . , 其中, S为文法的开始符号,表示整个句子已经分析完成,可以接受。,64,3、构造识别文法活前缀的DFA,DFA中的每一个状态由若干个LR(0)项目组成。 定义闭包函数:设I是文法G的任一项目集,I的cl

29、osure(I)定义为: I中的每一个项目都属于closure(I) 若形如 A . B 的项目属于closure(I),则文法中任何B的产生式 B的圆点在最左边的项目B. 也属于closure(I) 重复上述过程,直到closure(I)不再增大为止。例:令I=S.S 则: closure(I)= S.S , S . A , S . B , A . aAb, A . c , B . aBb , B . d =I0,65,定义状态转移函数:设 I 是文法G的任一项目集,X为一文法符号,GO(I , X)=closure(J)J=A X . | A . XI 例如: GO(I0 , S) =cl

30、osure( SS . )=SS . =I1 GO(I0 , a) =closure( Aa . Ab , Ba . Bb )= Aa . Ab , Ba . Bb , A . aAb , A . c ,B . aBb , B . d , =I4,66,构造识别文法活前缀DFA的方法: (1)求识别文法活前缀DFA的状态集( LR(0)项目集规范族)procedure item(G)beginc:=closure(S . S ) ; 得初态集repeatfor c中的每一个项目集I和G的每一个符号X doif GO(I , X)非空且不属于c then 把GO(I , X)放入c 族中unti

31、l c不再增大end;(2)状态转移函数GO把全部项目集联成一张DFA,67,例如:,68,4、LR(0)分析表的构造,若一个文法G的拓广文法G的LR(0)项目集规范族中的每个项目集,不含有:移进归约冲突归约归约冲突则称G是一个LR(0)文法。 输入:识别LR(0)文法规范句型活前缀的DFA 输出:文法G的LR(0)分析表,69,方法:用整数0 , 1 , 2 , n 分别表示I0 , I1 , In ;令包含S . S项目的集合Ik为分析表的初始状态。 若项目A . X属于Ik,且GO(Ik , X)=Ij,当x为终结符时,置ACTIONk , x=Sj ;当X为非终结符时,则置GOTOk

32、, X=j 。 若项目A . 属于Ik,设A为文法的第j条产生式,则对任何终结符和结束符(记为a),置ACTIONk ,a=rj 。 若项目SS . 属于Ik,则置ACTIONk , #=acc 分析表中不能用规则填入信息的均置为出错。,70,S6,71,例如:文法GS: S(S) | a 拓广: (0)SS (1)S(S) (2)Sa,72,比较返回,73,三、SLR(1)分析法,由于LR(0)文法要求每一个LR(0)项目集都不含有冲突的项目,这个条件 比较苛刻。对于大多数程序设计语言来说,一般都不能满足LR(0)文法的条件,即使简单算术表达式文法也不是LR(0)文法。无法解决冲突,向前查看

33、一个输入符号。例如: EE+T | TTT*F | FF(E) | id,74,将文法拓广并对规则编号: 0. EE 1. EE+T 2. ET 3. TT*F 4. TF 5. F(E) 6. Fid,75,#,76,一般,若I 中有m个移进项目和n个归约项目时:I = A1 1.a11 , B11 . ,A2 2.a22 , B22 . ,Am m.amm , Bnn . 对所有移进项目向前查看一符号集合a1 ,a2 , am和Follow(B1) , Follow(B2) , Follow(Bn) 两两不相交时,则项目集I 中冲突可以按下列原则解决。设a 是下一个输入符号: 若a a1

34、,a2 , am , 则移进。 若aFollow(Bi) , 则用产生式Bii归约。 其他报错。,77,这种解决冲突的方法称为SLR(1)方法。如果LR(0)项目集中所有冲突都可以用SLR(1)方法解决问题,此文法称为SLR(1)文法。构造SLR(1)分析表的方法:同LR(0)分析表构造方法相同。若项目A . 属于Ik,设A为文法的第j条产生式,则对任何属于Follow(A)的输入符号a ,置ACTIONk ,a=rj 。当a1 ,a2 , am Follow(Bi) , 表示不能用SLR(1)解决冲突。,78,例如:I2= ET . , TT . *F 由于Follow(E)=+, ) ,#

35、 * = ,所以当面临输入符号+, ) ,# 时,用产生式ET 归约,而当面临输入符号*时,则移进。I9 = EE+T . , TT . *F 类似。,#,79,例1:对下列文法: (0)SS (1)SbRST (2)SbR (3)RdSa (4)Re (5)TfRa (6)Tf 求各非终结符的First和Follow集合。 构造该文法的SLR(1)分析表。 解:,80,81,82,例2 .有文法GA : AaABe | BaBdB | 该文法是否是SLR(1)文法?证明之。 解:将文法拓广为GS (0)SA (1)AaABe (2) ABa (3)BdB (4)B 该文法的LR(0)项目有:

36、 S. A SA . A. aABe Aa .ABe AaA .Be AaAB .e AaABe. A .Ba AB .a ABa. B .dB Bd .B BdB. B .,83,Follow(B)=a,e 不是SLR(1)文法,SA AaABe ABa BdB B,无法用SLR(1)解决冲突,无法用SLR(1)解决冲突,可以用SLR(1)解决冲突,可以用SLR(1)解决冲突,84,例3.设有拓广文法G: (0)SS (1)SL=R (2)SR (3)L*R (4)Li (5)RL,Follow(R) = = , # = , 因此,I2的冲突不能 用SLR(1)方法 解决。需要功能更强的LR

37、分析法, 即LR(1)分析法来解决。,85,四、规范LR(1)分析法 1、LR(1)项目集,LR(1)分析法基本思想:向前查看一个输入符号,增加展望信息来解决冲突。 LR(1)项目集:一个LR(1)项目集是一个二元组A . , a,当时,展望符(搜索符)a无意义。当=时,展望符 a明确指出,当A . , a是栈顶状态的一个LR(1)项目时,仅在输入符号是 a时才能用A 归约,而不是对Follow(A)中的所有符号都用A 归约。,86,2、上下文无关文法=LR(1)项目集规范族,定义闭包函数:设I是一个LR(1)项目集,I的closure(I)定义为: I中的任何LR(1)项目都属于closur

38、e(I) 若项目A . B ,a属于closure(I), B是一个产生式,那么,对于First(a)中的每一个终结符b,如果B. ,b不在 closure(I)中,则把它加进去。 重复上述过程,直到closure(I)不再增大为止。,87,例:文法G为: (0)SS (1)SL=R (2)SR (3)L*R (4)Li (5)RLI= S .S , # Closure(I)= S .S , # , S .L=R , # ,S .R , # , L .*R , =/# ,L .i , =/# , R .L , # = I0,First(#)=#,First(=R#)=,First(#)=#,F

39、irst(#)=#,88,定义状态转移函数:设 I 是一个LR(1)项目集,X为一文法符号,GO(I , X)=closure(J)J=A X . ,a | A . X , a I 例如:求GO(I0 , L)=closure( SL .=R , # , RL . , # )= SL .=R , # , RL . , # =I2,89,LR(1)项目集族的构造方法: procedure item(G)beginc:=closure(S . S ,# ) ; 得初态集repeatfor c中的每一个项目集I和G的每一个符号X doif GO(I , X)非空且不属于c then 把GO(I ,

40、X)放入c 族中until c不再增大end;,90,3、规范LR(1)分析表的构造方法,输入:LR(1)项目集族 输出:规范LR(1)分析表,91,方法: 若项目A . X , a属于Ik,且GO(Ik , X)=Ij,当x为终结符a时,置ACTIONk , a=Sj ;当X为非终结符时,则置GOTOk , X=j 。 若归约项目A . , a属于Ik,设A为文法的第j条产生式,则置ACTIONk ,a=rj 。 若项目SS . , #属于Ik,则置ACTIONk , #=acc 分析表中不能用规则填入信息的均置为出错。,92,(0)SS (1)SL=R (2)SR (3)L*R (4)Li

41、 (5)RL,93,(0)SS (1)SL=R (2)SR (3)L*R (4)Li (5)RL,*,94,例:文法GS: S(S) | a 拓广: (0)SS (1)S(S) (2)Sa 试构造它的LR(1)项目集的DFA和LR(1)分析表。 解:,(S) . , $,a . , ),95,比较,a . , ),(S) . $,96,五、LALR分析法 (Lookahead LR分析法),(介于SLR(1)和LR(1)分析法之间的一种分析法)LR(1)分析法虽然可以解决SLR(1)分析法难以解决的移进归约或归约归约冲突,但是,对同一个文法来说,当搜索符不同时,同一个项目集被分裂成多个项目集从

42、而引起状态数剧烈增加,导致时间和空间开销增加,应用也受到限制。能不能找到一种状态数少,又能解决SLR(1)冲突的分析法呢?=LALR分析法。,97,1、LALR(1)分析法基本思想,如果两个LR(1)项目集除搜索符不同外,核心部分是相同的,称这两个LR(1)项目集同心。LALR(1)分析法的基本思想是将LR(1)项目集规范族中所有同心的项目集合并为一。,98,*,合并:I4I11 =I411 = I4I5I12 =I512 = Li . , =/$ I7I13 =I713 = L*R . , =/$ I8I10 =I810 = RL . , =/$ ,(0)SS (1)SL=R (2)SR (

43、3)L*R (4)Li (5)RL,=/$,99,如何求合并后的转移函数?并集的转移就是各自转移的并。 若:Jk = I1I2 In 则: GO(Ik , x) = GO(I1 , x) GO(I2 , x) GO(In , x) 例如:GO(I411 , i)= GO(I4 , i) GO(I11 , i)=I5I12=I512GO(I411 , R)= GO(I4 , R) GO(I11 R)=I7I13=I713GO(I411 , *)= GO(I4 , *) GO(I11 , *)=I4I11=I411,100,注意:合并同心集可能产生新的冲突,它不可能是移进归约冲突,它只可能是归约归

44、约冲突。 反证:假设LR(1)文法合并同心集后产生移进归约冲突Iij= A . , a/a B . a , b/b 合并前: Ii= A . , a B . a , b Ij= A . , a B . a , b 合并前就存在移进归约冲突=文法不是LR(1)文法=矛盾 合并后不可能产生移进归约冲突。归约归约冲突: 合并前: Ii= A . , a B . , b Ij= A . , b B . , a 合并后: Iij= A . , a/b B . , a/b ,原来没冲突,产生归约归约冲突,101,2、构造LALR(1)分析表,构造拓广文法G的LR(1)项目集规范族(DFA)。 若LR(1)

45、项目集规范族不存在冲突,则合并所有同心集,构造该文法的LALR(1)项目集规范族。 若LALR(1)项目集规范族不存在归约归约冲突,(该文法是LALR(1)文法。)在这基础上构造LALR(1)分析表,其构造方法与构造LR(1)分析表相同。,102,(0)SS (1)SL=R (2)SR (3)L*R (4)Li (5)RL,103,104,例:拓广文法GS: (0)SS (1)S(S) (2)Sa 试构造它的LALR(1)项目集的DFA和分析表。 解:,a. , ),(S) . , $,105,106,例:设有文法G(S):SaAD | aBe | bBS | bAeAgBgDd | 试判断此文法是下列文法的哪一种?并说明理由。 LR(0) SLR(1) LALR(1) LR(1) 解:将文法拓广为G(S): (0)SS (1) SaAD (2) SaBe (3) SbBS (4) SbAe (5) Ag (6) Bg (7) Dd (8) D ,107,存在移进归约冲突,FOllOW(D)=#, 可以用SLR(1)解决。,(0)SS (1) SaAD (2) SaBe (3) SbBS (4) SbAe (5) Ag (6) Bg (7) Dd (8) D ,

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

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

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


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

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

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