编译原理语义2(表达式及赋值语句的翻译).ppt

上传人:zhu****ei 文档编号:3529937 上传时间:2019-12-17 格式:PPT 页数:35 大小:795.50KB
返回 下载 相关 举报
编译原理语义2(表达式及赋值语句的翻译).ppt_第1页
第1页 / 共35页
编译原理语义2(表达式及赋值语句的翻译).ppt_第2页
第2页 / 共35页
编译原理语义2(表达式及赋值语句的翻译).ppt_第3页
第3页 / 共35页
点击查看更多>>
资源描述
第10讲,编译原理,西北农林科技大学本科教程,主讲教师:赵建邦,第四章语义分析和中间代码生成,4.1语义分析概述4.2属性文法4.3几种常见的中间语言4.4表达式及赋值语句的翻译4.5控制语句的翻译4.6数组元素的翻译4.7过程或函数调用语句的翻译4.8说明语句的翻译4.9递归下降语法制导翻译方法简介,第四章语义分析和中间代码生成4.4表达式及赋值语句的翻译简单算术表达式和赋值语句的翻译布尔表达式的翻译(难点)重点掌握算术表达式语义子程序布尔表达式的真假出口布尔表达式的语义子程序根据翻译图得到布尔表达式的四元式,本讲目标,4.4表达式及赋值语句的翻译,4.4.1简单算术表达式和赋值语句的翻译简单变量:普通变量和常数,不包括数组、结构体成员等复合型数据结构。简单算术表达式:仅含简单变量的算术表达式简单算术表达式与四元式,简单算术表达式的计值顺序与四元式出现的顺序相同,因此很容易将其翻译成四元式形式。,当然,这些翻译方法稍加修改也可用于产生三元式或间接三元式。,1.3.3语义分析和中间代码生成(续)简单算术表达式的计值顺序与四元式出现的顺序相同:例如,计算圆柱体表面积的C语言程序:s=2*3.1416*r*(h+r);赋值语句的四元式中间代码:(1)(*,2,3.1416,T1)(2)(*,T1,r,T2)(3)(+,h,r,T3)(4)(*,T2,T3,T4)(5)(=,T4,_,s),回顾:表达式及赋值语句的翻译,考虑以下文法GA:Ai=EEE+E|E*E|E|(E)|i,4.4表达式及赋值语句的翻译,显然,文法GA是一个二义文法,但通过确定运算符的结合性及规定运算符的优先级就可避免二义性的发生。,用该文法作为示例的目的:为了更简要地说明语义子程序的设计过程以及赋值语句的语法制导翻译过程。如,对于赋值语句x=-b*(c+d),已经预先规定运算顺序,非终结符A代表“赋值句”,非终结符E代表“表达式”,4.4表达式及赋值语句的翻译,1.设计6个产生式的语义子程序,(1)Ai=Ep=lookup(i.name);if(p=NULL)error();elseemit(=,E.place,_,p);,例如,赋值语句x=b刚开始读入到符号栈中,显示为i=i,使用Ei规约,得到:i=E(符号栈)_b(语义栈),(a)对非终结符E定义语义变量E.place,即用E.place表示存放E值的变量名在符号表中的入口地址或临时变量名的整数码,所以,E.Place中必须保存b在符号表中的入口地址;,x=b翻译为(=,b,_,x),4.4表达式及赋值语句的翻译,1.设计6个产生式的语义子程序,(1)Ai=Ep=lookup(i.name);if(p=NULL)error();elseemit(=,E.place,_,p);,(b)定义语义函数lookup(i.name),其功能是审查终结符i.name是否出现在符号表中,是则返回i.name在符号表的入口指针,否则返回NULL。,(c)定义语义函数emit(op,arg1,arg2,result),emit的功能是产生一个四元式并填入四元式表中。,4.4表达式及赋值语句的翻译,(2)EE(1)+E(2)E.place=newtemp();emit(+,E(1).place,E(2).place,E.place);,(d)定义语义函数newtemp(),即每次调用newtemp()时都将回送一个代表新临时变量的整数码;临时变量名按产生的顺序可设为T1、T2,(3)EE(1)*E(2)E.place=newtemp();emit(*,E(1).place,E(2).place,E.place);,(4)EE(1)E.place=newtemp();emit(uminus,E(1).place,_,E.place);,4.4表达式及赋值语句的翻译,(5)E(E(1)E.place=E(1).place;,(6)Eip=lookup(i.name);if(p!=NULL)E.place=p;elseerror();,例4.2试分析赋值语句X=-B*(C+D)的语法制导翻译过程。解答赋值语句X=-B*(C+D)的语法制导翻译过程如表4.2所示(加工分析过程参考表4.1)。,其实,利用带注释的语法树进行规约的同时,就可以完成相应的语义分析(一起看黑板)。,表4.2(1)赋值语句X=B*(C+D)的翻译过程,表4.2(2)赋值语句X=B*(C+D)的翻译过程,4.4表达式及赋值语句的翻译,4.4.2布尔表达式的翻译1、布尔表达式的组成布尔表达式:由运算符与运算对象组成。定义布尔变量A、B、C、DA=bop1Bbop2Cbop3D(1)运算符:非(单目)、与(双目)、或(双目)注意:1、优先级:2、和服从左结合3、运算符的优先级:算术关系布尔“=”,4.4表达式及赋值语句的翻译,(2)运算对象(三种):布尔变量布尔常量(false、true)关系表达式1、运算符rop:=、2、运算对象:算术表达式3、返回值类型:bool类型例:boola,b,c;intx,y,za=bctrue(x+y=z)a=bctruex+y=z,思考:运算顺序?,4.4表达式及赋值语句的翻译,2、布尔表达式的计算了解1:对布尔运算、关系运算、算术运算的运算对象的类型可不区分布尔型或算术型,假定不同类型的变换工作将在需要时强制执行。了解2:布尔表达式在程序语言中不仅用作计算布尔值,还作为控制语句(如if-else、while等)的条件表达式,用以确定程序的控制流向。无论布尔表达式的作用如何,按照程序执行的顺序,都必须先计算出布尔表达式的值。计算布尔表达式的值有两种方法:1、按照优先级和各变量的值,一步步求出结果;2、优化计算:b=true;a=bc;(不计算c,a=true)b=false;a=bc;(不计算c,a=false),思考:C语言的强制转换?,4.4表达式及赋值语句的翻译,2、布尔表达式的计算所以,按照优化方式计算布尔表达式,需要给出整个表达式的真假出口。(1)真出口:若E(1)为真,则E为真;若E(2)为真,则E为真;所以E的真出口有两个:E(1)的真出口和E(2)的真出口。(2)假出口:E(1)的假出口并不是E的假出口,(1)如果为假,必须计算E(2),因此:E(2)的假出口是整个的假出口。,(a)E=E(1)E(2),4.4表达式及赋值语句的翻译,2、布尔表达式的计算(1)假出口:若E(1)为假,则E为假;若E(2)为假,则E为假;所以E的假出口有两个:E(1)的假出口和E(2)的假出口。(2)真出口:E(1)的真出口并不是E的真出口,(1)如果为真,必须计算E(2),因此:E(2)的真出口是整个的真出口。练习布尔表达式abcd的真假出口。,(b)E=E(1)E(2),4.4表达式及赋值语句的翻译,布尔表达式中,每个布尔分量一般至少对应两个四元式。例如:E=E(1)E(2)=abif(a|b)c=1;对应:(1)(jnz,a,_,真出口)(2)(j,_,_,3)(3)(jnz,b,_,真出口)(4)(j,_,_,假出口)(5)(=,c,_,1)(6)if语句后面的四元式在这个例子中,真出口和假出口不能在生成四元式的当时产生;假如a和b并不是简单的布尔变量,或者条件语句后执行的语句并不是仅仅一句,所有的真假出口都无法给定。,4.4表达式及赋值语句的翻译,3、布尔表达式的文法:(1)普通布尔表达式文法:(2)优化的布尔表达式文法:好处:在句子中,如果出现“ab”或“ab”之类的表达式,当扫描到“a”或“a”之后就立即可以进行规约,不用去关系b的取值。,GE:EEE|EE|E|(E)|i|iropi,GE:EEAE|EBE|E|(E)|i|iropiEAEEBE,4.4表达式及赋值语句的翻译,4、解决“真”、“假”出口问题的方法:拉链和回填(1)拉链:在同一个表达式内,每个四元式产生的时候,强制其出口为0,若后面一个四元式和它出口相同,用前面产生式的序号去填充后面产生式的跳转位置(result),从而将不同的四元式链接起来,俗称“拉链”。,假如下面三个四元式都是真出口:(i)(_,_,_,0)(j)(_,_,_,0)(k)(_,_,_,0),注意:(k)为链首,(i)为链尾,链尾result=0,4.4表达式及赋值语句的翻译,(1)拉链算法:p1,p2各自是两个链首,将它们合并成一个以p2为链首的新链,merge(p1,p2)if(p2=0)return(p1);elsep=p2;while(四元式p的第四区段内容不为0)p=四元式p的第四区段内容;把p1填进四元式p的第四区段;return(p2);/else/merge,(r1)(_,_,_,0)(q1)(_,_,_,r1)(p1)(_,_,_,q1),(r2)(_,_,_,0)(q2)(_,_,_,r2)(p2)(_,_,_,q2),算法执行完,其实就是将(r2)中的result变为p1,最终形成一个链,4.4表达式及赋值语句的翻译,(2)回填算法:把链首p所链接的每个四元式的第四区段(result)都改写为地址t。,Backpatch(p,intt)Q=p;while(Q!=0)q=四元式Q的第四区段内容;把t填进四元式Q的第四区段;Q=q;/while/Backpatch,4.4表达式及赋值语句的翻译,(3)其它需要说明的问题:1、对于每个非终结符E,我们需要为它赋予两个语义值E.tc和E.fc,分别用来记录E所对应的四元式的真链和假链。也就是说,为每个非终结符E添加两个属性:tc和fc;因此,规约的时候,再次扩充语义栈,添加tc栈和fc栈;2、nxq:这是一个int变量,翻译工作开始之前,初始值是1,翻译工作开始之后,每执行一次emit(),nxq自增1,即:nxq=四元式个数+1;,4.4表达式及赋值语句的翻译,5、布尔表达式的翻译1、文法:2、语义子程序:例如if(a)b;,GE:EEAE|EBE|E|(E)|i|iropiEAEEBE,Ei(布尔值)E.tc=nxq;E.fc=nxq+1;emit(jnz,entry(i),_,0);emit(j,_,_,0);,(2)Ei(1)ropi(2)E.tc=nxq;E.fc=nxq+1;emit(jrop,entry(i(1),entry(i(2),0);emit(j,_,_,0);,4.4表达式及赋值语句的翻译,说明(5):如果E(1)为真,表达式的值取决于之后,可以回填E(1)的tc链,跳转到nxq;如果E(1)为假,那么不必计算后面,EA直接为假。,(3)E(E(1)E.tc=E(1).tc;E.fc=E(1).fc;,(4)EE(1)E.tc=E(1).fc;E.fc=E(1).tc;,(5)EAE(1)Backpatch(E(1).tc,nxq);EA.fc=E(1).fc;,(6)EEAE(2)E.tc=E(2).tc;E.fc=merge(EA.fc,E(2).fc);,4.4表达式及赋值语句的翻译,(7)EBE(1)Backpatch(E(1).fc,nxq);EB.tc=E(1).tc;,(8)EEBE(2)E.fc=E(2).fc;E.tc=merge(EB.tc,E(2).tc);,说明(8):能使用(8)规约,说明E(1)为假,E(1)的真出口必须链接到E(2),因此要拉链操作;E的真假出口都必须依赖于E(2),因此E.fc=E(2).fc;E.tc=E(2).tc;,4.4表达式及赋值语句的翻译,3、步骤:(1)首先规约布尔表达式,如“abcd”,通过语义子程序翻译出初始的四元式;(2)添加真假出口的四元式标记(3)回填真假出口,经判断得知,整个布尔表达式的真出口是106,假出口是q(回填链尾为0的tc、fc),100(jnz,a,_,102)101(j,_,_,104)102(jnz,b,_,0)103(j,_,_,104)104(j,c,d,102)105(j,_,_,0),T:106F:q,if(abcd)else,4.4表达式及赋值语句的翻译,例4.3试给出布尔表达式abcd作为控制条件的四元式中间代码。,解答设四元式序号从100开始,则布尔表达式abcd的分析过程为:,规则:EiEbcd,初始输入:abcd,语义栈(tc/fc):,四元式:100(jnz,a,_,0)101(j,_,_,0),Ei(布尔值)E.tc=nxq;E.fc=nxq+1;emit(jnz,entry(i),_,0);emit(j,_,_,0);,规则:EAE(1)EAbcd,语义栈(tc/fc):,四元式:100(jnz,a,_,102)101(j,_,_,0)nxq=102,4.4表达式及赋值语句的翻译,规则:EiEAE(2)cd,语义栈(tc/fc):,四元式:102(jnz,b,_,0)103(j,_,_,0),规则:EEAE(2)Ecd,语义栈(tc/fc):,四元式:101(j,_,_,0)103(j,_,_,101),4.4表达式及赋值语句的翻译,规则:EBE(1)EBcd,语义栈(tc/fc):,四元式:101(j,_,_,104)103(j,_,_,104),规则:EiropiEBE,语义栈(tc/fc):,四元式:104(j,c,d,0)105(j,_,_,0),规则:EEBE(2)E,语义栈(tc/fc):,四元式:104(j,c,d,102),4.4表达式及赋值语句的翻译,第一步结束,得到abcd的四元式如下:,100(jnz,a,_,102)101(j,_,_,104)102(jnz,b,_,0)103(j,_,_,104)104(j,c,d,102)105(j,_,_,0),第三步,回填真假出口:检查真假链尾仍然是0的四元式,进行回填。,第二步,定义真假出口:,T:106F:q,最终得到:100(jnz,a,_,102)101(j,_,_,104)102(jnz,b,_,106)103(j,_,_,104)104(j,c,d,106)105(j,_,_,q)T:106F:q,4.4表达式及赋值语句的翻译,重点内容:如何不进行规约和语义子程序,得到布尔表达式的四元式?解答:根据布尔表达式的语义子程序,可以发现(规律):只有两个文法产生四元式:(1)Ei(布尔值)所以,每个布尔变量a产生:(jnz,a,_,0);(j,_,_,0);(2)Ei(1)ropi(2)同样每个关系表达式xropy产生:(jrop,x,y,0);(j,_,_,0);四元式的result字段填写变量的真假出口便能翻译布尔表达式,解答该布尔表达式的翻译图如图4-9所示,所对应的四元式代码如下:,例4.4试给出布尔表达式amncxy的四元式代码,100(jnz,a,_,108)101(j,_,_,102)102(j,m,n,108)103(j,_,_,104)104(jnz,c,_,106)105(j,_,_,q)106(j,x,y,108)107(j,_,_,q)T:108F:q,图4-9例4.4的翻译图,4.4表达式及赋值语句的翻译,课堂练习:试着通过翻译图给出布尔表达式abcd作为控制条件的四元式中间代码。,解答,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!