編譯原理-中間代碼優(yōu)化_第1頁(yè)
編譯原理-中間代碼優(yōu)化_第2頁(yè)
編譯原理-中間代碼優(yōu)化_第3頁(yè)
編譯原理-中間代碼優(yōu)化_第4頁(yè)
編譯原理-中間代碼優(yōu)化_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、編譯原理實(shí)驗(yàn)4.中間代碼優(yōu)化實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)?zāi)康睦斫庵虚g代碼優(yōu)化的過(guò)程和基本方法,掌握0型四元式、1型四元式和2型四元式的基 本塊構(gòu)造。實(shí)驗(yàn)要求編制程序,完成局部?jī)?yōu)化過(guò)程中的基本塊劃分。給定一段代碼,判定程序的入口語(yǔ)句, 劃分基本塊,刪除無(wú)用產(chǎn)生式和冗余節(jié)點(diǎn)。三、補(bǔ)充完整的源程序代碼#include #include #include #include #include using namespace std;/*/* Deceleration of structures*/*/struct Fourstring op;/操作符string arg1;/第一個(gè)操作數(shù)string arg2;/第一個(gè)

2、操作數(shù)string result;結(jié)果int stylenum;/結(jié)點(diǎn)類(lèi)型struct Four *next;/指向下一條語(yǔ)句的起始位置struct Four *last;v/指向上一條語(yǔ)句的起始位置;struct DagNodestring bsf;/標(biāo)識(shí)符string var;/副標(biāo)識(shí)符int flag;/標(biāo)記位struct DagNode *lchild;/指向孩子的指針struct DagNode *rchild;/指向右孩子的指針struct DagNode *next;/指向下一個(gè)結(jié)點(diǎn)/* Global variables*/*/Four *fhead;DagNode *nhead

3、;std:list list_Dag;vector input_source;/* implementation of functions*/ void do_input()/*第一個(gè)測(cè)試用例:測(cè)試時(shí)去掉對(duì)應(yīng)的注釋input_source.push_back( ,5, ,T0);input_source.push_back(*,2,T0,T1);*/*第二個(gè)測(cè)試用例input_source.push_back( ,3.14, ,T0);input_source.push_back(*,2,T0,T1);input_source.push_back(+,R,r,T2);input_source.

4、push_back(+,T1,T2,A);input_source.push_back( ,A, ,B);*/*第三個(gè)測(cè)試用例input_source.push_back(*,2,T0,T3);input_source.push_back(+,R,r,T4);input_source.push_back(*,T3,T4,T5);input_source.push_back(-,R,r,T6);input_source.push_back(*,T5,T6,B);*/*第四個(gè)測(cè)試用例input_source.push_back(*,7,4,T1);input_source.push_back(+,

5、5,T1,T2);input_source.push_back( ,T2, ,a);input_source.push_back(+,a,9,T3);*/*第五個(gè)測(cè)試用例結(jié)合實(shí)驗(yàn)3的輸出結(jié)果input_source.push_back(/,3,2,t1);input_source.push_back( ,t1, ,a);input_source.push_back(+,s,8,t2);input_source.push_back( ,t2, ,b);*/void DataFour() /建立四元式的結(jié)構(gòu)映射struct Four *fourTmp = new Four;fourTmp-last

