第七章中间代码生成7.1几种常见的中间表示7.2中间代码中生成的几个问题7.3表达式的中间代码生成7.4原子语句的中间代码生成7.5结构语句的中间代码生成7.6声明的中间代码生成7.2中间代码生成中的几个问题1.语义信息的获取和保存•目标代码阶段保留符号表,则可用标识符在符号表中的地址•不保留符号表,则用FORM结构保存标识符的语义信息2.语义栈Sem及其操作•语义栈的内容:运算分量的类型和FORM•数据结构定义:•typedefstructSemElem{typ:ElemType;•Form:FormStruct}•typedefSemElemSemStack[Max]•变量及操作:•SemStackSem;//声明Sem为语义栈•inttop;//声明top为语义栈栈顶•push(x):将x的类型和Form压入语义栈•pop(n):从Sem栈栈顶依次弹出n个元素7.2中间代码生成中的几个问题3.常用的语义子程序申请临时单元•new_dir(t):在临时变量区申请一个单元t,且t是直接寻址•new_indir(t):t是间接寻址存放中间代码子程序Generate(,left,right,result)•将一条四元式中间代码存放到中间代码区中产生一条中间代码子程序GenCode()产生一条中间代码子程序GenCode()•调用该函数时,左右操作数已进语义栈Sem;•分别取出左右操作数;•检查类型是否相同,不同则进行转换,产生类型转换四元式;•产生中间代码(*,Sem[top-1],Sem[top],t)•pop(2);//弹出左右分量•push(t)//压入结果t的类型和FormL.typ,L.formL.typ,L.formR.typ,R.typ,R.formR.formSemSemtoptopt.typ,t.typ,t.formt.formSemSemtoptop7.3表达式的中间代码生成•表达式的中间代码就是依据原表达式的语义产生出正确计算表达式值的四元式中间代码(即将计算顺序体现出来)•表达式的运算分量可以是简单变量、复杂变量和函数调用•表达式的运算符可以是算术运算符,关系运算符,逻辑运算符等•首先给出简单算术表达式的中间代码生成•复合变量的中间代码生成表达式的四元式•表达式Ea*(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)语法制导ETEsEsEs+TEsEs-TEsTPTsTsTs*PTsTs/PTsPCPidP(E)ETEsEsEs+T#GenCode(+)#EsEs-T#GenCode(-)#EsTPTsTsTs*P#GenCode(*)#TsTs/P#GenCode(/)#TsPC#Push(C)#Pid#Push(id)#P(E)•Ea*(3.5+i*b)•TEsa*(3.5+i*b)•PTsEsa*(3.5+i*b)•id
TsEsa*(3.5+i*b)•TsEs*(3.5+i*b)•TsEs*(3.5+i*b)•*PTsEs*(3.5+i*b)•PTsEs(3.5+i*b)•(E)TsEs(3.5+i*b)•E)TsEs3.5+i*b)•TEs)TsEs3.5+i*b)•CTsEs)TsEs3.5+i*b)•TsEs)TsEs+i*b)•TsEs)TsEs+i*b)•TsEs)TsEs+i*b)•Es)TsEs+i*b)•+TEs)TsEs+i*b)•TEs)TsEsi*b)•PTsEs)TsEsi*b)•idTsEs)TsEsi*b)•TsEs)TsEs*b)•TsEs)TsEs*b)•*PTsEs)TsEs*b)•PTsEs)TsEsb)•idTsEs)TsEsb)•TsEs)TsEs)•TsEs)TsEs)•TsEs)TsEs)•Es)TsEs)•Es)TsEs)•)TsEs)•TsEs•TsEs•Es•复合变量:下标变量A[i][j],域名变量st.name,指针变量*p•复合变量的中间代码是计算复合变量地址的四元式变量的语法:VidV1V2[E]V1V2.idV1*V2地址:addr(V)=addr(id)addr(V1)=addr(V2)+(E-low+1)*Elesizeaddr(V1)=addr(V2)+offset(id)addr(V1)=content(addr(V2))复合变量的四元式生成•...