new第四章语法分析1(最后版本).ppt
《new第四章语法分析1(最后版本).ppt》由会员分享,可在线阅读,更多相关《new第四章语法分析1(最后版本).ppt(133页珍藏版)》请在三一办公上搜索。
1、编 译 原 理Compiler Principles,蒋凌云南京邮电大学.计算机学院,第四章 语法分析,教材:编译技术原理及其实现方法王汝传 编著,第四章 语法分析,4.1 引言 一、语法分析任务 二、语法分析方法4.2 自顶向下语法分析 一、自顶向下分析方法的问题及其解决办法 二、递归子程序分析法(递归下降分析法)三、LL(1)分析法4.3 自底向上语法分析 一、简单优先文法分析法 二、算符优先分析法 三、优先函数及其构造 四、LR分析法 五、二义性文法的应用4.4 语法分析程序的自动生成 一、分析器的生成器YACC 二、用YACC处理二义性文法,2,本章内容,第四章 语法分析,4.1 引言
2、 一、语法分析任务 二、语法分析方法4.2 自顶向下语法分析 一、自顶向下分析方法的问题及其解决办法 二、递归子程序分析法(递归下降分析法)三、LL(1)分析法4.3 自底向上语法分析 一、简单优先文法分析法 二、算符优先分析法 三、优先函数及其构造 四、LR分析法 五、二义性文法的应用4.4 语法分析程序的自动生成 一、分析器的生成器YACC 二、用YACC处理二义性文法,3,本章内容,4.1 引言,本节内容,一、语法分析任务 1.语法检查 2.根据语法符号进行一定处理加工二、语法分析方法 1.自顶向下语法分析方法 2.自底向上语法分析方法,词法分析阶段,主要介绍了单词符号的结构、识别(用状
3、态转换图),描述(通过正规式)以及有限自动机DFA和NFA。在一个编译程序对某个源程序完成了词法工作以后,就进入了语法分析阶段。由词法分析程序所产生的单词符号流,作为语法分析程序的输入串,按文法规则分析检查是否构成了合法的句子。首先来了解一下语法分析的任务。,5,4.1 引言,一、语法分析任务,一、语法分析任务 1.语法检查 2.根据语法符号进行一定处理加工二、语法分析方法 1.自顶向下语法分析方法 2.自底向上语法分析方法,6,4.1 引言,一、语法分析任务,7,1.语法检查 根据语法规则对各种语法成分进行分析,确定它们的 语法关系以检查语法上的正确和错误,并指出错误的性质 和出错位置。如:
4、if B then S1 else S2 若写成 if B then else S2 就错了(then后少一个S1),4.1 引言,一、语法分析任务,一、语法分析任务 1.语法检查 2.根据语法符号进行一定处理加工二、语法分析方法 1.自顶向下语法分析方法 2.自底向上语法分析方法,8,4.1 引言,一、语法分析任务,9,2.根据语法符号进行一定语义处理加工 如语法分析过程得到一个合法的句子时,往往同时进 行必要的语义分析等 如:当遇到处理表达式a+b*c时,若该表达式语法关 系正确,就可以进行语义处理加工,可将该表达式 变成中间语言,以便以后生成目标程序,4.1 引言,一、语法分析任务,一、
5、语法分析任务 1.语法检查 2.根据语法符号进行一定处理加工 二、语法分析方法 1.自顶向下语法分析方法 2.自底向上语法分析方法,10,4.1 引言,二、语法分析方法,语法分析方法很多,但能够产生计算机程序并能得到广泛应用的主要有两大类,按照生成语法树的顺序,分别称为自顶向下和自底向上分析方法。,11,4.1 引言,二、语法分析方法,一、语法分析任务 1.语法检查 2.根据语法符号进行一定处理加工 二、语法分析方法 1.自顶向下语法分析方法 2.自底向上语法分析方法,12,4.1 引言,二、语法分析方法,13,1.自顶向下语法分析方法(1)带回溯分析方法(2)不带回溯分析方法(3)递归子程序
6、法(4)LL(1)分析法,4.1 引言,二、语法分析方法,一、语法分析任务 1.语法检查 2.根据语法符号进行一定处理加工 二、语法分析方法 1.自顶向下语法分析方法 2.自底向上语法分析方法,14,4.1 引言,二、语法分析方法,15,2.自底向上语法分析方法,(1)简单优先分析法(2)算符优先分析法(3)LR分析法(4)SLR分析法(5)LALR分析法,4.1 引言,二、语法分析方法,第四章 语法分析,4.1 引言 一、语法分析任务 二、语法分析方法4.2 自顶向下语法分析 一、自顶向下分析方法的问题及其解决办法 二、递归子程序分析法(递归下降分析法)三、LL(1)分析法4.3 自底向上语
7、法分析 一、简单优先文法分析法 二、算符优先分析法 三、优先函数及其构造 四、LR分析法 五、二义性文法的应用4.4 语法分析程序的自动生成 一、分析器的生成器YACC 二、用YACC处理二义性文法,16,本章内容,第四章 语法分析,4.1 引言 一、语法分析任务 二、语法分析方法4.2 自顶向下语法分析 一、自顶向下分析方法的问题及其解决办法 二、递归子程序分析法(递归下降分析法)三、LL(1)分析法4.3 自底向上语法分析 一、简单优先文法分析法 二、算符优先分析法 三、优先函数及其构造 四、LR分析法 五、二义性文法的应用4.4 语法分析程序的自动生成 一、分析器的生成器YACC 二、用
8、YACC处理二义性文法,17,本章内容,一、自顶向下分析方法的问题及其解决办法 1.消除回溯 2.消除左递归 二、递归子程序分析法(递归下降分析法)1.递归子程序定义 2.递归调用子程序的处理 3.分析实例 4.递归子程序特点 三、LL(1)分析法 1.定义 2.LL(1)分析方法 3.构造分析表 4.LL(1)文法,18,4.2 自顶向下语法分析,本节内容,一、自顶向下分析方法的问题及其解决办法 1.消除回溯 2.消除左递归 二、递归子程序分析法(递归下降分析法)1.递归子程序定义 2.递归调用子程序的处理 3.分析实例 4.递归子程序特点 三、LL(1)分析法 1.定义 2.LL(1)分析
9、方法 3.构造分析表 4.LL(1)文法,19,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,一、自顶向下分析方法的问题及其解决办法 1.消除回溯 2.消除左递归 二、递归子程序分析法(递归下降分析法)1.递归子程序定义 2.递归调用子程序的处理 3.分析实例 4.递归子程序特点 三、LL(1)分析法 1.定义 2.LL(1)分析方法 3.构造分析表 4.LL(1)文法,20,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,1.消除回溯 对于自顶向下语法分析来说,对于某些文法,可能会遇到“回溯”和“左递归”的问题,为了能有效地运用这种语法分析方法,应使文法
10、不含左递归及避免回溯。(1)回溯分析方法定义 在进行自顶向下语法分析时,对于文法规则中具有同一左部而右部有不同规则时,在分析时按顺序一个个试探,若能分析下去则成,否则再退回到出错点换另一规则重新试探。这种方法称回溯分析方法。其实质就是使用不同规则反复试探。如:ScAd Aab|a 要判断“cad”是否为该文法的句子,可以分别用Aab和Aa代入第一个产生式中试探。,21,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,(2)回溯问题的解决 1)路标法 定义:设有规则Ua1V1|a2V2|anVn 若ai为互不相同的终结符时,将ai作为路标,当被分析符号串为ai时,便可按规则Ua
11、iVi往下分析,这样可以消除回溯。如::|if then 当分析语句:if AB then A:=B时,我们可以根据第二个产生式以if开始直接选用它作判断。if在这里就是路标 因此,我们在设计程序设计语言时,要考虑语法规则各选择项开始符号互不相同,22,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,为了避免回溯,我们对文法要求是FIRST(i)FIRST(j)(ij)即对文法中的任意一个非终结符号,其规则右部有多个选择时,若由各个选择所推出的终结符号串首符号集合要两两不相交。这样,就可能根据当时读进的符号是属于哪个选择的FIRST(i),来唯一地确定该选用哪个选择来匹配输入
12、串。如:当前输入符号为b(b),如果b FIRST(i),则可以选择第i个产生式去匹配输入串。,23,一般地,设U为文法的任意非终结符号,若U有如下规则 Un i+若定义任一个选择 i的所有可能推出终结符号串的首符号集FIRST(i)为FIRST(i)a i*a,a显然 FIRST(i),4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,一般地说,如果有规则Uaaan则可以将这些规则写成U aUUn其中a称为左公因子,经过反复提取公因子即可将每个非终结符的所有选择首符号集变成两两不相交。,24,2)提取左因子法当文法不满足上述路标法条件,即右部各规则首符号相同时,我们可以采用提
13、取左因子法对文法进行改写。,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,25,注意:Uxy|x,可写成Ux(y|),当分析符号串遇到 时,认为总能匹配,可以一直分析下去。Uxy|x,也可写成Uxy,表示y不出现或出现一次。,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,S xAy,A*(*|)进一步改写成 S xAy,A*A1,A1*|为分析符号串x*y,可以从开始符号出SxAy,下一待匹配符号为*,所以用A*A1,得 SxAy x*A1y,下一个待匹配的符号为y,所以 用 A1(若用A1*则意味着下一个为*,不能匹配)得SxAy x*A1yx*y(即
14、x*y,匹配成功)。可见没出现回溯现象。,26,S,x,y,A,*,A1,如:有文法 S xAy,A*|*要分析x*y,显然存在回溯。为避免分析时回溯,可以将文法改写成:,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,一、自顶向下分析方法的问题及其解决办法 1.消除回溯 2.消除左递归 二、递归子程序分析法(递归下降分析法)1.递归子程序定义 2.递归调用子程序的处理 3.分析实例 4.递归子程序特点 三、LL(1)分析法 1.定义 2.LL(1)分析方法 3.构造分析表 4.LL(1)文法,27,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,2、消除左
15、递归,28,(1)问题的提出 在自顶向下分析过程中,假定现在轮到要用非终结符U去匹配输入串,而在文法中第一条规则是 UU 它是一条直接左递归规则,这种左递归文法将使上述自顶向下的分析过 程陷入无限循环,即:当试图用U去匹配输入串时会发现,在没有吃进任何输入符号的情况下,又得重新要求U去匹配,如此循环下去而无终止。若文法具有间接左递归,即有 UU 那么,也会发生上述问题。,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,29,如:已知文法GS S AB A bB|Aa(存在直接左递归)B Sb|a 现分析符号串baabaab是否是文法G的句子。,其分析过程如下:S AB bBB
16、 bSbB bABbB bbBBbB(得第二个字符与输入串不匹配)S AB bBB bSbB bABbB bAaBbB(只能用A Aa推导,又遇A,出现了死循环)由于文法规则中有左递归A Aa,所以无法分析下去,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,30,(2)消除左递归方法 1)用重复表示法(扩充的表示法)改写语法规则 假定一个文法中有关于非终结符的规则为 其中非空,不以开头,则等价地改写为 例如,下述直接左递归规则:可改写为,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,31,E,E,T,E,T,E,T,T,等价,E,T+T+T+T,T+T+
17、T+T,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,32,同样,规则*,等价于(*),可改写为*这样,改写后的文法消除了直接左递归。可以证明,改写前后的文法是等价的。,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,33,2)消除直接左递归还可用另一种方法来改写形如文法规则的直接左递归。对引入一个新的非终结符,将等价写成 由于不以开头,不以开头,因此改写后两条规则不是直接左递归。同样可以证明这种形式和原来形式是等价的。,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,34,A,A,A,A,等价,A,A,A,A,A,4.2 自顶向下语法分
18、析,一、自顶向下分析方法的问题及其解决办法,就一般而言,关于的规则具有下面形式:nn这时可改写成如下形式:A(n)n由消除直接左递归方法,得(n)(n),35,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,36,例如:A Ac|Aad|bd|e 等价于A A(c|ad)|bd|e,所以可以改写成:A(bd|e)A(即A bdA|eA)A(c|ad)A|(即A cA|adA|),例如:有文法,T*,()i用上述方法可改写成:,*,()i,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,上述两种方法可消除任意直接左递归,但不能消除两步或多步推导形成的左递归。例
19、如,有文法ccbbaa该文法无直接左递归,但有间接左递归,例如有 c bc abc即 abc,37,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,3)消除间接左递归对于间接左递归先将间接左递归变成直接左递归,然后消除直接左递归例如;A aB|Bb(1)B Ac|d(2)先将(1)代入(2)中,得 B Bbc|aBc|d(3)由此将(3)改写为;B(aBc|d)B BbcB|加入文法开始符号的产生式得消除左递归后的等价文法为:A aB|Bb B(aBc|d)B BbcB|,38,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,4)消除文法递归的一般算法要求:
20、文法不含形如 的推导,也不存在这样规则 算法思想如下:将文法的所有非终结符整理成某种顺序,n从U1开始消除U1规则的直接左递归用左部为U1的所有规则右部替换左部为U2,右部以U1开始的规则中的U1,并消除U2规则的直接左递归。用类似的方法把U1,U2的右部替换左部为U3,右部以U1,U2开始的规则中,消除U3规则中的直接左递归。重复上一步,直到最后把左部为U1,U2,Un-1的右部带入Un规则中,并消除Un中的直接左递归。消除多余规则,39,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,将文法的所有非终结符整理成某种顺序,n,然后按此顺序执行下一步;执行循环语句:i:n j
21、 i-1 把形如 ijy的规则改写成 Uixyxyxky 其中Ujxxxk 是Uj的所有规则 消除关于Ui规则中直接左递归 去掉多余规则(如果有的话),40,消除左递归算法,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,例4.2设有文法 ab cde应用上述算法,将非终结符排列,。然后执行循环语句 i 2 j i-消除Ui规则中直接左递归,41,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,当i时,上述语句对文法不产生影响。当i时,应改写规则d,因为ab,所以adbd,此时文法变换成为abc adbde消除关于的直接左递归即可。该文法没有多余的规则。,4
22、2,4.2 自顶向下语法分析,一、自顶向下分析方法的问题及其解决办法,一、自顶向下分析方法的问题及其解决办法 1.消除回溯 2.消除左递归 二、递归子程序分析法(递归下降分析法)1.递归子程序定义 2.递归调用子程序的处理 3.分析实例 4.递归子程序特点 三、LL(1)分析法 1.定义 2.LL(1)分析方法 3.构造分析表 4.LL(1)文法,43,4.2 自顶向下语法分析,二、递归子程序分析法,1.递归子程序定义 一个子程序以直接或间接方式调用本身,称为递归子程序。,44,4.2 自顶向下语法分析,二、递归子程序分析法,一、自顶向下分析方法的问题及其解决办法 1.消除回溯 2.消除左递归
23、 二、递归子程序分析法(递归下降分析法)1.递归子程序定义 2.递归调用子程序的处理 3.分析实例 4.递归子程序特点 三、LL(1)分析法 1.定义 2.LL(1)分析方法 3.构造分析表 4.LL(1)文法,45,4.2 自顶向下语法分析,二、递归子程序分析法,2.递归调用子程序的处理(1)处理基本思想 对于递归子程序调用,用栈存放返回地址,当调用该子程序时,由递归入口子程序将返回地址压入栈中,当返回时,用递归出口子程序从栈中取出返回地址。(2)构造递归子程序的方法 程序语言的许多语法成分是递归定义的,在对程序语言进行不带回溯自顶向下语法分析时,就可以采用递归子程序法。其方法步骤如下:,4
24、6,4.2 自顶向下语法分析,二、递归子程序分析法,1)对文法中每个非终结符号U(它们都分别代表一种语法成分)都编出一个子程序 P(U)2)对于递归出现的非终结符,其相应的子程序中应有递归入口部分(递归入口子程序,取名S),以便将返回地址压入栈中。此外,还应有递归出口部分,设此子程序取名S。以便从地址压入栈中取返回地址3)对于规则Uxxxn,可用下列方法构造(U):ch R()()ch()()E ch(n)(n),47,4.2 自顶向下语法分析,二、递归子程序分析法,其中全程变量ch中存放了当前输入字符;为出错信息,表 示源程序中语法有错。当输入符号遇选择项为时,就自动认为获得 了匹配。4)对
25、于符号串xyyym,如果yi,则(yi)为 chyi(ch)这就是说,如果当前文法中的符号与输入符号匹配,则继续读入下 一个字符至ch中;否则表明源程序有错。如果yi,则(yi)就 代表调用与yi相应的子程序。,48,4.2 自顶向下语法分析,二、递归子程序分析法,一、自顶向下分析方法的问题及其解决办法 1.消除回溯 2.消除左递归 二、递归子程序分析法(递归下降分析法)1.递归子程序定义 2.递归调用子程序的处理 3.分析实例 4.递归子程序特点 三、LL(1)分析法 1.定义 2.LL(1)分析方法 3.构造分析表 4.LL(1)文法,49,4.2 自顶向下语法分析,二、递归子程序分析法,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- new 第四 语法分析 最后 版本

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