编译原理第七章 中间代码生成.ppt

编译原理第七章 中间代码生成.ppt

ID:51496660

大小:173.00 KB

页数:24页

时间:2020-03-25

编译原理第七章 中间代码生成.ppt_第1页
编译原理第七章 中间代码生成.ppt_第2页
编译原理第七章 中间代码生成.ppt_第3页
编译原理第七章 中间代码生成.ppt_第4页
编译原理第七章 中间代码生成.ppt_第5页
资源描述:

《编译原理第七章 中间代码生成.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、第七章中间代码生成中间语言语法制导方法简单表达式的中间代码生成原子语句的中间代码生成结构语句的中间代码生成声明的中间代码中间语言后缀式----逆波兰式图结构中间代码(语法树、DAG)三地址中间代码(三元式、四元式)三地址中间代码三元式:i:(,op1,op2)四元式:(,op1,op2,result)如:a:=b×c+b×d三元式四元式(1)(×,b,c)(1)(×,b,c,t1)(2)(×,b,d)(2)(×,b,d,t2)(3)(+,(1),(2))(3)(+,t1,t2,t3)(4)(:=,(3),a)(4)(:=,t3,a,-)语法制导方法语法制导方法基于文法结构,在

2、每个产生式的右部增加语义动作,在语法分析过程中,如遇语义动作,就完成对应的语义处理。类型检查和类型转换各种条件表达式的类型是否是布尔类型?运算符的运算分量是否相容?赋值语句的左、右部类型是否相容?实参与形参的类型是否相容?下标表达式的类型是否为所允许的类型?函数说明中的函数类型与返回值的类型是否一致?中间代码生成中的几个问题语义信息的获取与保存语义栈及其操作常用的语义子程序简单表达式的LL语法制导ETEsEs+T#GenCode(+)EsEsTPTsTs*P#GenCode(×)TsTsPid#Push(id)PC#Push(C)P(E)下标变量中间代码生成

3、(1)V→#Initid#PUSH(Addr(id))A(2)A→[E]#AddNextB(3)B→B→[E]#AddNextB#Init:用来初始化下标计数器n=0;#Push:把id首地址压入栈中;#AddNext:1)下标计数器加1,n:=n+1;2)从语义栈中取出下标表达式计算结果result;3)生成计算第n维下标需要累加的地址偏移的四元式组:(SUBI,result,Ln,tn+1)(MULTI,tn+1,Sk,tn+2)(MULT,tn+2,size,tn+3)4)从语义栈中取出地址累加结果ad;5)生成地址累加四元式(ADDI,ad,tn+3,tn+4)6)把累

4、加后的地址结果压入语义栈;表达式中间代码生成的例子a[5+i].x+m*z其中,i,m:integer;z:real;a:array[1..100]ofrt;rt=recordy:int;x:realend(ADDI,5,i,t1)(SUBI,t1,1,t2)(MULTI,t2,2,t3)(AADD,a,t3,t4)5.(AADD,t4,1,t5)6.(FLOAT,m,t6)7.(MULTF,t6,z,t7)8.(ADDF,t5,t7,t8)赋值语句的形式为:Left:=Right赋值语句的四元式结构:Left的中间代码Right的中间代码(FLOAT,right,—,t)(AS

5、SIG,Right(t),n,Left)语法制导:SL:=R#ASSIGN#ASSIGN:从语义栈中取出赋值号左右分量的语义信息;比较类型是否相同,如果不同,则生成类型转换中间代码;生成赋值四元式(ASSIG,Right(t),n,Left)。赋值语句中间代码过函调用的中间代码f(E1,E2,…,En):E1.tuple…En.tuple(ACT,E1.Arg)…(ACT,En.Arg)(CALL,,—,result)或(CALL,,—)传给形参形参实参结合中间代码:(VALACT,Ei.Arg,offseti,sizei)……值参(VARACT,Ei.Arg,of

6、fseti,sizei)……变参(FUNCACT,Ei.Arg,offseti,sizei)……函数参数(PROACT,Ei.Arg,offseti,sizei)……过程参数过/函调用代码:(call,,true,result)静态转向地址(call,,false,result)动态转向地址例:x+f(H(10),g(Y))其中x是整型变量,H为形参函数名,H的形参为值参,f、g为实在函数名,f的参数均为值参,g的参数为变参。(VALACT,10,1,1)(CALL,H,false,t1)(VARACT,Y,1,1)(CALL,g,true,t2)(VALACT,

7、t1,1,size1)(VALACT,t2,2,size2)(CALL,f,true,t3)(ADDI,x,t3,t4)过/函调用中间代码的生成遇到过/函名:在符号表中的地址压栈,实参计数器为0;遇到实参Ei:产生计算表达式Ei的中间代码,实参的语义信息压栈,计数器加1。实参结束:根据过/函的语义信息,检查形参与实参个数一致?类型相容?种类符合?过/函?,产生参数传送的中间代码。产生调用的中间代码删除语义栈中过/函名及实参的内容,如果是函数将返回值的语义信息压入栈中。Call

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。