logo资料库

编译原理实验报告-目标代码的优化.doc

第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
资料共17页,剩余部分请下载后查看
编译原理实验报告
编译原理实验报告 编译原理实验报告 实验三 中间的代码优化
编译原理实验报告 一、 实验目的: 掌握局部优化方法、提高机器的运行速度 二、 相关知识: 某些编译程序在中间代码或目标代码生产之后要对其进行优化, 所谓优化就是对代码进行等价的变换。而变换后的代码运行结果与变 换前的代码运行结果相同。而运行速度加快或占用内存空间减少。中 间的代码优化就是对中间代码进行等价的变换。 基本块的有向图 DAG(Directed Acyclic Graph) 有向图中任何一条通路都不是环路,则称该有向图为无环路有向图, 简称为 DAG。 三、 实验内容: 1、构造基本块内的优化 DAG 假设:(1) ni 为已知结点号,n 为新结点号; (2)访问各结点信息时,按结点号逆序排序 2、完成对下例三类表达式的优化 (1)常值表达式的优化 (2)公共表达式的优化 (3)无用赋值的优化 3、输出根据优化的 DAG 重组四元式 四、 实验要求: 1、完成对下例三类表达式的优化 (1)常值表达式的优化
编译原理实验报告 (2)公共表达式的优化 (3)无用赋值的优化 2、输出根据优化的 DAG 重组四元式 五、 源程序代码清单: #include #include using namespace std; void E(); void T(); void F(); void S(); void H(); void daima(); char expe[50]; int top=1; int i=0,m=1,j=0,k=0; char w[2],wc; char TZ[9][3]={"t1","t2","t3","t4","t5","t6","t7","t8","t9"}; struct shuju { char DT[3]; }SEM[50]={{'#'}}; struct siyuanshi { char stack_w[2]; char stack_data1[3]; char stack_data2[3]; char stack_t[4]; }action[9]={{" "," "," "," "},{" "," "," "," "},{" "," "," "," "},{" "," "," "," "},{" "," "," "," "}, {" "," "," "," "},{" "," "," "," "},{" "," "," "," "},{" "," "," "," "}}; struct you { char node[4][3]; char w[2]; left; int int right;
编译原理实验报告 }youhua[20]={{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{ "#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"}}; void main() { w[1]='\0'; cout<<"please input your expression:"<>expe; do{ w[0]=expe[i++]; wc=expe[i]; if(wc=='=')S(); else E(); }while(w[0]!='#'&&w[0]==';'); if(w[0]=='#'&&m!=0) cout<<"OK!"<='0'&&action[i].stack_data1[0]<='9')&&(action[i].stack_data2[0] >='0'&&action[i].stack_data2[0]<='9')) { int a; if(action[i].stack_w[0]=='/')a=(int)(action[i].stack_data1[0]-48)/(int)(action[i].stack_data2[0] -48); else if(action[i].stack_w[0]=='*') a=(int)(action[i].stack_data1[0]-48)*(int)(action[i].stack_data2[0]-48); else if(action[i].stack_w[0]=='+') a=(int)(action[i].stack_data1[0]-48)+(int)(action[i].stack_data2[0]-48); else a=(int)(action[i].stack_data1[0]-48)-(int)(action[i].stack_data2[0]-48); strcpy(action[i].stack_w,"=");
编译原理实验报告 strcpy(action[i].stack_data1," "); action[i].stack_data1[0]=(char)(a+48); strcpy(action[i].stack_data2,"_"); } } cout<<"节点生成过程:"<='0'&&action[i].stack_data1[0]<='9') { for(j=1;j<20;j++) { for(l=0;l<4;l++) if(strcmp(action[i].stack_data2,youhua[j].node[l])==0) { int gg=0; for(gg=0;gg<4;gg++) { if(youhua[j].node[gg][0]>='0'&&youhua[j].node[gg][0]<='9') { int a; if(action[i].stack_w[0]=='/')a=(int)(action[i].stack_data1[0]-48)/(int)(youhua[j].node[gg][0]-4 8); else if(action[i].stack_w[0]=='*')a=(int)(action[i].stack_data1[0]-48)*(int)(youhua[j].node[gg][0]-48); else if(action[i].stack_w[0]=='+')a=(int)(action[i].stack_data1[0]-48)+(int)(youhua[j].node[gg][0]-48); a=(int)(action[i].stack_data1[0]-48)-(int)(youhua[j].node[gg][0]-48); else strcpy(action[i].stack_w,"="); strcpy(action[i].stack_data1," "); action[i].stack_data1[0]=(char)(a+48); strcpy(action[i].stack_data2,"_"); } } } } } else if(action[i].stack_data2[0]>='0'&&action[i].stack_data2[0]<='9') {
编译原理实验报告 for(j=1;j<20;j++) { for(l=0;l<4;l++) if(strcmp(action[i].stack_data1,youhua[j].node[l])==0) { int gg=0; for(gg=0;gg<4;gg++) { if(youhua[j].node[gg][0]>='0'&&youhua[j].node[gg][0]<='9') { int a; if(action[i].stack_w[0]=='/')a=(int)(action[i].stack_data2[0]-48)/(int)(youhua[j].node[gg][0]-4 8); else if(action[i].stack_w[0]=='*')a=(int)(action[i].stack_data2[0]-48)*(int)(youhua[j].node[gg][0]-48); else if(action[i].stack_w[0]=='+')a=(int)(action[i].stack_data2[0]-48)+(int)(youhua[j].node[gg][0]-48); a=(int)(action[i].stack_data2[0]-48)-(int)(youhua[j].node[gg][0]-48); else strcpy(action[i].stack_w,"="); strcpy(action[i].stack_data1," "); action[i].stack_data1[0]=(char)(a+48); strcpy(action[i].stack_data2,"_"); } } } } } else { for(j=1;j<20;j++) { int out=0; for(l=0;l<4;l++) { if(strcmp(action[i].stack_data1,youhua[j].node[l])==0) hb1=j; else if(strcmp(action[i].stack_data2,youhua[j].node[l])==0) hb2=j; else {} } if(hb1!=0&&hb2!=0) {
编译原理实验报告 out=1; int gg=0,qq=0; for(gg=0;gg<4;gg++) { if(youhua[hb1].node[gg][0]>='0'&&youhua[hb1].node[gg][0]<='9')break; } for(qq=0;qq<4;qq++) { if(youhua[hb2].node[qq][0]>='0'&&youhua[hb2].node[qq][0]<='9')break; } if(qq<4&&gg<4) { int a; if(action[i].stack_w[0]=='/')a=(int)(youhua[hb1].node[gg][0]-48)/(int)(youhua[hb2].node[qq] [0]-48); else if(action[i].stack_w[0]=='*')a=(int)(youhua[hb1].node[gg][0]-48)*(int)(youhua[hb2].node[qq][0]- 48); else if(action[i].stack_w[0]=='+')a=(int)(youhua[hb1].node[gg][0]-48)+(int)(youhua[hb2].node[qq][0]- 48); a=(int)(youhua[hb1].node[gg][0]-48)-(int)(youhua[hb2].node[qq][0]-48); else strcpy(action[i].stack_w,"="); strcpy(action[i].stack_data1," "); action[i].stack_data1[0]=(char)(a+48); cout<<"a:"<
分享到:
收藏