语法分析哈工大王宏志.ppt
《语法分析哈工大王宏志.ppt》由会员分享,可在线阅读,更多相关《语法分析哈工大王宏志.ppt(179页珍藏版)》请在三一办公上搜索。
1、语法分析,回顾 一个语句的翻译,P483附录:Pascal子集的词法和语法,第四章 语法分析1,语法分析方法 递归子程序法自顶向下 预测分析法(LL(1))算符优先分析法自底向上 LR(0)、SLR(1)LR(1)、LALR,Top Down,Bottom Up,文法产生语言,自动机识别语言,从根开始,逐步为某语句构造一棵语法树,相反,将一句子归约为开始符号,问题:解决确定性问题!假定文法是压缩的:即删除了单位产生式和无用产生式。,4.1 语法分析的功能,检查由扫描器输出的单词符号序列是否符合该语言的文法句子,分析器的输入:Token序列分析器的输出分析树出错处理:定位、续编译,分析方法自顶向
2、下(递归下降、预测分析)自底向上(算符优先、LR分析器),4.2 自上而下分析面临的问题与CFG的改造,一、自上而下的分析从文法的开始符号出发,寻求所给的输入符号串的一个最左推导。从树根S开始,构造所给输入符号串的语法树例:G为:SxAy A*|*,输入串:x*y,SxAy,x*y,S,二、存在问题回溯,S xAy x*y,x*y,S xAy x*y匹配成功,x*y,发现不匹配,需要回退,输入串x*ySxAy A*|*,存在回溯的原因,文法中每个非终结符A的产生式右部称为A的候选式,如果有多个候选式左端第一个符号相同,则语法分析程序无法根据当前输入符号选择产生式,只能试探。,二、存在问题左递归
3、问题,文法SSay|*与它的句子*ayay,*ayay,S*不对!,SSaySayaySayayaySayayayay,一个无限循环!,二、重要问题左递归问题,例 CFG:简单算术表达式的文法(语法)EE+T|E-T|TTT*F|T/F|FF(E)|idNE,T,F,P,FUN,LTid,+,-,*,/,(,)E,三、重要概念回顾,推导:(依据:)最左(Left-most)推导最左分析左句型最左推导对应最右归约最右(Right-most)推导最右分析规范推导、规范句型(右句型)最右推导对应最左归约(规范归约)二义性(先天二义性语言、二义性文法),四、消除二义性,例:简单算术表达式的文法二义性文
4、法EE+E|E-E|E*E|E/E|(E)|id非二义性文法EE+T|E-T|TTT*F|T/F|FF(E)|id改造方法:使文法含有更多的信息,引入语法变量,四、消除二义性,再例:If语句Sif E then SSif E then S else SSother设执行下列语句前b=0,If a0 then if a0 then b=1 else b=-1当a=1时,b=1;当a=-1时,b=-1If a0 then if a0 then b=1 else b=-1当a=1时,b=1;当a=-1时,b=0,一个句子有两棵不同的语法树,SSE ES SIf a0 then if a0 then
5、b=1 else b=-1SSE ES SIf a0 then if a0 then b=1 else b=-1,四、消除二义性 P174,重写文法:引入新的语法变量SU|MUif E then SUif E then M else UMif E then M else M|other,每个else与前面最近的没有配对的then配对,即:出现在then和else之间的语句必须是配对的,按照改造后的文法构造的语法树,SUSMEEMMIf a0 then if a0 then b=1 else b=-1,Mif E then M else M|other,五、消除左递归,无法根据左递归文法进行自顶
6、向下的分析A a1a2aian直接左递归A A 当前变量 输入指针(栈顶、最左变量),间接左递归A+A左递归的消除方法将AA|替换为AA 和 AA,例:表达式文法直接左递归的消除,E E+TTT T*FFF(E)id,E T EE+T E|T F TT*F TF(E)id,例:间接左递归的消除,SAc|c ABb|b BSa|a将B的定义代入A产生式得:ASab|ab|b将A的定义代入S产生式得:SSabc|abc|bc|c消除直接左递归:SabcS|bcS|cSSabcS|删除“多余的”产生式:ASab|ab|b和BSa|a 结果:SabcS|bcS|cSSabcS|,消除左递归的一般方法,
7、用产生式组A1 B|2 B|n BB1 B|2 B|n B|替换产生式组AA1|A2|An|1|2|m 其中:B为新变量,相当于A消除左递归的算法见P117的算法4.1为非终结符编号,再采用代入法将间接左递归变为直接左递归,消除直接左递归,六、解决回溯问题提取左因子,例:if语句的原始文法S if E then S|if E then S else S|other影响分析:遇到 if 时难以判断用哪一个产生式进行匹配(推导)存在左因子 if E then S,左因子提取方法,将形如 A1|2|n|1|2|m的规则改写为AA|1|2|m和 A1|2|n结果:S if E then SS|othe
8、rS|else S,七、CFG的使用限制,没有一种方法能够有效地分析所有上下文无关文法存在无法处理的型文法(CFG)每种方法能够处理一部分上下文无关文法每种方法都有适用范围,八、常用文法与分析方法,LL文法和 LR 文法都是CFG的子集(无二义性)可用不同的文法来描述同一语言对于不同的文法,可用不同的分析方法LL文法 递归下降分析法、预测分析法LR文法 LR分析法LL 文法多用于编译的手工实现LR 文法多用于编译的自动生成,4.3 自顶向下的分析方法,基本思想寻找输入符号串的最左推导试图根据当前输入单词判断使用哪个产生式基本过程从根开始,按与最左推导相对应的顺序,构造输入符号串(Token)的
9、分析树,例 符号串 id+id*id的分析,E T E E+T E T F T T*F T F(E)id 按照最左推导过程,构造分析树,id+id*id最左推导与语法树的生成对应,i d,i d,i d,1、ETE,2、TFT,3、Fid,4、T,5、E+TE,6、TFT,7、Fid,8、T*FT,9、Fid,10、T,11、E,id+id*id的最左推导再现,E TEE TE FTET FTidTEF id idET id+TEE+TE id+FTET FT id+idTEF id id+id*FTET*FT id+id*idTE F id id+id*idE T id+id*id E,候选
10、式的确定与回溯,给定文法ScAdAab|a?句子cad是该文法定义语言的句子SScAdcAd a ba产生式(候选式)的选择与回溯(Backtracking):当要进行关于某个语法变量的推导时,希望能够根据当前符号确定候选式。如果有几个候选式(右部)左端第一个符号相同,则分析程序无法根据当前输入符号选择产生式,只能试探。,无回溯的条件,设A1|2|n是所有的A产生式如果各个i能推导出的首终结符各不相同,则可以构造无回溯的分析。,4.3.1 FIRST 和 FOLLOW 集,对于(TN)*定义:的首符号集FIRST()=a|*a,aT*如果存在A这样的产生式,则需定义FOLLOW(A)对于AN定
11、义A的后续符号集:FOLLOW(A)=a|S*Aa,aT,求FIRST(X)的算法,1)对xT,FIRST(x)=x;2)对XN,取FIRST(X)的初值:a|XaP;XPFIRST(X)=a|XaP;XP,3)对XN,重复如下过程,直到所有FIRST集不变若 XYP,且 YN,则 FIRST(X)=FIRST(X)(FIRST(Y)-);若 XY1YnP,且Y1.Yi-1*,则 对k=1到i-1:FIRST(X)=FIRST(X)(FIRST(Yk)-);若 Y1.Yn*,则 FIRST(X)=FIRST(X)。,例 表达式文法的语法符号的 FIRST 集,FIRST(F)=(,idFIRS
12、T(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,求FIRST()的算法,令=X1Xn初值FIRST()=FIRST(X1)-;k=1;循环while FIRST(Xk)结束处理if k=n&FIRST(Xk)then FIRST()=FIRST(),求FOLLOW(A)的算法,对于所有非终结符,重复进行以下计算1)将#加入到 FOLLOW(S)#为句子的结束
13、符2)若 AB,则 FOLLOW(B)=FOLLOW(B)FIRST()3)如果AB或AB,且*,AB,则 FOLLOW(B)=FOLLOW(B)FOLLOW(A),例 表达式文法的语法变量的 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
14、)=FIRST(F)=(,id FIRST(E)=FIRST(T)=(,id FIRST(E)=+,FIRST(T)=*,自顶向下分析希望文法满足的条件,我们希望:从左到右扫描输入串寻找它的一个最左推导对于 G 的每个非终结符 A 的任何两个不同的候选式 A|1)FIRST()FIRST()=2)如果*,则 FIRST()FOLLOW(A)=文法是 LL(1)的充要条件,4.3.2 LL(1)文法,对G中的任意变量A,A1|2|n是G的所有A产生式,它们满足下列条件,则称G是LL(1)文法,FIRST(i)FIRST(j)=ij当FIRST(j)时,FOLLOW(A)FIRST(i)=LL(1
15、)文法表示了自顶向下方法能够处理的一类文法第一个 L 表示从左向右扫描输入符号串第二个 L 表示生成最左推导1 表示读入一个符号可确定下一步推导,表达式文法是 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 不同,非 LL(1)文法的不确定性,例 对文法ScAdAab|a 输入 cad 的分析,不确定性的解决方法,1)采用回溯算法过于复杂2)改写文法将非 LL(1)文法改写为等价的 LL(1)文法无法改写时:增加其它的判别因素文法过于复杂,无法用自顶向下方法处理,4.
16、4 预测分析器(LL(1)分析器),系统维持一个分析表和一个分析栈,根据当前扫描到的符号,选择当前语法变量(处于栈顶)的候选式进行推导希望找到相应的输入符号串的最左推导。一个通用的控制算法一个分析栈,#为栈底符号一个输入缓冲区,#为输入串结束符一个统一形式的分析表M不同语言使用内容不同的分析表,系统结构,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,考虑简单算术表达式文法的实现,表
17、达式文法的预测分析表,执行过程举例:分析 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#,#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#,系统的执行与特点,在系统启动时,输入指针指向输入串的第一个字符,
18、分析栈中存放着栈底符号#和文法的开始符号。根据栈顶符号A和读入的符号a,查看分析表M,以决定相应的动作。优点:1)效率高2)便于维护、自动生成关键分析表M的构造,预测分析表(LL(1)分析表)的构造算法,1)对于每一产生式 A,执行2)和3);2)对于 FIRST()中的每一终结符a,将 A 填入 MA,a;3)如果属于 FIRST(),则对FOLLOW(A)中的每个非终结符b,将A填入MA,b;若属于 FIRST(),且#在FOLLOW(A)中,则将将A填入MA,#;4)将所有无定义的 MA,b 标上错误标志。,LL(1)通用控制算法,repeatX=当前栈顶符号;a=当前输入符号;if X
19、T#thenif X=a then if X#then 将X弹出,且前移输入指针else errorelse if MX,a=Y1Y2Yk then将X弹出;依次将YkY2Y1压入栈;输出产生式XY1Y2Yk else erroruntil X=#,预测分析法,1)构造文法2)改造文法:消除二义性、消除左递归、提取左因子3)求每个候选式的FIRST集和变量的FOLLOW集4)检查是不是 LL(1)文法若不是 LL(1),说明文法的复杂性超过自顶向下方法的分析能力,需要附加新的“信息”5)构造预测分析表6)实现预测分析器,出错处理问题,对语法变量A,如果MA,a无定义,并且a属于FOLLOW(A
20、),则增加MA,a为“同步点”(synch)详见教材P127,关键是同步记号的选择,把FOLLOW(A)的所有终结符放入非终结符A的同步记号集合。把高层结构的开始符号加到低层结构的同步记号集合中。把FIRST(A)的终结符加入A的同步记号集合。如果非终结符可以产生空串,若出错时栈顶是这样的非终结符,则可以使用产生空串的产生式。如果终结符在栈顶而不能匹配,弹出此终结符。,一个设想,对应每个变量设置一个处理子程序:AX1 X2 Xk Xn当遇到Xk是终极符号时直接进行匹配当遇到Xk是语法变量时就调用X对应的处理子程序要求处理子程序是可以递归调用的,ETE E+TE|TFT T*FT|F(E)|id
21、,4.5 语法图和递归子程序法,状态转换图(语法图)是非常有用的设计工具语法分析器和词法分析器的状态转换图不同每个非终结符对应一个状态转换图,边上的标记是记号和非终结符记号上的转换意味着如果该记号是下一个输入符号,就应进行转换非终结符A上的转换是对与A对应的过程的调用从文法构造语法图,对每个非终结符A执行如下操作:创建一个开始状态和一个终止状态(返回状态)。对每个产生式AX1X2 Xn,创建一条从开始状态到终止状态的路径,边上的标记分别为X1,X2,。,Xn。,基于语法图的分析器工作方式,开始,分析器进入状态图的开始状态,输入指针指向输入符号串的第一个符号。如果经过一些动作后,它进入状态s,且
22、从状态s到状态t的边上标记了终结符a,此时下一个输入符又正好是a,则分析器将输入指针向右移动一位,并进入状态t。另一方面,如果边上标记的是非终结符A,则分析器进入A的初始状态,但不移动输入指针。一旦到达A的终态,则立刻进入状态t,事实上,分析器从状态s转移到状态t时,它已经从输入符号串“读”了A(调用A对应的过程)。最后,如果从s到t有一条标记为的边,那么分析器从状态s直接进入状态t而不移动输入指针。,4.5 语法图,例 4-9:表达式文法的描述,+,T,E,E,T,E,E,ETE E+TE|TFTT*FT|F(E)|id,语法图化简规则(1/2),Y,X,Y,Z,Y,X,Z,X,左因子提取,
23、右因子提取,AYX|YZAY(X|Z),AYX|ZXA(Y|Z)X,语法图化简规则(2/2),Y,X,Z,X,XYX|ZAY*Z,语法图的化简,+,T,E,+,T,T,E,E+TE|,ETEET(+T)*,简化的语法图,+,T,E,i d,(,),ET(+T)*,TF(*F)*,F(E)|id,例 简单算术表达式的分析器,的子程序(ET(+T)*)procedure E;begin T;的过程调用 while lookhead=+do begin 当前符号等于时 match(+);处理终结符 T 的过程调用 end end;lookhead:当前符号,的子程序(TF(*F)*),procedu
24、re T;begin F;的过程调用 while lookhead=*then begin 当前符号等于时 match(*);处理终结符 F 的递归调用 end end;,的子程序(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,主程序,begin lookhead:=nexttoken;调词法分析程序 E 的过程调用end,
25、procedure match(t:token);begin if lookhead=t then lookhead:=nexttoken else error 出错处理程序 end;,服务子程序,递归子程序法,1)构造文法2)改造文法:消除二义性、消除左递归、提取左因子3)求每个候选式的FIRST集和变量的FOLLOW集4)检查是不是 LL(1)文法若不是 LL(1),说明文法的复杂性超过自顶向下方法的分析能力,需要附加新的“信息”,递归子程序法,5)按照 LL(1)文法画语法图6)化简语法图7)按照语法图,编写程序按照语法图,为每个非终结符设置一个子程序。事实上,如果有一个恰当的文法,可以
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语法分析 哈工大 王宏志
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-6609166.html