【教学课件】第四章自顶向下的语法分析.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《【教学课件】第四章自顶向下的语法分析.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第四章自顶向下的语法分析.ppt(55页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第四章第四章 自顶向下的自顶向下的语法分析语法分析School of Computer Science&Technology Harbin Institute of Technology重点:重点:自顶向下分析的基本思想,预测分析器总体结构,预测分自顶向下分析的基本思想,预测分析器总体结构,预测分析表的构造,递归下降分析法基本思想,简单算术表达式的递归析表的构造,递归下降分析法基本思想,简单算术表达式的递归下降分析器。下降分析器。难点:难点:FIRST FIRST 和和 FOLLOW FOLLOW 集的求法,对它们的理解以及在构造集的求法,对它们的理解以及在构造LL(1)LL(1)分析表时的使
2、用。递归子程序法中如何体现分析的结果。分析表时的使用。递归子程序法中如何体现分析的结果。2023/1/102第第4章章 自自顶顶向下的向下的语语法分析法分析4.1 语法分析概述语法分析概述 4.2 自顶向下的语法分析面临的问题自顶向下的语法分析面临的问题 与文法的改造与文法的改造 4.3 预测分析法预测分析法 4.4 递归下降分析法递归下降分析法 4.5 本章小结本章小结2023/1/103语语法分析的功能和位置法分析的功能和位置n语法分析语法分析(syntax analysis)(syntax analysis)是编译程序的核心部是编译程序的核心部分,其任务是检查词法分析器输出的单词序列是否
3、是分,其任务是检查词法分析器输出的单词序列是否是源语言中的句子,亦即是否符合源语言的语法规则。源语言中的句子,亦即是否符合源语言的语法规则。图图4.14.1语法分析器在编译器中的位置语法分析器在编译器中的位置2023/1/1044.1 语法分析概述语法分析概述 递归子程序法递归子程序法自顶向下自顶向下 预测分析法预测分析法(LL(1)(LL(1)算符优先分析法算符优先分析法自底向上自底向上 LR(0)LR(0)、SLR(1)SLR(1)、LR(1)LR(1)、LALR(1)LALR(1)Top DownTop DownBottom UpBottom Up从文法产生语言的角度从文法产生语言的角度
4、从自动机识别语言的角度从自动机识别语言的角度从根开始,逐从根开始,逐步为某语句构步为某语句构造一棵语法树造一棵语法树相反,将一句相反,将一句子归约为开始子归约为开始符号符号问题:解决确定性问题!问题:解决确定性问题!假定文法是压缩的:即删除了单位产生式和无用产生式。假定文法是压缩的:即删除了单位产生式和无用产生式。2023/1/1054.2 自顶向下的语法分析面临的问题自顶向下的语法分析面临的问题与文法的改造与文法的改造n自顶向下语法分析的基本思想自顶向下语法分析的基本思想n从文法的开始符号出发,寻求所给的输入符号串从文法的开始符号出发,寻求所给的输入符号串的一个最左推导。的一个最左推导。n从
5、树根从树根S开始,构造所给输入符号串的语法树开始,构造所给输入符号串的语法树n例例:设有设有G:SxAy A*|*,输入串:,输入串:x*yS S S SxAy x*yS Sx xA Ay y*2023/1/1064.2.1 自顶向下分析面临的问题自顶向下分析面临的问题1.二义性问题二义性问题n对于文法对于文法G,如果,如果L(G)中存在一个具有两棵或两棵以上中存在一个具有两棵或两棵以上分析树的句子,则称分析树的句子,则称G是二义性的。也可以等价地说:是二义性的。也可以等价地说:如果如果L(G)中存在一个具有两个或两个以上最左中存在一个具有两个或两个以上最左(或最右或最右)推导的句子,则推导的
6、句子,则G是二义性文法。是二义性文法。n如果一个文法如果一个文法G是二义性的,假设是二义性的,假设w L(G)且且w存在两存在两个最左推导个最左推导,则在对,则在对w进行自顶向下的语法分析时,语进行自顶向下的语法分析时,语法分析程序将无法确定采用法分析程序将无法确定采用w的哪个最左推导。的哪个最左推导。nGexp:EE+T|E-T|TTT*F|T/F|FFFP|P Pc|id|(E)解决办法:改造文法,引入新的文法变量解决办法:改造文法,引入新的文法变量2023/1/1074.2.1 自顶向下分析面临的问题自顶向下分析面临的问题2.回溯问题回溯问题n文法中每个语法变量文法中每个语法变量A的产生
7、式右部称为的产生式右部称为A的的候选式,如果候选式,如果A有多个候选式存在公共前缀,有多个候选式存在公共前缀,则自顶向下的语法分析程序将无法根据当前输则自顶向下的语法分析程序将无法根据当前输入符号准确地选择用于推导的产生式,只能试入符号准确地选择用于推导的产生式,只能试探。当试探不成功时就需要退回到上一步推导,探。当试探不成功时就需要退回到上一步推导,看看A是否还有其它的候选式,这就是是否还有其它的候选式,这就是回溯回溯(backtracking)。nGe:ET EE+T EE-T TF TT*F TT/F F(E)Fid n例如:考虑为输入串例如:考虑为输入串id+id*id建立最左推导建立
8、最左推导 2023/1/1084.2.1 自顶向下分析面临的问题自顶向下分析面临的问题2.回溯问题回溯问题nET (4.1)nETF (4.2)nETF(E)(4.3)nETFid (4.4)nETT*F (4.5)n.4.2.2节我们将采用提取左因子的方法来改造文法,节我们将采用提取左因子的方法来改造文法,以便减少推导过程中回溯现象的发生,当然,单以便减少推导过程中回溯现象的发生,当然,单纯通过提取左因子无法彻底避免回溯现象的发生。纯通过提取左因子无法彻底避免回溯现象的发生。2023/1/1094.2.1 自顶向下分析面临的问题自顶向下分析面临的问题3.左递归引起的无穷推导问题左递归引起的无
9、穷推导问题n假设假设A是文法是文法G的某个语法变量,如果存在推导的某个语法变量,如果存在推导A A,则称文法,则称文法G是递归的是递归的,当,当=时称之为左递归;时称之为左递归;如果如果A A至少需要两步推导,则称文法至少需要两步推导,则称文法G是间接递归的是间接递归的,当当=时称之为间接左递归;时称之为间接左递归;如果文法如果文法G中存在形如中存在形如AA的产生式,则称文法的产生式,则称文法G是直接递归的是直接递归的,当,当=时时称之为直接左递归称之为直接左递归。nGer:ET EE+T EE-T TF TT*F TT/F F(E)Fid n考虑考虑为输入串为输入串id+id*id建立一个最
10、左推导建立一个最左推导 nEE+TE+T+TE+T+T+T 2023/1/10104.2.2 对上下文无关文法的改造对上下文无关文法的改造 1.消除二义性消除二义性n改造的方法就是通过引入新的语法变量等,使文法改造的方法就是通过引入新的语法变量等,使文法含有更多的信息。其实,许多二义性文法是由于概含有更多的信息。其实,许多二义性文法是由于概念不清,即语法变量的定义不明确导致的,此时通念不清,即语法变量的定义不明确导致的,此时通过引入新的语法变量即可消除文法的二义性。过引入新的语法变量即可消除文法的二义性。n if then n|if then else n|other (4.7)n根据根据if
11、语句中语句中else与与then配对情况将其分为配对的语配对情况将其分为配对的语句和不配对的语句两类。上述句和不配对的语句两类。上述if语句的文法没有对语句的文法没有对这两个不同的概念加以区分,只是简单地将它们都这两个不同的概念加以区分,只是简单地将它们都定义为定义为,从而导致该文法是二义性的。,从而导致该文法是二义性的。2023/1/10114.2.2 对上下文无关文法的改造对上下文无关文法的改造 引入语法变量引入语法变量来表示不配来表示不配对语句,对语句,表示配对语句表示配对语句 n|n if then else|othern if then|if then else 2023/1/101
12、24.2.2 对上下文无关文法的改造对上下文无关文法的改造 2.消除左递归消除左递归n直接左递归的消除直接左递归的消除(转换为右递归转换为右递归)n引入新的变量引入新的变量A,将左递归产生式,将左递归产生式AA|替换为替换为AA A A|nEE+T|T TT*F|F F(E)|id替换为:替换为:nETE E+TE|TFT T*FT|F(E)|id n一般地,假设文法一般地,假设文法G中的语法变量中的语法变量A的所有产生式如下:的所有产生式如下:AA1|A2|An|1|2|m其中,其中,i(i=1,2,m)不以不以A打头。则用如下的产生式代替打头。则用如下的产生式代替A的所有产生式即可消除其直
13、接左递归:的所有产生式即可消除其直接左递归:A1A|2A|mA A1A|2A|nA|2023/1/10134.2.2 对上下文无关文法的改造对上下文无关文法的改造 算法算法4.1 消除左递归。消除左递归。输入:不含循环推导和输入:不含循环推导和-产生式的文法产生式的文法G;输出:与输出:与G等价的无左递归文法等价的无左递归文法;步骤:步骤:1将将G的所有语法变量排序的所有语法变量排序(编号编号),假设排序后的语法变量记,假设排序后的语法变量记为为A1,A2,An;2for i1 to n 3for j1 to i-1 4用产生式用产生式Ai1|2|k代替每个形如代替每个形如AiAj的产生式,的
14、产生式,其中,其中,Aj1|2|k是所有的当前是所有的当前Aj产生式;产生式;5 6 消除消除Ai产生式中的所有直接左递归产生式中的所有直接左递归7 2023/1/10144.2.2 对上下文无关文法的改造对上下文无关文法的改造n3.3.提取左因子提取左因子n对每个语法变量对每个语法变量A,找出它的两个或更多候选式的最,找出它的两个或更多候选式的最长公共前缀长公共前缀。如果。如果,则用下面的产生式替换所,则用下面的产生式替换所有的有的A产生式产生式A1|2|n|1|2|n,其中,其中1,2,n表示所有不以表示所有不以开头的候选式:开头的候选式:AA|1|2|nA1|2|nn其中,其中,A是新引
15、入的语法变量。反复应用上述变换,是新引入的语法变量。反复应用上述变换,直到任意语法变量都没有两个候选式具有公共前缀为直到任意语法变量都没有两个候选式具有公共前缀为止。请读者自行给出这个变换的算法。止。请读者自行给出这个变换的算法。2023/1/10154.2.3 LL(1)文法文法问题:什么样的文法对其句子才能进行确定的问题:什么样的文法对其句子才能进行确定的自顶向下分析?自顶向下分析?n确定的自顶向下分析首先从文法的开始符号出发,每一步确定的自顶向下分析首先从文法的开始符号出发,每一步推导都根据当前句型的最左语法变量推导都根据当前句型的最左语法变量A和当前输入符号和当前输入符号a,选择选择A
16、的某个候选式的某个候选式来替换来替换A,并使得从,并使得从推导出的第一推导出的第一个终结符恰好是个终结符恰好是a。n当当A有多个候选式时,当前选中的候选式必须是惟一的。有多个候选式时,当前选中的候选式必须是惟一的。n第一个终结符是指符号串的第一个符号,并且是终结符号,第一个终结符是指符号串的第一个符号,并且是终结符号,可以称为首终结符号。在自顶向下的分析中,它对选取候可以称为首终结符号。在自顶向下的分析中,它对选取候选式具有重要的作用。为此引入首符号集的概念。选式具有重要的作用。为此引入首符号集的概念。2023/1/10164.2.3 LL(1)文法文法1.假设假设是文法是文法G=(V,T,P
17、,S)的符号串,即的符号串,即(VT)*,从,从推导出的串的首符号集记作推导出的串的首符号集记作FIRST():FIRST()=a|a,a T,(VT)*。2.如果如果 ,则,则 FIRST()。3.如果文法如果文法G中的所有中的所有A产生式为产生式为A1|2|m,且且 FIRST(1)FIRST(2)FIRST(n)且对且对 i,j,1 i,j m;ij,均有,均有FIRST(i)FIRST(j)=成立,则可以对成立,则可以对G的句子的句子进行确定的自顶向下分析进行确定的自顶向下分析2023/1/10174.2.3 LL(1)文法文法如果如果存在存在A这样的产生式,则需定义这样的产生式,则需
18、定义FOLLOW(A)A定义定义A的的后续符号集为后续符号集为:1.FOLLOW(A)=a|S Aa,a T,(VT)*2.如果如果A是某个句型的最右符号,则将结束符是某个句型的最右符号,则将结束符#添加到添加到FOLLOW(A)中中3.如果如果j ,则如果对,则如果对 i(1 i m;ij),FIRST(i)FOLLOW(A)=均成立,则可以对均成立,则可以对G的句子进行确定的自顶向下分析的句子进行确定的自顶向下分析2023/1/10184.2.3 LL(1)文法文法如果如果G的任意两个具有相同左部的产生式的任意两个具有相同左部的产生式A|满足下列条满足下列条件:件:1.如果如果、均不能推导
19、出均不能推导出,则,则FIRST()FIRST()=;2.和和至多有一个能推导出至多有一个能推导出;3.如果如果 ,则,则FIRST()FOLLOW(A)=则称则称G为为LL(1)文法。文法。第一个第一个L代表从左向右扫描输入符号串,第二个代表从左向右扫描输入符号串,第二个L代表产代表产生最左推导,生最左推导,1代表在分析过程中执行每步推导都要向代表在分析过程中执行每步推导都要向前查看一个输入符号前查看一个输入符号 2023/1/1019LL(1)文法的判定文法的判定算法算法4.2 计算计算FIRST(X)。输入:文法输入:文法G=(V,T,P,S),X(VT);输出:输出:FIRST(X);
20、步骤:步骤:1FIRST(X)=;2if(XT)then FIRST(X):=X;3if XV then begin4if(X P)then FIRST(X):=FIRST(X)a|XaP;5if(XP)then FIRST(X):=FIRST(X)a|XaPend6对对 X,重复如下的过程,重复如下的过程7-10,直到所有,直到所有FIRST集不变为止。集不变为止。7if(XYP and YV)then FIRST(X):=FIRST(X)(FIRST(Y)-);8if(XY1YnP and Y1.Yi-1 )then 9for k=2 to i do FIRST(X):=FIRST(X)(
21、FIRST(Yk)-);10if Y1.Yn then FIRST(X):=FIRST(X);2023/1/1020LL(1)文法的判定文法的判定算法算法4.3 计算计算FIRST()。输入:文法输入:文法G=(V,T,P,S),(VT)*,=X1Xn;输出:输出:FIRST();步骤:步骤:1计算计算FIRST(X1);2FIRST():=FIRST(X1)-;3k:=1;4while(FIRST(Xk)and kn)do begin5 FIRST():=FIRST()(FIRST(Xk+1)-);6 k:=k+1 end7if(k=n and FIRST(Xk)then FIRST():=
22、FIRST();2023/1/1021例例 表达式文法的语法符号的表达式文法的语法符号的FIRST 集集FIRST(F)=(,idFIRST(T)=FIRST(F)=(,id FIRST(E)=FIRST(T)=(,id FIRST(E)=+,FIRST(T)=*,FIRST(+)=+,FIRST(*)=*FIRST(()=(FIRST())=)FIRST(id)=idETE ETE E+TE|E+TE|TFT TFT T*FT|T*FT|F(E)|idF(E)|id2023/1/1022LL(1)文法的判定文法的判定算法算法4.4 计算计算FOLLOW集。集。输入:文法输入:文法G=(V,T
23、,P,S),A V;输出:输出:FOLLOW(A);步骤:步骤:1对对 XV,FOLLOW(X):=;2FOLLOW(S):=#,#为句子的结束符为句子的结束符;3对对 XV,重复下面的第,重复下面的第4步到第步到第5步,直到所有步,直到所有FOLLOW集不变为止。集不变为止。4若若ABP,则,则FOLLOW(B):=FOLLOW(B)FIRST();5若若AB或或ABP,且,且 ,AB,则,则FOLLOW(B):=FOLLOW(B)FOLLOW(A);2023/1/1023例例 表达式文法的语法变量的表达式文法的语法变量的 FOLLOW 集集FOLLOW(E)=#,)FOLLOW(E)=FO
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件 教学 课件 第四 向下 语法分析
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内