第七章 中间代码生成(2).ppt
《第七章 中间代码生成(2).ppt》由会员分享,可在线阅读,更多相关《第七章 中间代码生成(2).ppt(50页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第七七章章 中中间间代代码码生成生成l 7.1 几种常几种常见的中的中间表示表示l 7.2 中中间代代码中生成的几个中生成的几个问题l 7.3 表达式的中表达式的中间代代码生成生成l 7.4 原子原子语句的中句的中间代代码生成生成l 7.5 结构构语句的中句的中间代代码生成生成l 7.6 声明的中声明的中间代代码生成生成7.2 7.2 中中间间代代码码生成生成中的中的几几个问题个问题1.1.语义信息的信息的获取和保存取和保存目目标代代码阶段保留符号表,段保留符号表,则可用可用标识符在符号表中的符在符号表中的地址地址不保留符号表,不保留符号表,则用用FORM结构构保存保存标识符的符的语义信息信
2、息2.2.语义栈Sem及其操作及其操作语义栈的内容:运算分量的的内容:运算分量的类型和型和FORM数据数据结构定构定义:typedef struct SemElem typ:ElemType;Form:FormStructtypedefSemElem SemStackMax 变量及操作:量及操作:SemStack Sem;/声明声明Sem为语义栈int top;/声明声明top为语义栈栈顶push(x):将将x的的类型和型和Form压入入语义栈pop(n):从:从Sem栈栈顶依次依次弹出出n个元素个元素7.2 7.2 中中间间代代码码生成生成中的中的几几个问题个问题3.3.常用的常用的语义子程
3、序子程序l申申请临时单元元new_dir(t):在在临时变量区申量区申请一个一个单元元t,且,且t是直接是直接寻址址new_indir(t):t是是间接接寻址址l存放中存放中间代代码子程序子程序Generate(,left,right,result)将一条四元式中将一条四元式中间代代码存放到中存放到中间代代码区中区中l产生一条中生一条中间代代码子程序子程序GenCode()l产生一条中生一条中间代代码子程序子程序GenCode()调用用该函数函数时,左右操作数已,左右操作数已进语义栈Sem;分分别取出左右操作数;取出左右操作数;检查类型是否相同,不同型是否相同,不同则进行行转换,产生生类型型转
4、换四元式;四元式;产生中生中间代代码(*,Semtop-1,Semtop,t)pop(2);/弹出左右分量出左右分量push(t)/压入入结果果t的的类型和型和FormL.typ,L.formL.typ,L.formR.typ,R.formR.typ,R.formSemSemtoptopt.typ,t.formt.typ,t.formSemSemtoptop7.3 7.3 表表达达式的中式的中间间代代码码生成生成表达式的中表达式的中间代代码就是依据原表达式的就是依据原表达式的语义产生出正生出正确确计算表达式算表达式值的四元式中的四元式中间代代码(即将(即将计算算顺序体序体现出来)出来)表达式的
5、运算分量可以是表达式的运算分量可以是简单变量、复量、复杂变量和函数量和函数调用用表达式的运算符可以是算表达式的运算符可以是算术运算符,关系运算符,运算符,关系运算符,逻辑运算符等运算符等首先首先给出出简单算算术表达式的中表达式的中间代代码生成生成复合复合变量的中量的中间代代码生成生成表表达达式的式的四元四元式式表达式表达式E a*(3.5+i*b)假假设a,b为实型型变量,量,i为整型整型变量量 E生成的四元式如下:生成的四元式如下:(FLOAT,i,-,t1)(MULTF,t1,b,t2)(ADDF,3.5,t2,t3)(MULTF,a,t3,t4)表表达达式式四元四元式式生成生成LL(1)
6、LL(1)语语法法制制导导E T EsEs Es +T EsEs -T EsT P TsTs Ts*P TsTs/PTsP CP idP(E)E T EsEs Es +T#GenCode(+)#EsEs -T#GenCode(-)#EsT P TsTs Ts*P#GenCode(*)#TsTs/P#GenCode(/)#TsP C#Push(C)#P id#Push(id)#P(E)E a*(3.5+i*b)T Es a*(3.5+i*b)P Ts Es a*(3.5+i*b)id Ts Es a*(3.5+i*b)Ts Es *(3.5+i*b)Ts Es *(3.5+i*b)*PTs Es
7、 *(3.5+i*b)P Ts Es (3.5+i*b)(E)Ts Es (3.5+i*b)E)Ts Es 3.5+i*b)T Es)GenCode(*)Ts Es 3.5+i*b)P Ts Es)Ts Es 3.5+i*b)C Ts Es)Ts Es 3.5+i*b)Ts Es)Ts Es +i*b)Ts Es)Ts Es +i*b)Ts Es)Ts Es +i*b)Es)Ts Es +i*b)+T Es)Ts Es+i*b)T Es)Ts Es i*b)PTs Es)Ts Es i*b)id Ts Es)Ts Es i*b)Ts Es)Ts Es *b)Ts Es)Ts Es *b)*P
8、Ts Es)Ts Es *b)P Ts Es)Ts Es b)id Ts Es)Ts Es b)Ts Es)Ts Es )Ts Es)Ts Es )Ts Es)Ts Es )Es)Ts Es )Es)Ts Es )Ts Es )Ts EsTs Es Es复合复合变量:下量:下标变量量 Aij,域名域名变量量 st.name,指指针变量量*p复合复合变量的中量的中间代代码是是计算复合算复合变量地址的四元式量地址的四元式变量的语法:V idV1 V2 EV1 V2.idV1 *V2地址:addr(V)=addr(id)addr(V1)=addr(V2)+(E-low+1)*Elesize addr
9、(V1)=addr(V2)+offset(id)addr(V1)=content(addr(V2)复复合合变变量量的的四元四元式式生成生成一一维下下标变量量 ai和多和多维下下标变量量 aijk下下标变标变量量的的四元四元式式生成生成Var A:array L1.U1L2.U2LnUn of T;(n=1)数组第1行的宽度是 D1=U1-L1+1;数组第i行的宽度是 Di=Ui-Li+1;设类型T所占单元数为,则数组A占单元数为size(A)=D1*D2*Dn*下标变量AE1E2Ek地址为:Addr(A)+(E1-L1)*S1+(Ek-Lk)*Sk)*size(T)其中 当 i=1时,s1=1
10、,否则 si=Di+1*Di+2*Dn sn=1AE1E2Ek(k=n)(ASSIG,size(T),-,tsize)E1 t1(SUBI,t1,L1,t2)(MULTI,t2,s1,t3)(MULTI,t3,tsize,t4)(AADD,addr(A),t4,ad)(SUBI,tn,Lk,tn+1)(MULTI,tn+1,sk,tn+2)(MULTI,tn+2,tsize,tn+3)(AADD,ad,tn+3,tn+4)Ek tn表表达达式式代代码码生成生成的例子的例子typedef struct char name30;int age;float height;person;int x10
11、;person class10;person *ptr;class5.age+*ptr.age(L,0)(L,10)(L,340)class5.age t1*ptr.age t2 (+,t1,t2,t3)class5 t4 (AADD,t4,30,t1)(-,5,0,t5)(*,t5,33,t6)(AADD,class,t6,t4)*ptr t7 (AADD,t7,30,t2)(Assig,ptr,_,t7)t1,t2,t4和t7的mode是indir;第第七七章章 中中间间代代码码生成生成l 7.1 几种常几种常见的中的中间表示表示l 7.2 中中间代代码中生成的几个中生成的几个问题l 7.
12、3 表达式的中表达式的中间代代码生成生成l 7.4 原子原子语句的中句的中间代代码生成生成l 7.5 结构构语句的中句的中间代代码生成生成l 7.6 声明的中声明的中间代代码生成生成7.4 原原子子语语句的中句的中间间代代码码生成生成赋值语句句:V=Exp;I/O 语句句Read(V);Write(Exp);Goto 语句句:Goto Label标号号语句句:Label:Statement;函数函数调用返回用返回语句句:Return Exp;函数函数调用用:F(Exp1,Expn)赋值语句lLeft=RightLeft.code(ASSIG,t.Form,n,left.Form)Right.c
13、ode其中n表示 Right.typ所占空间大小.(FLOAT,Right,_,t.Form)I/O 语句Write(Exp);lRead(V)V.code(READ,_,_,V.Form)Exp.code(WRITE,_,_,Exp.Form)Goto语句和Label语句L:SlGoto L(JUMP,_,_,LL)(LABEL,_,_,LL)S.codeReturn语句lReturn EE.code(RETURN,_,_,E.Form)Return(RETURN,_,_,_)函数调用语句lf(E1,En)l从符号表中获取f 的属性Level,params,typel生成中间代码E1.cod
14、e函数调用形实参结合En.code(VALACT,实参.Form,offset,size)(VARACT,实参.Form,offset,size)(call,f,true,t)(call,f,false,t)函数调用例子函数f(x+1,Y),其中x是一般整型是一般整型变量量,Y是是变参整型参整型变量,假定量,假定f是是实在函数,在函数,f的两个形参一个是的两个形参一个是值参一个是参一个是变参参(ADDI,x,1,t1)(VALACT,t1,offset1,1)(VARACT,Y,offset2,1)(CALL,f,true,t2)第第七七章章 中中间间代代码码生成生成l 7.1 几种常几种常见
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第七章 中间代码生成2 第七 中间 代码 生成
限制150内