编译基本知识课程教材chap06(陈火旺).ppt
《编译基本知识课程教材chap06(陈火旺).ppt》由会员分享,可在线阅读,更多相关《编译基本知识课程教材chap06(陈火旺).ppt(138页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第六章 语法分析-LR分析,第六章语法分析LR分析,第六章 语法分析-LR分析,第五章我们学过自底向上分析法的关键问题是在分析过程中如何确定句柄。LR分析法与第5章介绍的算符优先分析一样,LR方法也是通过求句柄逐步归约进行语法分析。在运算符优先分析中,句柄是通过运算符的优先关系而求得,LR方法中句柄是通过求可归前缀而求得。,第六章 语法分析-LR分析,LR分析概述,LR(k)分析是根据当前分析栈中的符号串和向右顺序查看输入串的k(k0)个符号就可以唯一确定分析的动作是移进还是归约以及用哪个产生式归约。 从左到右扫描(L)自底向上进行规约(R) (是规范规约),第六章 语法分析-LR分析,LR分
2、析的优缺点,1)适合文法类足够大,适用于大多数上下文无关文法 2)分析效率高 3)报错及时 4)手工实现工作量大 5)可以自动生成 美国Bell实验室推出的编译程序自动构造工具YACC:能接受一个用BNF描述的满足LALR(1)上下文无关文法并对其自动构造出LALR(1)分析器。,第六章 语法分析-LR分析,第六章 LR分析法,一、LR分析概述(基本构造原理与方法) 二、LR(0)分析 三、SLR(1)分析 四、LR(1)分析 五、LALR (1)分析,第六章 语法分析-LR分析,分析器模型,第六章 语法分析-LR分析,逻辑上说,一个LR分析器由3个部分组成: (1) 总控程序,也可以称为驱动
3、程序。对所有的LR分析器总控程序都是相同的。 (2)分析表或分析函数,不同的文法分析表将不同,同一个文法采用的LR分析器不同时,分析表也不同,分析表又可分为动作表(ACTION)和状态转换(GOTO)表两个部分,它们都可用二维数组表示。 (3) 分析栈,包括文法符号栈和相应的状态栈,它们均是先进后出栈。 分析器的动作就是由栈顶状态和当前输入符号所决定。,2、LR分析方法的逻辑结构,第六章 语法分析-LR分析,总控程序根据不同的分析表来决定其下一步的处理动作,分析表是根据具体的文法按某种规则构造出来的。LR方法是根据具体文法的分析表对输入串进行分析处理。 LR分析过程的思想是在总控程序的控制下,
4、从左到右扫描输入符号串,根据分析栈中的状态和文法及当前输入符号,按分析表完成相应的分析工作。,第六章 语法分析-LR分析,LR分析过程的思想: 记住历史:记住已移进和归约的整个符号串。(即栈中的内容) 立足现实:输入串读头下的符号 展望未来:根据所用的产生式推测未来可能碰到的输入符号。(也通过栈识别),第六章 语法分析-LR分析,分析表的组成: (1) 分析动作表Action,第六章 语法分析-LR分析,表中actionSi,aj为二维数组,指出当前栈顶为状态Si,输入符号为aj是所执行的动作。其动作有四种可能,分别为移进(S)、归约(r)、接受(acc)、出错(error)。,(2) 状态转
5、换表goto,第六章 语法分析-LR分析,表中gotoSi,xj指出栈顶状态为Si,文法符号为xj时应转到的下一状态。,第六章 语法分析-LR分析,13,13,分析表种类的不同决定使用不同的LR分析方法,a) SLR分析表(简单LR分析表),b) LR(1)分析表(规范LR分析表),构造简单,最易实现,大多数上下文无关文法都 可以构造出SLR分析表,所以具有较高的实用 价值。使用SLR分析表进行语法分析的分析器 叫SLR分析器,适用文法类最大,大多数上下文无关文法都能 构造出LR分析表,但其分析表体积太大.暂时实 用价值不大.,a) LR(0)分析表,第六章 语法分析-LR分析,14,14,c
6、) LALR分析表(超前LR分析表),这种表适用的文法类及其实现上难易在上面 两种之间,在实用上很吸引人. 使用LALR分析表进行语法分析的分析器叫LALR分析器。 例:YACC,文法规则文件 YACC源文件,YACC,某语言的 LALR分析器,第六章 语法分析-LR分析,15,15,1.四种分析表对应四类文法,几点说明,2.一个SLR文法必定是LALR文法和LR(1)文法,第六章 语法分析-LR分析,3、LR分析过程: LR分析步骤: (a) 将初始状态S0和句子的左界符#分别进分析栈。 (b) 根据栈顶状态和当前输入符号查动作表,进 行如下的工作。 移进:当前输入符号进符号栈,根据状态转换
7、表新的状态进状态栈,继续扫描,从而下一输入符号变成当前输入符号。 归约: (1)按某个产生式进行归约,若产生式的右端长度为n,则符号栈顶和状态顶n个元素同时相应退栈。(2)归约后的文法符号进符号栈,(3)查,第六章 语法分析-LR分析,状态转换表,新的状态进状态栈。 (c) 接受:分析成功,终止分析。 (d) 出错:报告出错信息。 (2) 具体分析过程:,举例说明具体分析过程: 设文法为GL (假定已存在LR分析表) (1) L E,L (2) L E (3) E a (4) E b,第六章 语法分析-LR分析,LR分析算法,置ip指向输入串w的第一个符号 令S为栈顶状态 a是ip指向的符号
8、重复 begin if ACTIONS,a=Sj then begin PUSH j,a(进栈) ip 前进(指向下一输入符号) end else if ACTIONS,a=rj (第j条产生式为A),第六章 语法分析-LR分析,LR分析算法,then begin pop | 项 令当前栈顶状态为S push GOTOS,A和A(进栈) end else if ACTIONs,a=acc then return (成功) else error end.重复,第六章 语法分析-LR分析,为了介绍LR分析过程,在这里直接给出该文法的分析表,之后再介绍如何生成该表。,ri表示按第i个产生式进行归约,
9、Si表示把当前输入符号移进栈,且转第i个状态,即第i个状态进状态栈。,i表示转第i个状态,即第i个状态进状态栈。,空白表示分析动作出错。,第六章 语法分析-LR分析,(1) L E,L (2) L E (3) E a (4) E b,第六章 语法分析-LR分析,根据上述分析表,即可对输入串进行分析。如输入串为#a,b,a#具体分析过程如下:,第六章 语法分析-LR分析,第六章 语法分析-LR分析,自底向上分析法的关键问题是在分析过程中如何确定句柄。LR方法中的句柄是通过求可归前缀而求得。,第六章 语法分析-LR分析,例:文法GS为: S aAcBe A b A Ab B d,为产生式加序号变为
10、: S aAcBe1 A b2 A Ab3 B d4,对于输入串abbcde句子的最右推导(规范推导)如下: SaAcBe1 aAcd4e1 aAb3cd4e1 ab2b3cd4e1,活前缀与可归前缀,第六章 语法分析-LR分析,对它的逆过程最左归约(规范归约)为: ab2b3cd4e1 aAb3cd4e1 aAcd4e1 aAcBe1 S,用哪个产生式继续归约仅取决于当前句型的前部。 我们把每次采取归约动作前的符号串部分称为可归前缀。LR分析的关键就是识别何时到达可归前缀。,为产生式加序号变为: S aAcBe1 A b2 A Ab3 B d4,第六章 语法分析-LR分析,在规范句型中形成可
11、归前缀之前包括可归前缀的所有前缀称为活前缀。活前缀为一个或若干规范句型的前缀。在规范归约过程中的任何时刻只要已分析过的部分即在符号栈中的符号串均为规范句型的活前缀,则表明输入串的已被分析过的部分是某规范句型的一个正确部分。,例如:有下面规范句型的前缀: ,a,ab ,a,aA,aAb ,a,aA,aAc,aAcd ,a,aA,aAc,aAcB,aAcBe,左部均为活前缀,其中,红色部分为可归前缀,第六章 语法分析-LR分析,G=(Vn,Vt,P,S),若有S A , A ( 是句柄 ) 是的前缀,则称是文法G的活前缀 活前缀是规范句型的前缀,不包含句柄之后的任何符号 是含句柄的活前缀,并且句柄
12、是的后端,则称是可归前缀或可规范前缀。 在LR分析过程中,实际上是把的前缀(即文法G的活前缀)列出放在符号栈中,一旦在栈中出现(形成可归前缀),即句柄已经形成,则用产生式A 进行归约。,活前缀的定义及在LR分析中的应用,*,R,第六章 语法分析-LR分析,LR分析法如何分析句子? 移进归约(从左到右扫描(L)自底向上进行规约(R) ) 移进归约的关键问题是什么? 判断符号栈顶的符号串是否构成句柄。 LR分析法如何识别句柄? LR分析法在分析过程中并不是直接分析符号栈中的符号是否形成句柄,而是通过识别可归前缀来识别句柄。 具体地,LR分析法的分析过程可以看作识别活前缀和可归前缀的过程,只要符号栈
13、中的符号串构成活前缀,就表示已分析过的部分是正确的,继续移进;直到符号栈中的符号串构成可归前缀,则表示当前栈顶符号串已形成句柄,则进行归约。,第六章 语法分析-LR分析,如何识别活前缀和可归前缀? 通过有限自动机来识别。 如何构造识别活前缀和可归前缀的有限自动机? 根据文法规则 状态集合:列出所有活前缀的识别状态 符号表:所有的终结符和非终结符 状态转换函数: f(Ki ,a)= Kj 某一个活前缀的识别状态,在输入符号表中的一个符号之后,转向另一个活前缀的识别状态。 终态集:所有可归前缀的识别状态,第六章 语法分析-LR分析,LR(0)分析,构造LR分析器的关键是构造其分析表 构造LR分析表
14、的方法是: (1)根据文法构造识别规范句型活前缀的有穷自动机DFA (2)由DFA构造LR分析表,第六章 语法分析-LR分析,1. 构造DFA,(1) DFA是一个五元式,M=(S, V, GOTO, S0, Z),S:有穷状态集,在此具体情况下,S=LR(0)项目集规范族LR(0)。 项目集规范族:其元素是由项目所构成的集合.,V:文法字汇表 VnVt,S0:初始状态,GOTO:状态转移函数 GOTOSi,X=Sj Si ,SjS Si ,Sj为项目集合 XVnVt 表示当前状态Si面临文法符号为X时,应将状态转移到 Sj,Z:终态集合,第六章 语法分析-LR分析,1) 确定S集合,即LR(
15、0)项目集规范族,同时确定S0,2) 确定状态转移函数GOTO,构造DFA方法:,第六章 语法分析-LR分析,LR(0)分析,确定状态集合 每一个状态对应文法中某一个产生式规则的某一个项目 每一个产生式规则的每一个项目代表一个活前缀的识别状态。 产生式规则的项目?,第六章 语法分析-LR分析,活前缀与句柄的关系:,GS: 若S = A = r是的前缀,则 称r是G的一个活前缀 1.活前缀已含有句柄的全部符号,表明产生式A的 右部已出现在栈顶 2.活前缀只含句柄的一部分符号表明A12的右部子串1已出现在栈顶,期待从输入串中看到2推出的符号 3. 活前缀不含有句柄的任何符号,此时期望A的右部所推出
16、的符号串,R,第六章 语法分析-LR分析,活前缀,与句柄 ,与 LR(0)项目,为刻划这种分析过程中的文法G的每一个产生式的右部符号已有多大一部分被识别(出现在栈顶)的情况,分别用标有圆点的产生式来指示位置。 A刻划产生式A的 右部已出现在栈顶 A12 刻划A12的右部子串1已出现在栈顶,期待从输入串中看到2推出的符号 A 刻划没有句柄的任何符号在栈顶,此时期望A的右部所推出的符号串 对于A的LR(0)项目只有A,第六章 语法分析-LR分析,项目:文法G的每个产生式(规则)的右部添加一个圆点就构成一个项目。,例:产生式:AXYZ 项 目: A.XYZ AX.YZ AXY.Z AXYZ. 产生式
17、:A 项 目: A.,项目的直观意义:指明在分析过程中,我们看到产生式多大一部分。,其中, 、 X、XY、 XYZ为活前缀,XYZ是可归前缀。,第六章 语法分析-LR分析,38,38,. 将文法扩充,构造LR(0)文法的方法(三步),目的:使构造出来的分析表只有一个接受状态,这是 为了实现的方便。,方法:修改文法,使识别符号的规则只有一条,L(G(E)=L(GE),第六章 语法分析-LR分析,39,39,. 根据文法列出所有的项目,例如:产生式SaAcBe对应有6个项目。 0 SaAcBe 1 SaAcBe 2 SaAcBe 3 SaAcBe 4 SaAcBe 5 SaAcBe ,第六章 语法
18、分析-LR分析,40,40,. 将有关项目组合成集合,即DFA中的状态; 所有状态再组合成一个集合,即LR(0)项目集规范族,我们通过一个具体例子来说明LR(0)的构造以及DFA 的构造方法,例:GE EE+T|T TT*F|F F(E)|i,第六章 语法分析-LR分析,41,41,例:GE EE+T|T TT*F|F F(E)|i,(0) EE (4) TF EE+T (5) F(E) ET (6) Fi TT*F,第六章 语法分析-LR分析,42,42,为实现这一步,先定义: 项目集闭包closure 状态转移函数GOTO,例:GE 令I=E.E closure(I)=E.E, E.E+T
19、, E.T, T.T*F, T.F, F.(E), F.i ,第六章 语法分析-LR分析,43,43,A.项目集闭包closure的定义和计算: 令I是文法G的任一项目集合,定义closure(I)为项目集合I的闭包,可用一个过程来定义并计算closure(I)。 Procedure closure(I); begin 将属于I的项目加入closure(I); repeat for closure(I)中的每个项目A.B(BVn) do 将B.r(rV* )加入closure(I) until closure(I)不再增大 end,例:GE 令I=E.E closure(I)=E.E, E.E
20、+T, E.T, T.T*F, T.F, F.(E), F.i ,第六章 语法分析-LR分析,44,44,所以,GOTO(I,X)=closure(J)的直观意义是: 它规定了识别文法规范句型活前缀的DFA从状态I(项目集)出发,经过X弧所应该到达的状态(项目集合),第六章 语法分析-LR分析,45,45,例. I=EE. , EE.+T 求GOTO(I , + )=? GOTO(I , +)=closure(J) J=EE+.T GOTO(I , +)=EE+.T , T.T*F , T.F , F.(E) , F.i ,例:GE EE+T|T TT*F|F F(E)|i,第六章 语法分析-
21、LR分析,46,46,LR(0)项目集规范族的构造算法:,GLR(0) Procedure ITEMSETS(G); begin LR(0):=closure(E.E); repeat for LR(0)中的每个项目集I和G的每个符号X do if GOTO(I , X)非空,且不属于LR(0) then 把GOTO(I , X)放入LR(0)中 until LR(0)不再增大 end,第六章 语法分析-LR分析,例.求GE的LR(0) V=E, T, F, I, +, *, (, ),(0) EE (4) TF EE+T (5) F(E) ET (6) Fi TT*F,第六章 语法分析-LR
22、分析,I2:ET. GOTO(I0,T)=closure(ET. TT.*F)= I2 TT.*F I3:TF. GOTO(I0,F)=closure(TF.)= I3 I4:F(.E) GOTO(I0,()=closure(F(.E)= I4 E.E+T E .T T.T*F T.F F.(E) F.i I5:Fi. GOTO(I0,i)=closure(Fi.)= I5 GOTO(I0,*)= GOTO(I0,+)= GOTO(I0,)=,I0: E.E E.E+T E.T T.T*F T.F F.(E) F.i,第六章 语法分析-LR分析,I6:EE+.T GOTO(I1,+)=clos
23、ure(EE+.T)= I6 T.T*F GOTO(I1,其他符号)为空 T.F F.(E) F.i I7:TT*.F GOTO(I2,*)=closure(TT*.F)= I7 F.(E) GOTO(I2,其他符号)为空 F.i GOTO(I3,其他符号)为空,I1: EE. EE.+T,I2: ET. TT.*F,第六章 语法分析-LR分析,I4:F(.E) E.E+T E .T T.T*F T.F F.(E) F.i,第六章 语法分析-LR分析,I10:TT*F. GOTO(I7,T)=closure(TT*F .)= I10 GOTO(I7,()= I4 GOTO(I7,i)= I5
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 基本知识 课程 教材 chap06 陈火旺
限制150内