编译原理实验.docx
- 文档编号:16698999
- 上传时间:2023-07-16
- 格式:DOCX
- 页数:25
- 大小:132.59KB
编译原理实验.docx
《编译原理实验.docx》由会员分享,可在线阅读,更多相关《编译原理实验.docx(25页珍藏版)》请在冰点文库上搜索。
编译原理实验
编译原理实验报告
实验三中间的代码优化
一、实验目的:
掌握局部优化方法、提高机器的运行速度
二、相关知识:
某些编译程序在中间代码或目标代码生产之后要对其进行优化,所谓优化就是对代码进行等价的变换。
而变换后的代码运行结果与变换前的代码运行结果相同。
而运行速度加快或占用内存空间减少。
中间的代码优化就是对中间代码进行等价的变换。
基本块的有向图DAG(DirectedAcyclicGraph)
有向图中任何一条通路都不是环路,则称该有向图为无环路有向图,简称为DAG。
三、实验内容:
1、构造基本块内的优化DAG
假设:
(1)ni为已知结点号,n为新结点号;
(2)访问各结点信息时,按结点号逆序排序
2、完成对下例三类表达式的优化
(1)常值表达式的优化
(2)公共表达式的优化
(3)无用赋值的优化
3、输出根据优化的DAG重组四元式
四、实验要求:
1、完成对下例三类表达式的优化
(1)常值表达式的优化
(2)公共表达式的优化
(3)无用赋值的优化
2、输出根据优化的DAG重组四元式
五、源程序代码清单:
#include
#include
usingnamespacestd;
voidE();
voidT();
voidF();
voidS();
voidH();
voiddaima();
charexpe[50];
inttop=1;
inti=0,m=1,j=0,k=0;
charw[2],wc;
charTZ[9][3]={"t1","t2","t3","t4","t5","t6","t7","t8","t9"};
structshuju
{
charDT[3];
}SEM[50]={{'#'}};
structsiyuanshi
{
charstack_w[2];
charstack_data1[3];
charstack_data2[3];
charstack_t[4];
}action[9]={{"","","",""},{"","","",""},{"","","",""},{"","","",""},{"","","",""},
{"","","",""},{"","","",""},{"","","",""},{"","","",""}};
structyou
{
charnode[4][3];
charw[2];
intleft;
intright;
}youhua[20]={{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"},{"#"}};
voidmain()
{
w[1]='\0';
cout<<"pleaseinputyourexpression:
"< cin>>expe; do{ w[0]=expe[i++]; wc=expe[i]; if(wc=='=')S(); elseE(); }while(w[0]! ='#'&&w[0]==';'); if(w[0]=='#'&&m! =0) cout<<"OK! "< elseif(m! =0) cout<<"err"< cout<<"四元式代数输出: "< for(i=0;i<9;i++) { if(action[i].stack_w[0]=='=') cout< elseif(action[i].stack_w[0]=='+'||action[i].stack_w[0]=='-'||action[i].stack_w[0]=='*'||action[i].stack_w[0]=='/') cout< elsebreak; } daima(); cout<<"优化后的代码: "< for(i=1;i<20;i++) { if(youhua[i].w[0]=='=') { cout< for(j=2;j<4;j++) { if(strcmp(youhua[i].node[j],"#")! =0) cout< } } elseif(youhua[i].w[0]=='+'||youhua[i].w[0]=='-'||youhua[i].w[0]=='*'||youhua[i].w[0]=='/') { cout< for(j=1;j<4;j++) { if(strcmp(youhua[i].node[j],"#")! =0) cout< } } else{} } } voiddaima() { inti=0,j=0,k=1,l=0; for(j=1;j<20;j++) { youhua[j].left=0; youhua[j].right=0; strcpy(youhua[j].w,"#"); for(i=0;i<4;i++) strcpy(youhua[j].node[i],"#"); } for(i=0;i<9;i++) { if((action[i].stack_data1[0]>='0'&&action[i].stack_data1[0]<='9')&&(action[i].stack_data2[0]>='0'&&action[i].stack_data2[0]<='9')) { inta; if(action[i].stack_w[0]=='/')a=(int)(action[i].stack_data1[0]-48)/(int)(action[i].stack_data2[0]-48); elseif(action[i].stack_w[0]=='*') a=(int)(action[i].stack_data1[0]-48)*(int)(action[i].stack_data2[0]-48); elseif(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<<"节点生成过程: "< for(i=0;i<9;i++) { intm=0,n=0,ceshi=0,m1=0,n1=0,lr=0,hb1=0,hb2=0; if(action[i].stack_w[0]! ='=') { if(action[i].stack_data1[0]>='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) {intgg=0; for(gg=0;gg<4;gg++) { if(youhua[j].node[gg][0]>='0'&&youhua[j].node[gg][0]<='9') { inta; if(action[i].stack_w[0]=='/')a=(int)(action[i].stack_data1[0]-48)/(int)(youhua[j].node[gg][0]-48); elseif(action[i].stack_w[0]=='*')a=(int)(action[i].stack_data1[0]-48)*(int)(youhua[j].node[gg][0]-48); elseif(action[i].stack_w[0]=='+')a=(int)(action[i].stack_data1[0]-48)+(int)(youhua[j].node[gg][0]-48); elsea=(int)(action[i].stack_data1[0]-48)-(int)(youhua[j].node[gg][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,"_"); } } } } } elseif(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) {intgg=0; for(gg=0;gg<4;gg++) { if(youhua[j].node[gg][0]>='0'&&youhua[j].node[gg][0]<='9') { inta; if(action[i].stack_w[0]=='/')a=(int)(action[i].stack_data2[0]-48)/(int)(youhua[j].node[gg][0]-48); elseif(action[i].stack_w[0]=='*')a=(int)(action[i].stack_data2[0]-48)*(int)(youhua[j].node[gg][0]-48); elseif(action[i].stack_w[0]=='+')a=(int)(action[i].stack_data2[0]-48)+(int)(youhua[j].node[gg][0]-48); elsea=(int)(action[i].stack_data2[0]-48)-(int)(youhua[j].node[gg][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,"_"); } } } } } else { for(j=1;j<20;j++) { intout=0; for(l=0;l<4;l++) { if(strcmp(action[i].stack_data1,youhua[j].node[l])==0) hb1=j; elseif(strcmp(action[i].stack_data2,youhua[j].node[l])==0) hb2=j; else{} } if(hb1! =0&&hb2! =0) { out=1; intgg=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) { inta; if(action[i].stack_w[0]=='/')a=(int)(youhua[hb1].node[gg][0]-48)/(int)(youhua[hb2].node[qq][0]-48); elseif(action[i].stack_w[0]=='*')a=(int)(youhua[hb1].node[gg][0]-48)*(int)(youhua[hb2].node[qq][0]-48); elseif(action[i].stack_w[0]=='+')a=(int)(youhua[hb1].node[gg][0]-48)+(int)(youhua[hb2].node[qq][0]-48); elsea=(int)(youhua[hb1].node[gg][0]-48)-(int)(youhua[hb2].node[qq][0]-48); strcpy(action[i].stack_w,"="); strcpy(action[i].stack_data1,""); action[i].stack_data1[0]=(char)(a+48); cout<<"a:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验