收藏 分享(赏)

第4章 语法分析-自上而下分析.ppt

上传人:gsy285395 文档编号:4841670 上传时间:2019-01-16 格式:PPT 页数:48 大小:368KB
下载 相关 举报
第4章 语法分析-自上而下分析.ppt_第1页
第1页 / 共48页
第4章 语法分析-自上而下分析.ppt_第2页
第2页 / 共48页
第4章 语法分析-自上而下分析.ppt_第3页
第3页 / 共48页
第4章 语法分析-自上而下分析.ppt_第4页
第4页 / 共48页
第4章 语法分析-自上而下分析.ppt_第5页
第5页 / 共48页
点击查看更多>>
资源描述

1、第四章 语法分析-自上而下分析,2,2019/1/16,中南大学软件学院 陈志刚,4.1 语法分析器的功能 4.2 自上而下分析面临的问题 4.3 LL(1)分析法 一、直接左递归的消除 二、提取左因子、消除回溯 三、LL(1)分析法4.4 递归下降分析程序构造 4.5 LL(1)分析中的错误处理,主要内容:,3,2019/1/16,中南大学软件学院 陈志刚,4.1 语法分析器的功能,语法分析是编译过程的核心部分。 语法分析的任务:在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。 语言的语法结构用上下文无关文法描述。,4,2019/1/16,中南大学软件学院 陈志

2、刚,词法分析器,符号表,编译程序 后续部分,语法分析器,源程序,单词符号,取下一 单词符号,语法 分析树,图4-1 语法分析器在编译程序中的地位,5,2019/1/16,中南大学软件学院 陈志刚,语法分析器的功能:按照文法的产生式,识别输入符号串是否为一个句子。这里所说的输入串是指由单词符号(文法的终结符)组成的有限序列。关键:对一个文法,当给你一串(终结)符号时,怎样知道它是不是该文法的一个句子呢?这就要判断,看是否能从文法的开始符号出发推导出这个字符串。或者,从概念上讲,就是要建立一棵与输入串相匹配的语法分析树。,6,2019/1/16,中南大学软件学院 陈志刚,语法分析的方法:自上而下分

3、析法基本思想:从输入串开始,逐步进行“归约”,直至归约到文法的开始符号;或者说,从语法树的末端开始,步步向上“归约”,直到根结。所谓归约,是指根据文法的产生式规则,把产生式的右部替换成左部符号。自下而上分析法基本思想:从文法的开始符号出发,根据文法的产生式规则正向推导出给定句子的一种方法;或者说,从树根开始,往下构造语法树,直到建立每个叶的分析方法。,7,2019/1/16,中南大学软件学院 陈志刚,4.2 自上而下分析面临的问题,顾名思义,自上而下就是从文法的开始符号出发,向下推导,推出句子。 带回溯的分析方法 不带回溯的递归子程序(递归下降)分析方法自上而下分析的主旨:对任意输入串,试图用

4、一切可能的办法,从文法开始符号(根结)出发,自上而下地为输入串建立一棵语法树。或者说,为输入串寻找一个最左推导。,8,2019/1/16,中南大学软件学院 陈志刚,这种分析过程本质上是一种试探过程,是反复使用不同产生式谋求匹配输入串的过程。例4-1 假定有文法:(1) SxAy (2) A*|*分析输入串x*y(记为)。,9,2019/1/16,中南大学软件学院 陈志刚,实现这种自上而下的带回溯试探法的一个简单途径是让每个非终结符对应一个递归子程序。每个这种子程序可作为一个布尔过程。一旦发现它的某个候选与输入串相匹配,就用这个候选去扩展语法树,并返回“真”值;否则,保持原来的语法树和IP值不变

5、,并返回“假”值。,10,2019/1/16,中南大学软件学院 陈志刚,面临的问题:,首先,是文法的左递归性问题。一个文法是含有左递归的,如果存在非终结符P含有左递归的文法将使上述的自上而下的分析过程陷入无限循环。即当试图用P去匹配输入串时,我们会发现,在没有识别任何输入符号的情况下,又得重新要求P去进行新的匹配。,11,2019/1/16,中南大学软件学院 陈志刚,其次,由于回溯就碰到一大堆麻烦事情。如果我们走了一大段错路,最后必须回头,那么,就应把已经做的一大堆语义工作推倒重来。 第三,在上述的自上而下分析过程中,当一个非终结符用某一个候选匹配成功时,这种成功可能仅是暂时的。 第四,当最终

