第七章中间代码生成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
formSemSemtoptopt