6、 = NULL;fourTmp-next = NULL;/for(/1補(bǔ)充條件)for(int i=0;inext = NULL;pp-last = fourTmp;fourTmp-next = pp;if(!pp) 內(nèi)存分配失敗coutMemory allocation failed!op=op;pp-arg1=arg1;pp-arg2=arg2;pp-result=result;if(pp-arg2 =)if(pp-op =)/2補(bǔ)充語(yǔ)句第二個(gè)操作數(shù)為空,并且操作符為空,則為0型四元式pp-stylenum=0;else/3補(bǔ)充語(yǔ)句第二個(gè)操作數(shù)為空,并且操作符不空,則為1型四元式pp-st

7、ylenum=1;else/4補(bǔ)充語(yǔ)句第二個(gè)操作數(shù)不為空,則為2型四元式pp-stylenum=2;fourTmp = pp;fhead = fourTmp;void ListBuild()/ 建立鏈表for(int i = 1; fhead-last != NULL; fhead = fhead-last) /從最后一個(gè)四元式開(kāi)始構(gòu)造鏈表DagNode *tmp1 = new DagNode;DagNode *tmp2 = new DagNode;DagNode *tmpResult = new DagNode;tmp1-lchild = NULL;tmp1-rchild = NULL;tm

8、p1-next = NULL;tmp2-lchild = NULL;tmp2-rchild = NULL;tmp2-next = NULL;tmpResult-lchild = NULL;tmpResult-rchild = NULL;tmpResult-next = NULL;nhead = new DagNode;nhead-next = NULL;nhead-lchild = NULL;nhead-rchild = NULL;switch(fhead-stylenum)case 0:tmp1-bsf = fhead-result;tmp1-var = fhead-arg1;tmp1-fl

9、ag = 0;tmp1-lchild = NULL;tmp1-rchild = NULL;tmp1-next = NULL;nhead-next = tmp1;list_Dag.push_back(nhead); / list 的成員函數(shù) push_back()把一個(gè)對(duì)象放到一個(gè) list的后面break;case 1:tmp1-bsf = fhead-arg1;tmp1-var =;tmp1-flag = 0;tmp1-lchild = NULL;tmp1-rchild = NULL;tmp1-next = NULL;tmpResult-bsf = fhead-result;tmpResul

10、t-var = fhead-op;tmpResult-flag = 0;tmpResult-lchild = tmp1;tmpResult-rchild = NULL;tmpResult-next = tmp1;nhead-next = tmpResult;list_Dag.push_back(nhead);break;case 2:tmp2-bsf = fhead-arg2;tmp2-var =;tmp2-flag = 0;tmp2-lchild = NULL;tmp2-rchild = NULL;tmp2-next = NULL;tmp1-bsf = fhead-arg1;tmp1-var

11、 =;tmp1-flag = 0;tmp1-lchild = NULL;tmp1-rchild = NULL;tmp1-next = tmp2;tmpResult-bsf = fhead-result;tmpResult-var = fhead-op;tmpResult-flag = 0;tmpResult-lchild = tmp1;tmpResult-rchild = tmp2;tmpResult-next = tmp1;nhead-next = tmpResult;list_Dag.push_back(nhead);break;default:cout您輸入的四元式不是0型、1型或者2型

12、的,請(qǐng)輸入這三種類(lèi)型的四元 式:next = NULL;nheadUp-lchild = NULL;nheadUp-rchild = NULL;DagNode *nheadDown = new DagNode;nheadDown-next = NULL;nheadDown-lchild = NULL;nheadDown-rchild = NULL;std:list:iterator iter1,iter2,iter3;/if(/5補(bǔ)充語(yǔ)句)if(!list_Dag.empty()for(iter1 = list_Dag.begin(),iter3 = (-list_Dag.end(); ite

13、r1 != iter3; -iter3) / 從鏈表頭 部開(kāi)始掃描nheadDown = (*iter3)-next;while(nheadDown != NULL)iter2 = list_Dag.begin();while(iter3 != iter2)從鏈表下一個(gè)結(jié)點(diǎn)開(kāi)始掃描nheadUp = (*iter2)-next;while(nheadUp != NULL)if(nheadUp-bsf = nheadDown-bsf | nheadUp-var = nheadDown-bsf)nheadUp-var = nheadDown-var;nheadDown-flag = 1;nhead

14、Up-lchild = nheadDown-lchild;nheadUp-rchild = nheadDown-rchild;nheadUp = nheadUp-next;+iter2;nheadDown = nheadDown-next;void PaintFunction(DagNode *node)/ 畫(huà)出 DAG 結(jié)點(diǎn)string Tbsf,Tvar;Tbsf = node-bsf;if(node-var !=)cout varlchild != NULL)cout lchild-bsfrchild != NULL)cout rchild-bsft;elsecout葉子節(jié)點(diǎn);coutT

15、bsftt;coutflag = 2;void Paint(DagNode *node) / 繪制 DAG 圖PaintFunction(node);if(node-lchild != NULL)Paint(node-lchild);if(node-rchild != NULL)Paint(node-rchild);elsereturn;void PaintTwo(DagNode *node) / 繪制 DAG 圖的分隔部分if(node-lchild != NULL)Paint(node-lchild);if(node-rchild != NULL)Paint(node-rchild);elsereturn; int main(int argc, char* argv) do_i

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論