6、报告分析不成功时,我们难于知道输入串中出错的确切位置。 最后,由于带回溯的自上而下分析实际上采用了一种穷尽一切可能的试探法,因此效率很低,代价极高。,12,2019/1/16,中南大学软件学院 陈志刚,一、左递归的消除,使用自顶向下的任何一种算法必须消除左递归和提取公共左因子。 1、直接左递归的消除若文法中有形如PP的产生式,则称直接左递归,如AAb|a。设 ,有PP|,若,不以P开头(否则不可能消除左递归)。则改写为: 可消除左递归。,4.3 LL(1)分析法,13,2019/1/16,中南大学软件学院 陈志刚,一般地,若i,j不以P开头,则可改写为:从而消除直接左递归。 例:SSabc|S

7、ab|ab 消除直接左递归得:,14,2019/1/16,中南大学软件学院 陈志刚,2、完全消除左递归分析 虽不含直接左递归,但所以含有左递归。 如果文法G不含回路( ),也不含产生式,则下列算法可消除左递归(完全),把G的非终结符按任意顺序排列成P1,Pn for i:=1 to n dobegin for j:=1 to i-1 do把形如 的规则改写成 ,其中 ;消除关于的直接左递归end; 化简由得到的文法(取消无用非终结符产生式),15,2019/1/16,中南大学软件学院 陈志刚,例:上述文法 排序:S,Q,R 循环:i=1时,处理SQc|c,消除直接左递归,不变i=2时,处理QR

8、b|b,j=1,把有关Q的产生式中以S开头的候选式替换(无),所以不变i=3时,处理RSa|a,j=1,把以S开头的候选式替换,得RQca|ca|a,16,2019/1/16,中南大学软件学院 陈志刚,j=2,把以Q开头的候选式替换,得:RRbca|bca|ab|b消除R的直接左递归,得:RbcaR|abR|bRRbcaR| 整理:得:SQc|cQRb|bRbcaR|abR|bRRbcaR|,17,2019/1/16,中南大学软件学院 陈志刚,二、提取左因子、消除回溯1、FIRST()设文法G是不含左递归的文法,对其任何非终结 的候选式定义: FIRST()=a| a,aVT, , V*若 ,

9、则规定FRIST(),18,2019/1/16,中南大学软件学院 陈志刚,2应用如果一个文法G的非终结符A的多个候选式之首符集两两不相交,那么在自上而下分析时便可消除回溯。设 ,而FIRST(1),FIRST(n)两两不相交,那么当分析时要A去匹配某输入串时,便可根据此输入串的输入符号a,准确地选用候选式i (设aFIRST(i),若FIRST(i)以后讨论) 。,19,2019/1/16,中南大学软件学院 陈志刚,例:文法SaSb|c,输入串为aacbb时:3公共左因子的提取:把文法改造为每个非终结符的所有候选式两两不相交的方法是提取公共左因子。可改造为:,20,2019/1/16,中南大学

10、软件学院 陈志刚,三、LL(1)分析法,预测分析(LL(1))法是实现自上而下分析的另一种有效方法。它使用一个分析栈和一张分析表。 分析表矩阵元素MA, a指出非终结符A,面临输入符号a时,应选用的候选式(或产生式)。若A不该面临a,则放一出错标志。,21,2019/1/16,中南大学软件学院 陈志刚,1、LL(1)分析法的工作过程开始往栈stack中放“”,然后把文件开始符号压栈。预测分析程序总是按stack栈顶符号X和当前输入符号a行事。 若X=a=”#”,则分析成功,停止分析 若X=a”#”,则把X从栈顶弹出,a指向下一个输入符号 若XVn,则查分析表。若MX, a为某候选式,则弹出X,

11、把该候选式反序压栈;若MX, a=,则弹出X,什么也不压;若MX, a=error,则报错。,22,2019/1/16,中南大学软件学院 陈志刚,为了便于描述分析过程,我们定义: ,代表栈X面临输入符号a采取第i条动作后,栈变为Y。 例1分析i*i#,23,2019/1/16,中南大学软件学院 陈志刚,2、FIRST集和FOLLOW集的定义 设G=(VT,VN,P,S)是上下文无关文法 FIRST()=a| a,aVT, , V*若 则规定FRIST() FOLLOW(A)=aS =* A 且a FRIST(), V*, V+ 若S u A ,且 ,则#FOLLOW(A),24,2019/1/

