編譯原理實驗

2022-12-03 18:57:06 字數 2602 閱讀 8819

實驗三中間的**優化

一、 實驗目的:

掌握區域性優化方法、提高機器的執行速度

二、 相關知識:

某些編譯程式在中間**或目標**生產之後要對其進行優化,所謂優化就是對**進行等價的變換。而變換後的**執行結果與變換前的**執行結果相同。而執行速度加快或占用記憶體空間減少。

中間的**優化就是對中間**進行等價的變換。

基本塊的有向圖 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]=;

struct shuju

sem[50

struct siyuanshi

action[9

struct you

youhua[20

void main()

while(w[0]!='#'&&w[0]==';');

if(w[0]=='#'&&m!=0)

cout<<"ok!"< else if(m!=0)

cout<<"err"< cout<<"四元式代數輸出:"< for(i=0;i<9;i++)

daima();

cout<<"優化後的**:"< for(i=1;i<20;i++)

else if(youhua[i].w[0]=='+'||youhua[i].w[0]=='-'||youhua[i].

w[0]=='*'||youhua[i].w[0]=='/')

else {}

}}void daima()

for(i=0;i<9;i++)

}cout<<"節點生成過程:"< for(i=0;i<9;i++)

{int m=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)

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]-48);

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);

else a=(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,"_");

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++)

編譯原理實驗

第一篇高階程式語言到中間語言 第一章編譯概論及程式語言規定 1 1 編譯程式概論 計算機執行乙個高階語言程式一般要分為兩步 第一步,用乙個編譯程式把高階語言翻譯成機器語言程式 第二步,執行所得的機器語言程式,求得計算結果。編譯程式的工作貫穿於從輸入源程式開始到輸出目標程式為止的整個過程,是非常複雜的...

編譯原理實驗一

編譯原理課程 2015 2016年度第2學期 實驗題目 詞法分析程式設計 院系 計算機學院 班級130808 學號 3113003906 姓名 王峰 任課教師 白明成績評定 完成日期 2016年 5 月 21 日 一 程式設計題目與說明 設計乙個關於某種高階語言子集的詞法分析程式 功能包括 輸入源程...

編譯原理實驗三

實驗報告 第 2 組 專業 軟體工程 班級 3 學號 123012012095 94 101 103 姓名吳藝萍 陳璐 崔旻 劉超群 實驗日期 2014 年 3 月 20 告退發 訂正 重做 課程實驗名稱遞迴下降的 分析 一 實驗目的 1.學會用語法圖來形式化地描述一門簡單的語言 2.掌握遞迴下降的...