程序设计语言与编译原理-自上而下的语法分析课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《程序设计语言与编译原理-自上而下的语法分析课件.ppt》由用户(ziliao2023)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计语言 编译 原理 自上而下 语法分析 课件
- 资源描述:
-
1、程序设计语言与编译语法分析u对无关文法对无关文法G=(VT,VN,S,P)及符号串及符号串,判断,判断是否是文法是否是文法G的一个合法的一个合法句子句子。即即 S S*=w=w?程序设计语言与编译符号串符号串(二元式流)(二元式流)正确句子的语法树正确句子的语法树报告语法错误报告语法错误语法分析程序语法分析程序第一节第一节 引言引言一一.语法分析的功能语法分析的功能程序设计语言与编译语法分析:自上而下(自顶而下)自下而上(自底而上)二二.语法分析方法的分类语法分析方法的分类自上而下语法分析法自上而下语法分析法:或从开始符号出发或从开始符号出发,找最左推导找最左推导;或从根开始或从根开始,构造推
2、导树。构造推导树。自下而上语法分析法自下而上语法分析法:从输入串开始从输入串开始,归约归约,直至文法开始符。直至文法开始符。程序设计语言与编译自上而下的语法分析的语法分析u分析过程分析过程 从文法开始符出发,能否找到一个从文法开始符出发,能否找到一个最左最左推导推导序列,使得序列,使得S=*w;或者从根结点或者从根结点S开始,根据最左推导,能开始,根据最左推导,能否构造一棵否构造一棵语法树语法树,使得该语法树的叶结,使得该语法树的叶结点自左至右的连接正好是点自左至右的连接正好是。给定文法给定文法G=(VG=(VT T,V VN N,S,S,P)P)以及输入串以及输入串w w V VT T*,程
3、序设计语言与编译自下而上的语法分析的语法分析u分析过程分析过程 从从出发,能否找到一个出发,能否找到一个最左规约最左规约(最右推(最右推导的逆过程)序列,逐步向上规约,直至文导的逆过程)序列,逐步向上规约,直至文法的开始符法的开始符S;或者对生成或者对生成的语法树,按最左规约对语法的语法树,按最左规约对语法树进行树进行剪枝剪枝,能否最后只剩下根结点,能否最后只剩下根结点S。给定文法给定文法G=(VG=(VT T,V VN N,S,S,P)P)以及输入串以及输入串w w V VT T*,程序设计语言与编译u自上而下的语法分析可分为自上而下的语法分析可分为不确定不确定和和确定确定的两类的两类。u回
4、溯分析法回溯分析法是不确定的分析方法。是不确定的分析方法。u递归下降分析法递归下降分析法和和预测分析法预测分析法属于属于确定的分析方法。确定的分析方法。程序设计语言与编译第二节第二节 回溯分析法回溯分析法一一.一个实例一个实例SxAyAaba输入串为xay,说明分析过程。x xA Ay ya a b b S Sx xA Ay ya a S S从文法的开始符号S出发,选取S的候选式进行推导,接着按最左推导进行下去;如果推导失败,再换用其他的候选式;若穷尽所有的候选式都失败,则表明w不是G的句子,w存在语法错语。程序设计语言与编译 (1)公共左因子的存在 A1|2(2)左递归 AA 或 AA+二二
5、.存在的问题存在的问题回溯回溯直接左递归直接左递归间接左递归间接左递归(3)产生式可能产生回溯的原因有可能产生回溯的原因有程序设计语言与编译(1)公共左因子u公共左因子公共左因子,是指在文法的产生式集合,是指在文法的产生式集合中,某个非终结符的多个候选式具有相中,某个非终结符的多个候选式具有相同的前缀。同的前缀。一般,一般,公共左因子的产生式为公共左因子的产生式为 A12程序设计语言与编译存在公共左因子u采取采取试探试探的方法来分析每一个候选的方法来分析每一个候选式,分析的过程式,分析的过程很可能很可能产生回溯。产生回溯。u若所有的候选式都没有公共左因子若所有的候选式都没有公共左因子 就可以选
6、择惟一匹配的候选式,不就可以选择惟一匹配的候选式,不会产生回溯。会产生回溯。程序设计语言与编译(2)左递归左递归u左递归的形式为左递归的形式为 A=+A 特别地特别地 A=A 就是直接左递归就是直接左递归程序设计语言与编译例子例子:S SaS SaS bS b文法文法G(s)G(s):符合串符合串baabaa的推导过程。的推导过程。S Sb bS Sa aS Sb b a aS Sa aS SS Sb b程序设计语言与编译产生式产生式S aASS aASS bS bA bASA bASA A 文法文法G(S)G(S):输入串输入串abab的推导过程。的推导过程。S SA Aa aS SA Ab
7、 bS S S SA Aa aS Sb b程序设计语言与编译 例:将文法SxAyAaba改造成:SxAyAaBBbxay的推导过程如右图S Sx xA Ay ya a B B 三三.解决回溯:提取公共左因子解决回溯:提取公共左因子程序设计语言与编译 一般方法一般方法提取公共左因子提取公共左因子 产生式:产生式:程序设计语言与编译 四四.消除左递归消除左递归改写为改写为PP|P|P PPP|P|PP PPPP改写为改写为PP|改写为改写为P P|PPP|程序设计语言与编译一般地一般地:AAAA 1 1|A A 2 2|A|A m m|1 1|2 2|n n (i i,j j不以不以A A开头)开
8、头)改写为改写为:AA 1 1P P 2 2P.P.n nPP PP 1 1PP 2 2P.P.m mPP 程序设计语言与编译u一般而言,假定一般而言,假定P相关的全部产生式是相关的全部产生式是PP 1|P 2|P m|1|2|n其中,每个其中,每个 都不等于都不等于,每个,每个 都不以都不以P开头开头 那么,消除那么,消除P的直接左递归性就是把这些规的直接左递归性就是把这些规则改写成:则改写成:P 1P|2P|nP P 1P|2P|mP|左递归变右递归程序设计语言与编译u例例 文法文法G(E):EET|TTT*F|FF(E)|i经消去直接左递归后变成:经消去直接左递归后变成:ETE E+TE
9、|TFT T*FT|F(E)|i(4.2)PP 1|P 2|P m|1|2|nP 1P|2P|nP P 1P|2P|mP|程序设计语言与编译u例如文法例如文法G(S):SQc|cQRb|bRSa|a (4.3)虽没有直接左递归,但虽没有直接左递归,但S、Q、R都是左递归的都是左递归的SQcRbcSabcu例:设文法例:设文法G(A):A Ac|Aad|bd|e消去直接左递归:消去直接左递归:A bdA|eAA cA|adA|程序设计语言与编译 P P PP+例子:例子:A A Bc BcaaB B Ab AbA A Abc Abc aaA A aP aPP P bcP bcP 改为:改为:程序
10、设计语言与编译 算法算法1.1.将文法将文法G G的所有非终结符按任一顺序排列,设为的所有非终结符按任一顺序排列,设为A A1 1,A,An n2.2.执行下面算法,消除可能的左递归:执行下面算法,消除可能的左递归:for i:=1 to n dofor i:=1 to n do for j:=1 to i-1 do for j:=1 to i-1 do begin begin 把一个形如把一个形如A Ai iA Aj j 的产生式改写为的产生式改写为 A Ai i1 1|2 2|k k 其中其中A Aj j1 1|2 2|k k是是A Aj j的所有产生式的所有产生式;消除消除A Ai i产
11、生式的直接左递归产生式的直接左递归;end end3.3.化简:删除多余产生式,即在从文法开始符号的化简:删除多余产生式,即在从文法开始符号的 任何推导中都不会出现的非终结符的产生式;任何推导中都不会出现的非终结符的产生式;程序设计语言与编译以 SQcc QRbb RSaa为例,按S,Q,R排列,或R,Q,S排列程序设计语言与编译 SQc|cQRb|bRSa|a步骤:步骤:1.1.i=1i=1没有操作没有操作 i=2,j=1 i=2,j=1,A Ai i=Q,A=Q,Aj j=R,=R,有有QRbQRb|b b 把把RSaRSa|a a代入上式得代入上式得:Q QSab|ab|Sab|ab|b
12、 b 该式无直接左递归该式无直接左递归i=3,j=2i=3,j=2,A Ai i=S,A=S,Aj j=Q=Q,SQcSQc|c c将上面得到的将上面得到的Q Q的产生式代入的产生式代入得:得:SSSabSabc c|abc|bc|c|abc|bc|c消除上式的直接左递归得:消除上式的直接左递归得:SSabcS|bcS|cSabcS|bcS|cS S SabcS|abcS|i=3,j=1i=3,j=1,A Ai i=S,A=S,Aj j=R=R,无相应产,无相应产生式,没有操作生式,没有操作3.3.:经过上述算法,:经过上述算法,Q Q和和R R的产生式为多余的产生式,可的产生式为多余的产生式
13、,可删除。最后得:删除。最后得:SSabcS|bcS|cSabcS|bcS|cSSSabcS|abcS|程序设计语言与编译1.按R、Q、S排列,代入后 RSaa QSababb SSabcabc bcc SQccSQccQRbbQRbbRSaaRSaa2.2.消除消除S S中的直接左递归中的直接左递归 文法产生的语言文法产生的语言:(abc|bc|c)(abc):(abc|bc|c)(abc)*SabcSbcScSSabcS 程序设计语言与编译1.按S、Q、R排列,代入后 SQcc QRbb R Qcacaa R RbcabcacaaSQccSQccQRbbQRbbRSaaRSaa2.2.消除
14、消除R R中的直接左递归中的直接左递归 R bcaRcaRaRR bcaRcaRaR R bcaR R bcaR 文法产生的语言文法产生的语言:(bca|ca|a)(bca):(bca|ca|a)(bca)*bc|bc|cbc|bc|c 程序设计语言与编译文法产生的语言文法产生的语言:(bca|ca|a)(bca):(bca|ca|a)(bca)*bc|bc|cbc|bc|c文法产生的语言文法产生的语言:(abc|bc|c)(abc):(abc|bc|c)(abc)*程序设计语言与编译对于文法G=(a,b,c,d,S,A,S,P);其中P为:S Aa|Ac|bc A Ad|Sbc|d请先提取文
15、法G的公共左因子,再消除左递归。练习练习程序设计语言与编译提取公共左因子 S AB|bc B a|c A Ad|Sbc|d S Aa|Ac|bcS Aa|Ac|bcA Ad|Sbc|dA Ad|Sbc|d直接左递归直接左递归 S AB|bc S AB|bc B a|c B a|c A SbcP|dP A SbcP|dP PdP|PdP|间接左递归间接左递归 S AB|bc S AB|bc B a|c B a|c A ABbcP|bcbcP A ABbcP|bcbcP|dP P dP|P dP|间接左递归间接左递归 S AB|bc S AB|bc B a|c B a|c A bcbcPQ A b
16、cbcPQ|dPQ Q BbcPQ|Q BbcPQ|P dP|P dP|程序设计语言与编译回顾回顾 1.1.语法分析功能语法分析功能2.2.两大类两大类3.3.回溯分析回溯分析1.1.自上而下自上而下(自顶而下自顶而下)2.2.自下而上自下而上(自底而上自底而上)a.a.公共左因子公共左因子b.b.左递归左递归c.c.空产生式空产生式程序设计语言与编译 当文法改造为无公共左因子当文法改造为无公共左因子,无左递归时无左递归时,让让每个非终结符对应一个过程,该过程对相应每个非终结符对应一个过程,该过程对相应的非终结符产生式的右部短语进行语法分析,的非终结符产生式的右部短语进行语法分析,这种分析方法
17、称为这种分析方法称为。这样的。这样的分析程序称为分析程序称为。第三节第三节 递归下降分析法递归下降分析法程序设计语言与编译例:G(E)EE+TT TT*FF F(E)i消除左递归消除左递归:ETE :ETE E+TE E+TE TFT TFT T T*FTFT F(E)i F(E)i 一一.分析方法分析方法程序设计语言与编译过程过程advanceadvance:匹配并把输入串指针后移一位变量变量symsym:输入指针指向的符号Error()Error():出错处理函数 procedure advance(t:token);begin if sym=t then sym=nexttoken el
18、se error()end;程序设计语言与编译procedure E;begin T;Eend;procedure T;begin F;Tend;ETE ETE E+TEE+TETFT TFT TT*FTFTF(E)iF(E)iprocedure E;if sym=+then begin advance(+);T;E end;procedure T;if sym=*then begin advance(*);F;T end;程序设计语言与编译ETE ETE E+TEE+TETFT TFT TT*FTFTF(E)iF(E)iprocedure F;if sym=i then advance(i)
19、else if sym=(then begin advance();E;if sym=)then advance()else error()end else error();程序设计语言与编译i+ii+i*i#i#的递归下降分析过程的递归下降分析过程ETEETEE+TEE+TETFTTFTTT*FTFTF(E)iF(E)iE ET TT Ti ii ii ii ii i+*#F FM(i)M(i)F FM(i)M(i)F FM(i)M(i)E EM(+)M(+)T TM(M()E EM(M()#T TM(M()#T TM(M(*)M(M()程序设计语言与编译 二二.扩充的扩充的BNFBNF用花
20、括号表示闭包运算*;可以重复任意多次用 表示可任意重复0次至n次 =0=;用表示 ,即表示的出现可有可无(等价于);n n0 00 00 01 10 0程序设计语言与编译例一:标识符的定义利用扩充例一:标识符的定义利用扩充BNFBNF表示为表示为ET+TTF*FFi|(E)EE+TTTT*FFF(E)i例二:文法例二:文法ILLSILLSSTSTSTSTTLDTLDLab.zLab.zD012.9D012.9 I ILL|DLL|D L La|b|za|b|z D D0|1|90|1|9 程序设计语言与编译 decimal signinteger.digitexponent exponentE
21、signinteger integerdigitdigit sign+-digit 0 1 9例三:实数可定义为例三:实数可定义为 程序设计语言与编译 pxyzpv改写成:p(xyz)v 程序设计语言与编译ET+TTF*FFi|(E)EE+TTTT*FFF(E)i+0 01 12 2T T 0 01 12 2F F*0 01 13 3()i i2 2E E 程序设计语言与编译procedure E;Begin T;while sym=+do begin advance(+);T end endET+T+0 01 12 2T T ET+TTF*FFi|(E)三三.改进的递归下降分析法改进的递归下
22、降分析法F F 程序设计语言与编译procedure T;begin F;while sym=*do begin advance(*);F end end;TF*F0 01 12 2F F*程序设计语言与编译procedure F;if sym=i then advance(i)else if sym=(then begin advance();E;if sym=)then advance()else error end else error;0 01 13 3()i i2 2E EFi|(E)程序设计语言与编译i+ii+i*i#i#的递归下降分析过程的递归下降分析过程ET+TET+TTFTF
展开阅读全文