编译原理实验报告
编译原理实验报告
实验三 中间的代码优化
编译原理实验报告
一、 实验目的:
掌握局部优化方法、提高机器的运行速度
二、 相关知识:
某些编译程序在中间代码或目标代码生产之后要对其进行优化,
所谓优化就是对代码进行等价的变换。而变换后的代码运行结果与变
换前的代码运行结果相同。而运行速度加快或占用内存空间减少。中
间的代码优化就是对中间代码进行等价的变换。
基本块的有向图 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!"<编译原理实验报告
else
if(youhua[i].w[0]=='+'||youhua[i].w[0]=='-'||youhua[i].w[0]=='*'||youhua[i].w[0]=='/')
{
cout<='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:"<