12、16,中南大学软件学院 陈志刚,计算FIRST集,1.若XV,则FIRST(X)=X 2.若XVN,且有产生式Xa,则把a加入到FIRST(X)中;若X也是一条产生式,则把也加到FIRST(X)中. 3.若XY是一个产生式且YVN,则把FIRST(Y)中的所有非元素都加到FIRST(X)中;若X Y1Y2YK 是一个产生式,Y1,Y2,Y(i-1)都是非终结符,而且,对于任何j,1j i-1, FIRST(Yj)都含有 (即Y1Y(i-1) ),则把FIRST(Yj)中的所有非元素都加到FIRST(X)中;特别是,若所有的FIRST(Yj , j=1,2,K)均含有,则把加到FRIST(X)中

13、.,25,2019/1/16,中南大学软件学院 陈志刚,计算FOLLOW集,1.对于文法的开始符号S,置#于FOLLOW(S) 中; 2.若 B 是一个产生式,则把 FIRST()加至FOLLOW(B)中; 3.若 B是一个产生式,或 B是 一个产生式而 (即FIRST()), 则把FOLLOW(A)加至FOLLOW(B)中,26,2019/1/16,中南大学软件学院 陈志刚,一个文法G是LL(1)的,当且仅当对于G的每一个非终结符的任何两个不同产生式 ,下面的条件成立: FIRST()FIRST()=,也就是和推导不出以同一个终结符a为首的符号串;它们不应该都能推出空字 .假若 ,那么,FI

14、RST()FOLLOW(A). 也就是,若 .则所能推出的串的首符号不应在FOLLOW(A)中 ,27,2019/1/16,中南大学软件学院 陈志刚,例:G E: (1) E TE (2) E +TE (3) E (4) T FT (5) T *FT (6) T (7) F (E) (8) F a,各非终结符的FIRST集合如下: FIRST(E)=(,i FIRST(E)=+, FIRST(T)=(,i FIRST(T)=*, FIRST(F)=(,i,各非终结符的FOLLOW集合为: FOLLOW(E)=), FOLLOW(E)=), FOLLOW(T)=,), FOLLOW(T)=,),

15、# FOLLOW(F)=*,,),#,28,2019/1/16,中南大学软件学院 陈志刚,例:G E: (1) E TE (2) E +TE (3) E (4) T FT (5) T *FT (6) T (7) F (E) (8) F a 试判断文法G是不是LL(1)文法。,分析:E +TE | FIRST(+TE)=+FOLLOW(E)=),T *FT | FIRST(*FT)=*FOLLOW(T)=+,),F (E) | a FIRST(E)=(FIRST(a)=a 所以GE是LL(1)的,29,2019/1/16,中南大学软件学院 陈志刚,3、LL(1)分析表的构造,1.对文法G的每个产

16、生式 执行第2步 和第3步; 2.对每个终结符aFIRST(),把加 至A,a中, 3.若 FIRST(),则对任何bFOLLOW(A) 把 加至A,b中, 4.把所有无定义的A,a标上“出错标志”。可以证明,一个文法G的预测分析表不 含多重入口,当且仅当该文法是LL(1)的。,30,2019/1/16,中南大学软件学院 陈志刚,例1:文法 ,试用LL(1)分析法分析输入串abbcde。 解: 消除左递归得文法: 求必要的FIRST和FOLLOW。FIRST(aAcBe)=aFIRST(bA)=bFIRST()=FIRST(d)=dFOLLOW(A)=FOLLOW(A)=c,31,2019/1

17、/16,中南大学软件学院 陈志刚, 构造LL(1)分析表 分析,32,2019/1/16,中南大学软件学院 陈志刚,4、LL(1)文法,分析表有多重入口。 若一个文法G的分析表不含多重入口,则称它为LL(1)文法。 一个文法是LL(1)的,当且仅当G的每个非终结符A的任何两个侯选式和有FIRST()FIRST()=若FIRST(),则有FIRST()FOLLOW(A)=,33,2019/1/16,中南大学软件学院 陈志刚,LL(1)文法的性质:LL(1)文法是无二义的LL(1)文法不含左递归非LL(1)文法的改造 消除左递归 提左公因子将产生式 | 变换为: BB |,34,2019/1/16

