欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    【教学课件】第四章自顶向下的语法分析.ppt

    • 资源ID:5665258       资源大小:1.17MB        全文页数:55页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    【教学课件】第四章自顶向下的语法分析.ppt

    第四章 自顶向下的语法分析,School of Computer Science&Technology Harbin Institute of Technology,重点:自顶向下分析的基本思想,预测分析器总体结构,预测分析表的构造,递归下降分析法基本思想,简单算术表达式的递归下降分析器。难点:FIRST 和 FOLLOW 集的求法,对它们的理解以及在构造LL(1)分析表时的使用。递归子程序法中如何体现分析的结果。,2023/8/7,2,第4章 自顶向下的语法分析,4.1 语法分析概述 4.2 自顶向下的语法分析面临的问题 与文法的改造 4.3 预测分析法 4.4 递归下降分析法 4.5 本章小结,2023/8/7,3,语法分析的功能和位置,语法分析(syntax analysis)是编译程序的核心部分,其任务是检查词法分析器输出的单词序列是否是源语言中的句子,亦即是否符合源语言的语法规则。,图4.1语法分析器在编译器中的位置,2023/8/7,4,4.1 语法分析概述,递归子程序法自顶向下 预测分析法(LL(1)算符优先分析法自底向上 LR(0)、SLR(1)、LR(1)、LALR(1),Top Down,Bottom Up,从文法产生语言的角度,从自动机识别语言的角度,从根开始,逐步为某语句构造一棵语法树,相反,将一句子归约为开始符号,问题:解决确定性问题!假定文法是压缩的:即删除了单位产生式和无用产生式。,2023/8/7,5,4.2 自顶向下的语法分析面临的问题与文法的改造,自顶向下语法分析的基本思想从文法的开始符号出发,寻求所给的输入符号串的一个最左推导。从树根S开始,构造所给输入符号串的语法树例:设有G:SxAy A*|*,输入串:x*y,SxAy,x*y,S,2023/8/7,6,4.2.1 自顶向下分析面临的问题,1.二义性问题对于文法G,如果L(G)中存在一个具有两棵或两棵以上分析树的句子,则称G是二义性的。也可以等价地说:如果L(G)中存在一个具有两个或两个以上最左(或最右)推导的句子,则G是二义性文法。如果一个文法G是二义性的,假设wL(G)且w存在两个最左推导,则在对w进行自顶向下的语法分析时,语法分析程序将无法确定采用w的哪个最左推导。Gexp:EE+T|E-T|TTT*F|T/F|FFFP|P Pc|id|(E)解决办法:改造文法,引入新的文法变量,2023/8/7,7,4.2.1 自顶向下分析面临的问题,2.回溯问题文法中每个语法变量A的产生式右部称为A的候选式,如果A有多个候选式存在公共前缀,则自顶向下的语法分析程序将无法根据当前输入符号准确地选择用于推导的产生式,只能试探。当试探不成功时就需要退回到上一步推导,看A是否还有其它的候选式,这就是回溯(backtracking)。Ge:ET EE+T EE-T TF TT*F TT/F F(E)Fid 例如:考虑为输入串id+id*id建立最左推导,2023/8/7,8,4.2.1 自顶向下分析面临的问题,2.回溯问题ET(4.1)ETF(4.2)ETF(E)(4.3)ETFid(4.4)ETT*F(4.5).4.2.2节我们将采用提取左因子的方法来改造文法,以便减少推导过程中回溯现象的发生,当然,单纯通过提取左因子无法彻底避免回溯现象的发生。,2023/8/7,9,4.2.1 自顶向下分析面临的问题,3.左递归引起的无穷推导问题假设A是文法G的某个语法变量,如果存在推导A A,则称文法G是递归的,当=时称之为左递归;如果A A至少需要两步推导,则称文法G是间接递归的,当=时称之为间接左递归;如果文法G中存在形如AA的产生式,则称文法G是直接递归的,当=时称之为直接左递归。Ger:ET EE+T EE-T TF TT*F TT/F F(E)Fid 考虑为输入串id+id*id建立一个最左推导 EE+TE+T+TE+T+T+T,2023/8/7,10,4.2.2 对上下文无关文法的改造,1.消除二义性改造的方法就是通过引入新的语法变量等,使文法含有更多的信息。其实,许多二义性文法是由于概念不清,即语法变量的定义不明确导致的,此时通过引入新的语法变量即可消除文法的二义性。if then|if then else|other(4.7)根据if语句中else与then配对情况将其分为配对的语句和不配对的语句两类。上述if语句的文法没有对这两个不同的概念加以区分,只是简单地将它们都定义为,从而导致该文法是二义性的。,2023/8/7,11,4.2.2 对上下文无关文法的改造,引入语法变量来表示不配对语句,表示配对语句|if then else|other if then|if then else,2023/8/7,12,4.2.2 对上下文无关文法的改造,2.消除左递归直接左递归的消除(转换为右递归)引入新的变量A,将左递归产生式AA|替换为AA A A|EE+T|T TT*F|F F(E)|id替换为:ETE E+TE|TFT T*FT|F(E)|id 一般地,假设文法G中的语法变量A的所有产生式如下:AA1|A2|An|1|2|m其中,i(i=1,2,m)不以A打头。则用如下的产生式代替A的所有产生式即可消除其直接左递归:A1A|2A|mA A1A|2A|nA|,2023/8/7,13,4.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的产生式,其中,Aj1|2|k是所有的当前Aj产生式;5 6 消除Ai产生式中的所有直接左递归7,2023/8/7,14,4.2.2 对上下文无关文法的改造,3.提取左因子对每个语法变量A,找出它的两个或更多候选式的最长公共前缀。如果,则用下面的产生式替换所有的A产生式A1|2|n|1|2|n,其中1,2,n表示所有不以开头的候选式:AA|1|2|nA1|2|n其中,A是新引入的语法变量。反复应用上述变换,直到任意语法变量都没有两个候选式具有公共前缀为止。请读者自行给出这个变换的算法。,2023/8/7,15,4.2.3 LL(1)文法,问题:什么样的文法对其句子才能进行确定的自顶向下分析?确定的自顶向下分析首先从文法的开始符号出发,每一步推导都根据当前句型的最左语法变量A和当前输入符号a,选择A的某个候选式来替换A,并使得从推导出的第一个终结符恰好是a。当A有多个候选式时,当前选中的候选式必须是惟一的。第一个终结符是指符号串的第一个符号,并且是终结符号,可以称为首终结符号。在自顶向下的分析中,它对选取候选式具有重要的作用。为此引入首符号集的概念。,2023/8/7,16,4.2.3 LL(1)文法,1.假设是文法G=(V,T,P,S)的符号串,即(VT)*,从推导出的串的首符号集记作FIRST():FIRST()=a|a,aT,(VT)*。2.如果,则FIRST()。3.如果文法G中的所有A产生式为A1|2|m,且FIRST(1)FIRST(2)FIRST(n)且对i,j,1i,jm;ij,均有FIRST(i)FIRST(j)=成立,则可以对G的句子进行确定的自顶向下分析,2023/8/7,17,4.2.3 LL(1)文法,如果存在A这样的产生式,则需定义FOLLOW(A)A定义A的后续符号集为:1.FOLLOW(A)=a|S Aa,aT,(VT)*2.如果A是某个句型的最右符号,则将结束符#添加到FOLLOW(A)中3.如果j,则如果对i(1im;ij),FIRST(i)FOLLOW(A)=均成立,则可以对G的句子进行确定的自顶向下分析,2023/8/7,18,4.2.3 LL(1)文法,如果G的任意两个具有相同左部的产生式A|满足下列条件:1.如果、均不能推导出,则FIRST()FIRST()=;2.和至多有一个能推导出;3.如果,则FIRST()FOLLOW(A)=则称G为LL(1)文法。第一个L代表从左向右扫描输入符号串,第二个L代表产生最左推导,1代表在分析过程中执行每步推导都要向前查看一个输入符号,2023/8/7,19,LL(1)文法的判定,算法4.2 计算FIRST(X)。输入:文法G=(V,T,P,S),X(VT);输出:FIRST(X);步骤:1FIRST(X)=;2if(XT)then FIRST(X):=X;3if XV then begin4if(XP)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)(FIRST(Yk)-);10if Y1.Yn then FIRST(X):=FIRST(X);,2023/8/7,20,LL(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():=FIRST();,2023/8/7,21,例 表达式文法的语法符号的FIRST 集,FIRST(F)=(,idFIRST(T)=FIRST(F)=(,id FIRST(E)=FIRST(T)=(,id FIRST(E)=+,FIRST(T)=*,FIRST(+)=+,FIRST(*)=*FIRST(()=(FIRST())=)FIRST(id)=id,ETE E+TE|TFT T*FT|F(E)|id,2023/8/7,22,LL(1)文法的判定,算法4.4 计算FOLLOW集。输入:文法G=(V,T,P,S),AV;输出: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/8/7,23,例 表达式文法的语法变量的 FOLLOW 集,FOLLOW(E)=#,)FOLLOW(E)=FOLLOW(E)=#,)FOLLOW(T)=FIRST(E)-FOLLOW(E)FOLLOW(E)=+,),#FOLLOW(T)=FOLLOW(T)=+,),#FOLLOW(F)=FIRST(T)FOLLOW(T)FOLLOW(T)=*,+,),#,ETE E+TE|TFT T*FT|F(E)|id,FIRST(F)=(,idFIRST(T)=FIRST(F)=(,id FIRST(E)=FIRST(T)=(,id FIRST(E)=+,FIRST(T)=*,2023/8/7,24,表达式文法是 LL(1)文法,E T E E+T E T F T T*F T F(E)id考察E:+不在 FOLLOW(E)=),#T:*不在 FOLLOW(T)=+,),#F:(和 id 不同,2023/8/7,25,非 LL(1)文法的不确定性,例 对文法ScAdAab|a 输入 cad 的分析,2023/8/7,26,不确定性的解决方法,1)采用回溯算法过于复杂,效率低下2)改写文法将非LL(1)文法改写为等价的LL(1)文法无法改写时:增加其它的判别因素文法过于复杂,无法用自顶向下方法处理,2023/8/7,27,4.3 预测分析法,系统维持一个分析表和一个分析栈,根据当前扫描到的符号,选择当前语法变量(处于栈顶)的候选式进行推导希望找到相应输入符号串的最左推导。一个通用的控制算法一个分析栈,#为栈底符号一个输入缓冲区,#为输入串结束符一个统一形式的分析表M不同语言使用内容不同的分析表,2023/8/7,28,4.3.1 预测分析器的构成,2023/8/7,29,系统的执行与特点,在系统启动时,输入指针指向输入串的第一个字符,分析栈中存放着栈底符号#和文法的开始符号。根据栈顶符号A和读入的符号a,查看分析表M,以决定相应的动作。优点:1)效率高2)便于维护、自动生成关键分析表M的构造,2023/8/7,30,预测分析程序的总控程序,算法4.5 预测分析程序的总控程序。输入:输入串w和文法G=(V,T,P,S)的分析表M;输出:如果w属于L(G),则输出w的最左推导,否则报告错误;步骤:1将栈底符号#和文法开始符号S压入栈中;2repeat3X:=当前栈顶符号;4a:=当前输入符号;5if XT#then6if X=a then7 if X#then begin8将X弹出栈;9前移输入指针10end,2023/8/7,31,预测分析程序的总控程序,11else error12else 13if MX,a=Y1Y2Yk then begin14 将X弹出栈;15依次将Yk,Y2,Y1压入栈;16输出产生式XY1Y2Yk17end18else error19until X=#,2023/8/7,32,FOLLOW(E)=),#FOLLOW(T)=+,),#FIRST(TE)=(,id FIRST(+TE)=+FIRST(FT)=(,id FIRST(*FT)=*FIRST(E)=(FIRST(id)=id,ETE E+TE|TFT T*FT|F(E)|id,例4.10 考虑简单算术表达式文法的实现,2023/8/7,33,简单算术表达式文法的预测分析表,2023/8/7,34,对输入串id+id*id进行分析的过程(在黑板上同时画出语法树),栈 输入缓冲区 输出#E id+id*id#ET id+id*id#ETE#ETF id+id*id#TFT#ETid id+id*id#Fid#ET+id*id#E+id*id#T#ET+id*id#E+TE#ET id*id#,2023/8/7,35,#ETF id*id#TFT#ETid id*id#Fid#ET*id#ETF*id#T*FT#ETF id#ETid id#Fid#ET#E#T#E,输出的产生式序列形成了最左推导对应的分析树,#ET id*id#,2023/8/7,36,4.3.2 预测分析表的构造算法,算法4.6 预测分析表(LL(1)分析表)的构造算法。输入:文法G;输出:分析表M;步骤:1对G中的任意一个产生式A,执行第2步和第3步;2 for aFIRST(),将A填入MA,a;3 if FIRST()then aFOLLOW(A),将A填入MA,a;if FIRST()4将所有无定义的MA,b标上出错标志。,2023/8/7,37,预测分析法的实现步骤,1.构造文法2.改造文法:消除二义性、消除左递归、提取左因子3.求每个候选式的FIRST集和变量的FOLLOW集4.检查是不是 LL(1)文法 若不是 LL(1),说明文法的复杂性超过自顶向下方法的分析能力,需要附加新的“信息”5.构造预测分析表6.实现预测分析器,2023/8/7,38,4.3.3 预测分析中错误的处理,对语法变量A,如果MA,a无定义,并且a属于FOLLOW(A),则增加MA,a为“同步点”(synch),同步记号选择方法如下:把FOLLOW(A)的所有符号放入语法变量A的同步记号集合中。把高层结构的开始符号加到低层结构的同步记号集合中。把FIRST(A)的符号加入A的同步记号集合。如果语法变量可以产生空串,若出错时栈顶是这样的语法变量,则可以使用产生空串的产生式。如果符号在栈顶而不能匹配,则弹出此符号。,2023/8/7,39,4.4 递归下降分析法一个设想,1.对应每个变量设置一个处理子程序:AX1 X2 Xk Xn 当遇到Xk是终极符号时直接进行匹配;当遇到Xk是语法变量时就调用X对应的处理子程序.2.要求处理子程序是可以递归调用的,ETE E+TE|TFT T*FT|F(E)|id,2023/8/7,40,4.4.1 递归下降分析法的基本思想,例4.14 对于产生式E+TE,与E对应的子程序可以按如下方式来编写:procedure E begin match(+);T;/*调用识别T的过程*/E/*调用识别E的过程*/end;,2023/8/7,41,4.4.1 递归下降分析法的基本思想,其中,服务子程序match用来匹配当前的输入记号,其代码为:procedure match(t:token);begin if lookhead=t then lookhead:=nexttoken;else error/*调用出错处理程序*/end;,2023/8/7,42,4.4.2 语法图和递归子程序法,状态转换图(语法图)是非常有用的设计工具语法分析器和词法分析器的状态转换图不同每个非终结符对应一个状态转换图,边上的标记是记号和非终结符记号上的转换意味着如果该记号是下一个输入符号,就应进行转换非终结符A上的转换是对与A对应的过程的调用,2023/8/7,43,4.4.2 语法图和递归子程序法,从文法构造语法图,对每个非终结符A执行如下操作创建一个开始状态和一个终止状态(返回状态)对每个产生式AX1X2 Xn,创建一条从开始状态到终止状态的路径,边上的标记分别为X1,X2,Xn,2023/8/7,44,例4.15 简单表达式文法的语法图,ETEE+TE|TFTT*FT|F(E)|id,2023/8/7,45,4.4.3基于语法图的语法分析器工作方式,初始时,分析器进入状态图的开始状态,输入指针指向输入符号串的第一个符号。如果经过一些动作后,它进入状态s,且从状态s到状态t的边上标记了终结符a,此时下一个输入符又正好是a,则分析器将输入指针向右移动一位,并进入状态t。,2023/8/7,46,4.4.3基于语法图的语法分析器工作方式,另一方面,如果边上标记的是非终结符A,则分析器进入A的初始状态,但不移动输入指针。一旦到达A的终态,则立刻进入状态t,事实上,分析器从状态s转移到状态t时,它已经从输入符号串“读”了A(调用A对应的过程)。最后,如果从s到t有一条标记为的边,那么分析器从状态s直接进入状态t而不移动输入指针。,2023/8/7,47,图4.6算术表达式的简化语法图,4.4.4 语法图的化简与实现,左因子提取将形如AYX|YZ的产生式替换为AY(X|Z);右因子提取将形如AYX|ZX的产生式替换为A(Y|Z)X;尾递归消除将形如XYX|Z的产生式替换为XY*Z。,2023/8/7,48,的子程序(ET(+T)*)procedure E;begin T;T的过程调用 while lookhead=+do begin 当前符号等于+时 match(+);处理终结符+T T的过程调用 end end;lookhead:当前符号,例4.16 简单算术表达式的语法分析器,2023/8/7,49,的子程序(TF(*F)*),procedure T;begin F;F的过程调用 while lookhead=*then begin 当前符号等于*时 match(*);处理终结符*F F的递归调用 end end;,2023/8/7,50,的子程序(F(E)|id),procedure F;begin if lookhead=(then begin 当前符号等于(match();处理终结符(E;的递归调用 match();处理终结符)end else if lookhead=id then match(id)处理终结符id else error 出错处理 end,2023/8/7,51,主程序,begin lookhead:=nexttoken;调词法分析程序 E 的过程调用end,procedure match(t:token);begin if lookhead=t then lookhead:=nexttoken else error 出错处理程序 end;,服务子程序,2023/8/7,52,4.4.5 递归子程序法的实现步骤,1)构造文法;2)改造文法:消除二义性、消除左递归、提取左因子;3)求每个候选式的FIRST集和语法变量的FOLLOW集;4)检查G是不是 LL(1)文法,若G不是 LL(1)文法,说明文法G的复杂性超过了自顶向下方法的分析能力,需要附加新的“信息”;5)按照LL(1)文法画语法图;6)化简语法图;7)按照语法图为每个语法变量设置一个子程序。,2023/8/7,53,递归子程序法的优缺点分析,优点:1)直观、简单、可读性好2)便于扩充缺点:1)递归算法的实现效率低2)处理能力相对有限3)通用性差,难以自动生成从递归子程序法及FIRST与FOLLOW集看如何进一步用好当前的输入符号?,2023/8/7,54,本章小结,1.自顶向下分析法和自底向上分析法分别寻找输入串的最左推导和最左归约2.自顶向下分析会遇到二义性问题、回溯问题、左递归引起的无穷推导问题,需对文法进行改造:消除二义性、消除左递归、提取公共左因子3.LL(1)文法是一类可以进行确定分析的文法,利用FIRST集和FOLLOW集可以判定某个上下文无关文法是否为LL(1)文法,2023/8/7,55,本章小结,4.LL(1)文法可以用LL(1)分析法进行分析。5.递归下降分析法根据各个候选式的结构为每个非终结符编写一个子程序。6.使用语法图可以方便地进行递归子程序的设计。,

    注意事项

    本文(【教学课件】第四章自顶向下的语法分析.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开