编译原理4语法分析.ppt
《编译原理4语法分析.ppt》由会员分享,可在线阅读,更多相关《编译原理4语法分析.ppt(74页珍藏版)》请在三一办公上搜索。
1、第四章 语法分析,4.1语法分析程序的功能语法分析:逐一分析词法分析所得的属性字,检查其中的语法错误,如果没有发现语法错误,则给出正确的语法结构。语法分析常用方法:1、自顶向下分析方法,2、自底向上分析方法。所谓的自顶向下分析法就是从文法的开始符号出发,根据文法规则正向推导出给定句子的方法;或者说,从树根开始,往下构造语法树,直到建立每个树叶的分析方法。自底向上分析方法是从给定的输入串开始,根据文法规则逐步进行归约,直至归约到文法的开始符号;或者说,从语法树的末端开始,步步向上归约,直至根结点的分析方法。,4.2自顶向下分析法非确定的自顶向下分析法的思想对任何输入串w试图用一切可能的办法,从文
2、法的开始符号出发,自上向下地为它建立一棵语法树。或者说,为输入串寻找一个最左推导。如果试探成功,则w为相应文法的一个句子,否则w就不是文法的句子。这种分析过程本质上是一种穷举试探过程,是反复使用不同规则,谋求匹配输入串的过程。例:设有文法GS SaAb,A de|d,判断adb是否为该文法的句子。自顶向下分析的难点:对于形如:U x1|x2|xn 的规则,可能需要对所有的规则都要试探,效率很低。故常使用确定的自顶向下分析法,但确定的自顶向下分析法对文法有一定的限制,既是要求文法无左递归和无回溯。,文法的左递归和回溯的消除1.左递归的消除(1)引进一个新的非终结符,把含左递归的规则改写为右递归,
3、一般地,对于含有左递归规则的文法GA:A A1|A 2|A m|1|2|n 消除左递归规则后的文法为:A 1A|2A|nA A 1A|2A|mA|,例:E E+T|E-T|T T TF|T/F|F F(E)|i,E TEE+TE|-TE|T FTT*FT|/FT|F(E)|i,(2)扩充的BNF表示法1)专用符号:扩充的BNF又引进了三对专用符号。花括号:表示符号串可以重复出现任意次。使用可以消除规则的左递归现象的出现。例:N ND|D D 0|1|2|9用扩充的BNF可以表示为:N DDD 0|1|2|9方括号:表示符号串可有可无圆括号():()表示提因子。例:A ax|ay|aw 改写为:
4、A a(x|y|w)。,2)扩充的BNF表示法的用途例:设有文法GE:E T|E+TT F|T*F F i|(E)用扩充的BNF法可改写为:E T+TT FFF i|(E)扩充的BNF表示法最大特点就是消除了文法的左递归问题。,E T+T|-TT FF|/FF i|(E),例:设有文法A Ac|Aad|bd|e,用扩充的BNF表示法对其改写,A(bd|e)c|ad,2.回溯的消除引起回溯的原因:在文法中某个非终结符A有多个候选式,遇到用A去匹配当前输入符号时,无法确定选用唯一的一个候选式,而只能逐一进行试探,从而引起回溯。具体表现为两种情况:第一种情况是相同左部的规则,其右部左端第一个符号相同
5、。SaAb,A de|d,对于adb第二种情况是相同左部的规则,其中某一右部能推出。ABx,B x|,对于x,常用的符号集有三种:首符号集:FIRST;向前看集:FOLLOW;可选集:SELECT。(1)设是文法G的任一符号串,定义符号串的首符号集为:FIRST()=a|a,a Vt 若,则规定 FIRST(),既FIRST()是从可以推导出的所有首终结符或可能的。(2)设文法G的开始符号为S,对于G的任何非终结符A,定义非终结符A的向前看集FOLLOW(A)=a|S Aa,aVt若有S A,则规定$FOLLOW(A),换句话说FOLLOW(A)是文法的所有句型中紧接在A之后出现的终结符或$,
6、$作为输入串的结束符。(3)设有文法GS,并有规则A,AVN,V*,则该规则的可选集为:SELECT(A)=,FIRST()若,FIRST()FOLLOW(A)若,一个上下文无关文法G是LL(1)文法,并且仅当对G中每个非终结符A的任何两个不同的规则A|,满足SELECT(A)SELECT(A)=,其中,中至多只有一个能推出串。例:判断下列文法是否为LL(1)文法1.SaAb,A de|d2.A aB|d,B bBA|3.SaAB,A bB|dA|,B a|e某些非LL(1)文法到LL(1)文法的改写若文法中含有左递归或含有公共左因子,则该文法不是LL(1)文法,因此对于某些非LL(1)文法来
7、说,可以通过消除左递归和反复提取公共左因子对文法进行等价变换,将其改造为LL(1)文法。,提取公共因子:当文法中含有形如A1|2|n的规则,可将它改写成AAA 1|2|n若在1,2,n中仍含有公共左因子,这时可再次提取,这样反复进行提取,直到引进新的非终结符的有关规则再无公共左因子为止。例:将下例文法改写为LL(1)文法,并验证之。1.SaAb,A de|d2.Sad|Ae,A aS|bA,对于文法S Ae|Bd,A aAe|b,B aBd|b,递归下降分析法基本思想:对文法中的每个非终结符编写一个函数(或子程序),每个函数(或子程序)的功能是识别由该非终结符所表示的语法成分。由于描述语言的文
8、法常常是递归定义的,因此相应的这组函数(或子程序)必然以相互递归的方式进行调用,所以将此种分析法称为递归下降分析法。构造递归下降分析程序时,每个函数名是相应的非终结符,函数体则是根据规则右部符号串的结构编写。1)当遇到终结符a时,则编写语句if(当前读来的输入符号=a)读下一个输入符号。2)当遇到非终结符A时,则编写语句调用A()。3)当遇到A 规则时,则编写语句if(当前读来的输入符号FOLLOW(A)error()。4)当某个非终结符的规则有多个候选式时,按LL(1)文法的条件能唯一地选择一个候选式进行推导。,例:设有文法GS:S a|(T)T T,S|S试构造一个识别该文法句子的递归下降
9、分析程序。设函数scaner()的功能是读进源程序的下一个单词符号并把它放在全局变量sym中;函数error()是出错处理程序。,4.2.5 LL(1)分析方法(预测分析法)LL(1)分析方法也是一种自顶向下的分析技术。第一个L表示采用从左到右扫描程序,第二个L表明采用最左推导,1表示分析时每一步只需向前看一个符号即可决定所选用的规则,且这种选择是准确无误的。采用这种方法进行语法分析要求描述语言的文法是LL(1)文法。预测分析器由一张预测分析表(也称LL(1)分析表)、一个先进后出的分析栈和总控程序三部分组成。,Sk,Tj,预测分析表是一个MA,a形式的矩阵,其中A为非终结符,a是终结符或$,
10、分析表元素MA,a中的内容为一条关于A的规则,表明当A面临输入符号a时,当前推导所应采用的候选式,当元素的内容为出错标识时,则表明A不应该面临输入符号a。预测分析器的总控程序在任何时候都是根据栈顶符号和当前符号a来决定分析器的动作。分析器工作流程可简单表示为:1.初始化。分析开始时,首先将栈底符号$及文法的开始符号S推入分析栈,并对各指示器置初值,此时分析栈与输入串有如下格局:之后反复执行下面的第二步。2.设在分析的某一时刻,分析栈和余留的输入串处于如下的格局:,时可视分析栈顶的文法符号Xm的不同情况,分别作如下处理:(1)若XmVT$,且Xm=ai,则表明栈顶符号已与当前正扫视的输入符号(包
11、括句尾符号$在内)相匹配,此时应将Xm从栈中退出,并将输入串指示器向前推进一个位置,否则进行语法错误处理;(2)若XmVn,则以符号对(Xm,ai)查分析表,设元素AXm,ai为产生式Xm Y1 Y2 Yk,则将Xm从栈中退出,并将Y1 Y2 Yk按反序推入栈中,从而产生如下格局:但若AXm,ai为“出错”,则进行语法错误处理。,(3)若Xm=ai=$(即分析栈将被拆空),则表明输入串已完全得到匹配,此时可宣告分析成功而结束工作。,构造预测分析表的算法(1)计算文法G的每一个非终结符的FIRST集和FOLLOW集。1)对每一文法符号X(VNVT),计算FIRST(X):a.若X VT,则FIR
12、ST(X)=X;b.若XVN,且有规则Xa,a VT,则a FIRST(X);c.若XVN,且有规则X,FIRST(X);d.若XY是一个产生式且YVN,则把FIRST(Y)中的所有非元素都加到FIRST(X)中;若有规则Xy1y2yn,对于任意的i(1i n),当y1y2yi-1都是非终结符,且y1y2yi-1 时,则将FIRST(yi)中的所有非元素都加到FIRST(X)中,特别是,若y1y2yn,则 FIRST(X)。e.反复使用a-d,直到FIRST集不再增大为止。,2)对每一文法符号AVN,计算FOLLOW(A):a.对文法的开始符号S,则将$加到FOLLOW(S)中;b.若A B是
13、一条规则,则把FIRST()中的非元素加到FOLLOW(B)中;c.若A B 或A B是一条规则且,则把FOLLOW(A)加到FOLLOW(B)中;d.反复使用b-c直到每个非终结符的FOLLOW集不再增大为止。(2)对文法的每个规则A,若a FIRST(),则置MA,a=A。(3)若 FIRST(),则对任何b FOLLOW(A),则MA,b=A。(4)把分析表中无定义的元素标上出错标识error(表中用空白表示)P67 例4.10,4.3自下向上分析法的一般原理自下向上分析法是按照移进归约法的原理建立起来的一种语法分析方法,这种分析法的基本思想是:用一个寄存文法符号的先进后出的栈,将输入符
14、号一个一个地按从左到右扫描顺序移入栈中,边移入边分析,当栈顶符号串形成某条规则右部时就进行一次归约,即用该规则左部非终结符替换相应规则右部符号串,我们把栈顶被归约的这一符号串称为可归约串。重复这一过程直到整个输入串分析完毕。最终若栈中剩下句子界符“$”和文法的开始符号,则所分析的输入符号串是文法的正确句子,否则,就不是文法正确的句子,报告错误。例:设有文法GA:AaBcDe,B b,B Bb,D d,实现自下而上分析法的关键问题是如何精确定义可归约串,以及怎样识别可归约串,4.4算符优先分析法方法概述所谓的算符优先分析法就是依照算术表达式的四则运算过程而设计的一种语法分析方法,这种方法首先要规
15、定运算符之间(确切的说是终结符之间)的优先关系和结合性质,然后借助这种关系,比较相邻运算符的优先级来确定句型的可归约串,并进行归约。例:E E+E|E*E|(E)|i对于句子i+i*i有两种不同的规范归约。第一种:i+i*i E+i*i E+E*i E+E*E E+E E 第二种:i+i*i E+i*i E+E*i E*i E*E E问题原因:没有定义+和*的优先关系,在第一种规范归约中是假定*优先于+,所以不能立即把E+E归约为E,而在第二种归约中是假定+优先于*,因此必须把E+E归约为E。可见在归约过程中起决定因素的是相邻两个终结符号的优先关系。,任意两个相邻终结符号a和b之间的优先关系有
16、三种:ab a的优先级大于b优先关系与出现的左右次序有关:a a一个文法的终结符号之间的优先关系可用一个矩阵来表示,矩阵的每一行每一列都是文法的终结符,矩阵元素是两个终结符之间可能的优先关系。算符优先分析法并不是对所有的文法都适合,他对文法有一定的要求,即要求文法是算符优先文法。,算符优先文法的定义1.算符文法的定义设有文法G,若G中没有形如U VW的规则,其中V、W为非终结符,则称G为算符文法,也称OG文法。也就是说在算符文法中任何一个规则右部都不存在两个非终结符相邻的情况。算符文法有两个重要性质:1)在算符文法中任何句型都不含有两个相邻的非终结符。2)若Ab或bA出现在算符文法的句型中,其
17、中AVN,b VT,则中任何含有b的短语必含有A.,算符优先关系表的构造首先对文法每个非终结符A定义两个集合:FIRSTVT(A)=b|A b或A Bb,bVT,B VNLASTVT(A)=a|A a或A aB,aVT,B VN构造文法G的优先关系表算法如下:1)为每个非终结符A计算FIRSTVT(A)和LASTVT(A)。2)执行程序for(每个产生式Ax1x2xn)for(i=1;i=n-1;i+)if(xiVT且Xi+1 VT)置xi Xi+1;if(i=n-2且xiVT且Xi+2 VT,而Xi+1 VN)置xi Xi+2;,if(xiVT,Xi+1 VN)for(FIRSTVT(Xi+
18、1)中的每个b)置xi xi+1;3)对FIRSTVT(S)中的所有b置$;置$,S为文法的开始符号例:设有文法:GEE E+T|TT TF|FF(E)|i,算符优先分析算法的设计算术优先分析法并不是一种规范归约的分析法,它不是用句柄来刻画可归约串,而是用最左素短语来刻画可归约串。1.最左素短语所谓句型的素短语是指这样一种短语,它至少包含一个终结符,并且除自身之外,不再包含其他的素短语。句型最左边的素短语称为最左素短语。如上例对句型T+T*F+i求其素短语和最左素短语。2.识别句型最左素短语的方法由算符文法的性质可知,算符优先文法的任何句型都没有相邻的两个非终结符,其句型总可以表示成$N1a1
19、N2a2NnanNn+1$,其中Ni为非终结符或空,ai为终结符(1i n),对算符优先文法有如下定理:一个算符优先文法G的任何句型的最左素短语是满足下列条件的最左子串NiaiNi+1ai+1ajNj+1ai-1 aj+1具体方法是:从左到右扫描句型中的各个符号,且在扫描过程中,依次查看两相继终结符号间的优先关系,直至找出满足关系aj aj+1的终结符aj为止,记下aj的位置,再从aj开始向左扫描,直至找到满足关系ai-1 ai的终结符ai为止,此时形如NiaiNi+1ai+1ajNj+1的子串即为句型应归约的最左素短语。,3.算符优先分析法用一个存放文法符号的先进后出的栈,并利用优先关系确定
20、最左素短语是否已经形成来决定分析器的动作,如果当前栈顶的终结符号和待输入符号之间的优先关系是,则表示已找到最左素短语的尾,再从栈顶开始,按优先关系在栈内向前寻找最左素短语的头,然后分析器将归约最左素短语,如果出现两个终结符号之间不存在优先关系,则表示存在语法错误,分析器调用出错处理程序。算法:设K为栈的使用深度,a用来存放当前输入符号,j是栈的查找指针,Q是工作单元,则算法流程图如下:,在算法中没有指明应将栈顶的最左素短语归约到哪一个非终结符N,这是因为非终结符在分析过程中对识别最左素短语没有任何影响,因此可以不关心非终结符到底是哪一个具体符号,故可取任意的名字N来代替它们。分析成功的标志是栈
21、中仅剩下$N.优先函数的构造1.优先函数f和g的定义当ab则令f(a)g(b)我们把f和g分别称为栈内优先函数和栈外优先函数。这样a和b之间的优先关系可以由比较f(a)和g(b)的大小来决定。,2.优先函数的构造方法方法一:逐次加1法1)确定初值,对所有的终结符(包括$)a,令f(a)=g(a)=0(可为其它任意正数)2)对所有终结符a和b如果ab,而f(a)g(b),则令f(a)=g(b)+1如果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)的
22、值大于2n(n为终结符个数)则表明该函数关系表不存在优先函数。对优先函数每个元素的值都增加同一常数,仍为原优先关系表的优先函数,即一个文法的优先关系表对应的优先函数不唯一,当然有一些优先关系表不存在对应的优先函数。,方法二:Bell有向图法1)对每个终结符a(包括$),令其对应两个符号fa和ga,画一张以所有符号fa和ga为结点的方向图,若ab或a b,就要画一条从fa到gb的方向弧;若ab或a b,就要画一条从gb到fa的方向弧。2)对每个结点都赋予一个数,此数等于从该点出发所能到达的结点(包括该结点自身在内)的个数,赋给结点fa的数等于fa的值,赋给结点gb的数等于gb的值。3)对构造出的
23、优先函数f和g进行检查,看他们同原先的优先关系表是否矛盾,若没有矛盾,则f和g既为所求优先函数,否则不存在优先函数。,4.5 LR分析方法所谓LR(K)方法:是指从左到右扫描和自底向上的语法分析方法。L是指从左到右扫描输入符号串,R是指构造最右推导的逆过程,K指最多向前看K个符号就可惟一确定是归约还是移进。LR(K)理论证明:1)每个LR(K)文法都是无二义性文法2)一个由LR(K)文法产生的语言也可由LR(1)文法产生。而且通常的程序设计语言一般都能由LR(1)文法产生,因此对程序设计语言的编译,我们仅需要考虑K1的情况即可。4.5.1 LR分析器的原理和过程LR分析法确定句柄的基本思想:在
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 语法分析

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