18、,中南大学软件学院 陈志刚,例1:文法G(E): EE+TT TT*FF Fi(E)FIRST(E)=(,i FIRST(T)=(,i FIRST(F)=(,i 消左递归E TE E +TE E ,例2:S if C t S |if C t S e SC b 提左因子S if C t S AA e S | First集 Follow集 S if #,e A e, #, e C b t MA,e=A e S A ,35,2019/1/16,中南大学软件学院 陈志刚,4.4 递归下降分析程序构造,一、递归子程序法的原理:对文法中每个非终结符U(它们代表一定的语法成分)都编出一个子程序,以完成该非终

19、结符号所对应的语法成分的分析和识别任务。 每个非终结符号的子程序功能是:用该非终结符的产生式规则右部符号串去匹配输入串。注:可匹配任何终结符,但搜索指针不前进。 使用自上而下的方法时前提是:消除左递归;提取公共左因子。,36,2019/1/16,中南大学软件学院 陈志刚,当一个文法满足LL(1)条件时,我们就可以为它构造一个不带回溯的自上而下分析程序,这个分析程序是由一组递归过程组成的,每个过程对应文法的一个非终结符。这样的一个分析程序称为递归下降分析器。 如果用某种高级语言写出所有递归过程,那就可以用这个语言的编译系统来产生整个的分析程序。,37,2019/1/16,中南大学软件学院 陈志刚

20、,例如,考虑文法:ETEE+TE | TFT T*FT | F(E) | i 它的每个非终结符都有对应的递归过程,在分 析过程中,当需要从某个非终结符出发进行展 开时,就调用这个非终结符对应的子程序。,38,2019/1/16,中南大学软件学院 陈志刚,几个全局过程和变量,ADVANCE:是指把输入串指示器IP调至指向下一个输入符号 SYM:是指IP当前所指的那个输入符号 ERROR:为出错诊察处理程序,39,2019/1/16,中南大学软件学院 陈志刚,对应的递归过程如下:,PROCEDURE E; BEGIN T;E END;,PROCEDURE E; IF SYM=+ THEN BEGI

21、N ADVANCE;T;E END,40,2019/1/16,中南大学软件学院 陈志刚,PROCEDURE T; BEGINF;T END,PROCEDURE T; IF SYM=* THEN BEGINADVANCE;F;T END;,41,2019/1/16,中南大学软件学院 陈志刚,PROCEDURE F;IF SYM=i THEN ADVANCEELSEIF SYM=( THENBEGINADVANCE;E;IF SYM=) THEN ADVANCEELSE ERRORENDELSE ERROR;,42,2019/1/16,中南大学软件学院 陈志刚,二、文法的另一种表示法,在元符号“”

22、和“|”的基础上,扩充几个元语言符号: 1. 用花括号表示闭包运算*。 2. 用 n0表示可任意重复0次至n次。 3. 用方括号表示10 ,即表示的出现可有可无(等价于|)。 引入上述元符号的文法亦称扩充的巴科斯范 式。,43,2019/1/16,中南大学软件学院 陈志刚,例如,通常的“实数”可定义为:decimalsigninteger.digitexponentexponentEsignintegerintegerdigitdigitsign + | - 用扩充的巴科斯范式来描述语法的好处是,直观易懂,便于表示左递归消去和因子提取。对于构造自上而下分析器来说,采用这种定义系统描述文法显然是

23、非常可取的。,44,2019/1/16,中南大学软件学院 陈志刚,例4.5 文法ET | E+TTF | T*FFi | (E)可表示成ET+TTF*FFi | (E) (4.6),45,2019/1/16,中南大学软件学院 陈志刚,语法图,可以用语法图来表示语言的文法,它显得更直观形象。如文法(4.6)可等价地用如下所示的语法图来表示:,46,2019/1/16,中南大学软件学院 陈志刚,从文法(4.6)出发可构造一组代替前面的递归下降分析程序,PROCEDURE E; BEGINT;WHILE SYM=+ DOBEGIN ADVANCE;T END END;,PROCEDURE T; BE

24、GINF;WHILE SYM=* DOBEGIN ADVANCE;F END END;,47,2019/1/16,中南大学软件学院 陈志刚,PROCEDURE F;IF SYM=i THEN ADVANCEELSEIF SYM=( THENBEGINADVANCE;E;IF SYM=) THEN ADVANCEELSE ERRORENDELSE ERROR;,48,2019/1/16,中南大学软件学院 陈志刚,4.5 LL(1)分析中的一种错误处理办法,发现错误 1栈顶的终结符与当前输入符不匹配 2非终结符A于栈顶,面临的输入符为a,但分析表M的MA,a为空 “应急”恢复策略 跳过输入串中的一些符号直至遇到“同步符号”为止。 同步符号的选择 1把FOLLOW(A)中的所有符号作为A的同步符号。跳过输入串中的一些符号直至遇到这些“同步符号”,把A从栈中弹出,可使分析继续 2把FIRST(A)中的符号加到A的同步符号集,当FIRST(A)中的符号在输入中出现时,可根据A恢复分析,

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

当前位置:首页 > 外语学习 > 语法

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


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

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

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