實驗三語義分析報告-.._第1頁
實驗三語義分析報告-.._第2頁
實驗三語義分析報告-.._第3頁
實驗三語義分析報告-.._第4頁
實驗三語義分析報告-.._第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、編譯原理實驗報告實驗名稱:實驗類型:9指導(dǎo)教師:專業(yè)班級:姓 名:學(xué) 號:實驗地點:實驗成績:日期:2016年 6月 3日實驗三 分析調(diào)試語義分析程序一、實驗?zāi)康耐ㄟ^分析調(diào)試 TEST 語言的語義分析和中間代碼生成程序, 加深對語法制導(dǎo)翻譯思想的 理解,掌握將語法分析所識別的語法范疇變換為中間代碼的語義翻譯方法。二、實驗知識1. 語法制導(dǎo)基本思想語法制導(dǎo)就是對文法中的每個產(chǎn)生式都附加一個語義動作或語義子程序, 且在語法分析 過程中, 每當(dāng)需要使用一個產(chǎn)生式進行推導(dǎo)或歸約時, 語法分析程序除執(zhí)行相應(yīng)的語法分析 動作外,還要執(zhí)行相應(yīng)的語義動作或調(diào)用相應(yīng)的語義子程序?;舅枷胧?,根據(jù)翻譯的需要設(shè)置文

2、法符號的屬性,以描述語法結(jié)構(gòu)的語義。例如,一 個變量的屬性有類型,層次,存儲地址等。表達式的屬性有類型,值等。屬性值的計算和產(chǎn) 生式相聯(lián)系。隨著語法分析的進行,執(zhí)行屬性值的計算,完成語義分析和翻譯的任務(wù)。2. 翻譯方案設(shè)計1)設(shè)計原理:在實驗二的基礎(chǔ)上為文法符號引進一組屬性及相應(yīng)求值規(guī)則和動作,得 到屬性翻譯文法,并引進一個符號表(包括變量名,變量數(shù)據(jù)是否有效,變量地址,變量的 具體數(shù)據(jù),數(shù)據(jù)類型等) ,在進行語法分析的同時,結(jié)合符號表完成語義分析與檢測,同時 根據(jù)屬性翻譯文法的屬性及相關(guān)動作得到中間代碼(抽象機式匯編指令) ,最后通過模擬的 抽象機運行出結(jié)果。2)設(shè)計方法:(為動作標(biāo)志,J為

3、繼承屬性,f為綜合屬性) 結(jié)合課本語法制導(dǎo)相關(guān)內(nèi)容對文法增加屬性和動作如下: 以下列出有修改的屬性翻譯文法: J vartablep,datap,codep int ID f nname-def J n,t;其中動作符號的含義如下name-def J n,t:插入符號表; t if ()BRF f label1BR f label2 SETIabel J label1| if () BRF f label1BR f label2 SETlabel J label1else SETlabel J label2其中動作符號的含義如下BRFf label1 :輸出 BRF label1;BR f l

4、abel2 :輸出 BR label2 ;SETlabel J label1 :設(shè)置標(biāo)號 label1 ;SETlabel J label2 :設(shè)置標(biāo)號 label2 ; t whileSETlabel f label1() BRF f label2BR J label1 SETlabel J label2其中動作符號的含義如下SETIabel f labell :設(shè)置標(biāo)號 labell ;BRF f label2 :輸出 BRF label2 ;BR J labell :輸出 BR labell ;SETlabel J label2 :設(shè)置標(biāo)號 label2 ; t for (POP;SET

5、Iabel f label1BRF f label2BR f label3;SETlabel f label4 POPBR J label1) SETlabel J label3 BR J label4SETlabel J label2其中動作符號的含義如下SETlabel J label1 :設(shè)置標(biāo)號 label1 ; BRFf label2 :輸出 BRF label2; BR f Iabel3 :輸出 BR label3 ;SETlabel J label4 :設(shè)置標(biāo)號 label4 ;BR f label1 :輸出 BR label1 ;SETlabel J label3 :設(shè)置標(biāo)號

6、label3 ;BR f label4 :輸出 BR label4 ;SETlabel J label2 :設(shè)置標(biāo)號 label2 ; t write OUT;其中動作符號的含義如下 OUT :輸出 OUT t read IDf n LOOKJ nf d INSTO J dPOP;其中動作符號的含義如下LOOK J n f d:查符號表n,給出變量地址 d;沒有,變量沒定義; IN :輸出 IN ;STO J d:輸出指令代碼 STO d;POP:將棧頂元素出棧 t ID f nLOOK J nf dASSIGN=STO J dPOP |其中動作符號的含義如下LOOK J n f d:查符號表

7、n,給出變量地址 d;沒有,變量沒定義;ASSIGN :記住當(dāng)前文件位置;STO J d:輸出指令代碼 STO d; t |GT|LES|=GE|=LE|=EQ|!=NOTEQ其中動作符號的含義如下GT:次棧頂與棧頂作大于比較;LES :次棧頂與棧頂作小于比較;GE :次棧頂與棧頂作大于等于比較;LE :次棧頂與棧頂作小于等于比較;EQ:次棧頂與棧頂作等于比較;NOTEQ :次棧頂與棧頂作不等于比較;B t +BADD 卜BSUB |& t + vadditive_A ADD | - SUB | & 其中動作符號的含義如下ADD :操作數(shù)相加;SUB :操作數(shù)相減;Ct *CMULT | /C

8、DIV |& t *MULT | /DIV |&其中動作符號的含義如下MULT :操作數(shù)相乘;DIV :操作數(shù)相除;?t ()| ID f nLOOK J n f dLOAD J d |NUM fiLOADI J i其中動作符號的含義如下LOOK J n f d:查符號表n,給出變量地址d;沒有,變量沒定義;LOAD J d :將地址d的變量入棧;LOADI J i:將常量i入棧;3) 設(shè)計結(jié)果:1) t2) t vdeclaration_stat |&3) J vartablep,datap,codep tint ID f nname-defJ n,t;4) t vstateme nt|&5

9、) t | |6) tif ()BRF f label1BR f label2 SETlabelJ label1| if () BRF f label1BR f label2 SETlabel J label1else SETlabel J label27) t whileSETlabellabel1()BRF f label2 BR J label1 SETlabel J label28) t for (;SETlabel f label1BRF f label2BR f label3;SETlabel f label4 BR J label1) SETlabel J label3 BR J

10、 label29) twrite OUT;10) tread IDf n LOOK J nf d INSTO J dPOP;11) t 12) t POP;|;13) t ID f nLOOK J n f dASSIGN=STO J dPOP |14) t 15) tGT|LES|=GE|=LE|=EQ|!=NOTEQ |&16) t17) t +ADD | -SUB |&18) 19) *MULT | /DIV |&20) ()| ID f nLOOK J n f dLOAD J d |NUM f iLOADI J i三、實驗過程首先,理解書上的代碼和觀看相關(guān)的知識的據(jù)此在我之前實驗寫好的語

11、法分析基礎(chǔ)上進行修改,PPT,深入理解屬性反應(yīng)文法的作用,寫出語義分析代碼。 在語義分析里增加“不可引用未賦初值變量”的規(guī)則,在init()中增加了相關(guān)操作。、showVarTable()、checkInitValue()然后,結(jié)合棧式抽象機及其匯編指令相關(guān)命令的操作含義,模擬寫出TEST語言的抽象機模型用以運行文法生成的中間代碼。最后,寫出執(zhí)行中間代碼的虛擬機程序。最后,編寫TEST語言程序進行代碼實例測試,調(diào)試觀察運行過程及結(jié)果,并調(diào)試修改程序BUG。代碼完成后,測試、完善。/定義符號表結(jié)構(gòu),添加未賦初值記錄structchar n ame8;int address;int notInit

12、;/ 未賦初值vartablemaxvartablep; / 改符號表最多容纟內(nèi) maxvartablep 個記錄/在插入符號表動作 name-defj n, t的程序中給notlnit賦值為0, vartablevartablep. no tI nit =0;/在該函數(shù)給中判斷notlnit的值是否為0和查詢表中是否有變量名,若查詢表中有該變量名,且 not In it為0時,將該變量的n otl nit賦值為1,表示已經(jīng)判斷已經(jīng)賦值void in it(char *n ame)/ /在該函數(shù)中首先判定變量是否聲明,再判定n otl nit的值是否為0,若變量是聲明了且n ot In it為

13、0時,則判定變量未賦初值。void check Ini tValue(char *n ame)四、實驗結(jié)果1)測試數(shù)據(jù)及結(jié)果(初始程序)3圈文件錨迥惜式童看凹鶴助凹int sum;int product;int i;lint a;for ( i =1; i=10; i = i +1)read a:sum - sum +a;product - product+a;write sum;C:Windowssyssb a丈陣 彌惜式 M(v)seomiC:Windcwssysiinx sum; int product; int i :1一一 1 a 0( mum=or i s f+ 1= 1read

14、a,sum - sum +a; product - product*a;)_write sum;write product;)2)修改后的測試數(shù)據(jù):(給sum和product賦初值)運行結(jié)果如下write product;文蟄H孺冨舊搭云型sfV)國旬囲int sum;int product:int i;int a;sum=0;product=l,for ( i =1; i=10, i = i +1)read a;sum = sum +a;product = product*a: _write sum;write product:|C:Windowssy&te3)中間代碼如下:LABEL2:L

15、OADI 0STO 0POPLOADI 1STO 1POPLOADI 1STO 2POPLABELO:LOAD 2LOADI 10 LEBRF LABEL1 BR LABELSLABEL3:LOAD 2LOADI 1ADDSTO 2POPBR LABELOIN3TOoplrmopOADOADULTTOopBR LABEL3LABEL1:LOAD 0OUTLOAD 1OUTSTOP五、討論與分析1通過實驗對課程知識點的理解實驗后知識梳理與總結(jié):通過TEST屬性文法的翻譯設(shè)計, 了解了語法制導(dǎo)的基本過程及方法, 明白了屬性文法 的基本推導(dǎo)與構(gòu)造原理,了解了不同屬性之間的傳遞關(guān)系, 動作的執(zhí)行流程,

16、也了解了棧式 抽象機及其匯編指令的執(zhí)行原理,了解了 TEST語言抽象機的原理。語法制導(dǎo):語法制導(dǎo)就是對文法中的每個產(chǎn)生式都附加一個語義動作或語義子程序,且在語法分析過程中,每當(dāng)需要使用一個產(chǎn)生式進行推導(dǎo)或歸約時,語法分析程序除執(zhí)行相應(yīng)的語法分析動作外,還要執(zhí)行相應(yīng)的語義動作或調(diào)用相應(yīng)的語義子程序。每個語義子程序都指明了相應(yīng)產(chǎn)生式中各個符號的具體含義,并規(guī)定了使用該產(chǎn)生式進行分析時所應(yīng)采取的語義動作(如傳送或處理信息、查填符號表、計算值、產(chǎn)生中間代碼等等)。這種分析模式既把語法分析與語義處理分開, 又令其平行地進行,從而在同一遍掃描中同時完成語法分析和 語義處理兩項工作。語法制導(dǎo)的屬性翻譯: 以

17、語法分析為基礎(chǔ), 伴隨語法分析的各步驟, 執(zhí)行相應(yīng)的語義動 作;具體方法如下:1 將文法符號所代表的語言成分的意思,用屬于該文法符號的屬性表示;2 用語義規(guī)則(語義規(guī)則的執(zhí)行就是語義動作 )規(guī)定產(chǎn)生式所代表的語言成分之間的關(guān) 系(即屬性之間的關(guān)系),即用語義規(guī)則實現(xiàn)屬性計算。3語義動作(語義規(guī)則的執(zhí)行):在語法分析的適當(dāng)時刻(如推導(dǎo)或歸約)執(zhí)行附在對應(yīng)產(chǎn)生式上的語義規(guī)則,以實現(xiàn) 對語言結(jié)構(gòu)語義的處理,如計算、查填符號表、生成中間代碼、發(fā)布出錯信息等。2、回答實驗指導(dǎo)書的實驗思考提出的問題。(1)語義及代碼生成程序中的符號表管理方案存在什么問題?提出改進方案。 答:按照原來書上的代碼,符號表用的

18、是數(shù)組棧, 空間上容易造成浪費或溢出,可以使 用 map 數(shù)組。但是我沒有實現(xiàn)使用map 數(shù)組。此外, 原來的代碼還沒有檢查是否賦初值, 對引用了未賦初值的變量也檢測不出來, 為 此我在符號表結(jié)構(gòu)中增加了一個 int 類型的變量 notInit 來標(biāo)記變量是否賦初值。( 2)給出 產(chǎn)生式所添加的動作含義。答: J vartablep,datap,codep int ID f nname-defj n,t;其中動作符號的含義如下 :name-def J n,t:插入符號表;(3)給出 產(chǎn)生式中所添加的動作含義。答: t()| ID f nLOOK J n f dLOAD J d |NUM f i

19、LOADI Ji其中動作符號的含義如下LOOK J n f d:查符號表n,給出變量地址d;沒有,變量沒定義; LOAD J d :將地址d的變量入棧;LOADI J i:將常量i入棧;(4)在抽象機模擬程序中是如何統(tǒng)計指令總數(shù)的?畫出流程圖并做說明答:由于抽象機使用的是書上后面的代碼進行修改的,使用的用while 循環(huán)來執(zhí)行每條指令,用 i 來統(tǒng)計指令總數(shù),將每一條指令與 code 進行比較,若兩者相同則執(zhí)行相應(yīng)的操 作。執(zhí)行操作后 i 的次數(shù)加一,從而統(tǒng)計出指令總數(shù)。流程圖如下:開始N結(jié)束i|=|= maxvartablep)printf( 符號表溢出 n);exit(0);for(i=v

20、artablep-1;i=0;i-)/ 查符號表if (strcmp(,name)=0)deal_Error( 變量重復(fù)定義 ,wordLine); break;strcpy(,name); vartablevartablep.address=datap;vartablevartablep.notInit =0;dat ap+;分配一個單元,數(shù)據(jù)區(qū)指針加1vartablep+;/查詢符號表返回地址void lookup(char *name,int *paddress)int i;for(i=0;ivartablep;i+

21、)if (strcmp(,name)=0)*paddress=vartablei.address; exit(0);deal_Error( 變量未聲明 !, wordLine); J vartablep,datap,codep int ID f nname-def J n,t; void declaration_stat()if (strcmp(int, wordType) = 0)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine); wordAll+;if (strcmp(ID, wordType) = 0)f

22、scanf(fp, %s %s %d, wordType, wordValue, &wordLine); wordAll+;name_def(wordValue);if (strcmp(;, wordType) = 0)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine); wordAll+;else deal_Error( 聲明語句缺少 ;, wordLine - 1);else deal_Error( 聲明語句 ID 錯誤 , wordLine);else deal_Error( 聲明語句缺少 int, wordLine);/*if ()

23、BRF f label1 BRf label2 SETlabelJ label1 else SETlabel J label2*/void if_stat()int es = 0, label1, label2;if (strcmp(if, wordType) = 0)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine); wordAll+;if (strcmp(, wordType) = 0)/ 讀到 if 表達式的左括號fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll

24、+; expression();if (strcmp(), wordType) = 0)/ 讀到 if 表達式的右括號label1 = labelp+;/ 用 label1 記住條件為假時要轉(zhuǎn)向的標(biāo)號 fprintf(fout, BRF LABEL%dn, label1);/ 輸出假轉(zhuǎn)移指令fscanf(fp, %s %s %d, wordType, wordValue, &wordLine); wordAll+;statement();label2 = labelp+;/ 用 label2 記住要轉(zhuǎn)向的標(biāo)號fprintf(fout, BR LABEL%dn, label2);/ 輸出無條件轉(zhuǎn)

25、移指令fprintf(fout, LABEL%d:n, label1);/ 設(shè)置 label1 記住的標(biāo)號 if (strcmp(else, wordType) = 0)/ 讀到 if 語句中的 else 部分 fscanf(fp, %s %s %d, wordType, wordValue, &wordLine); wordAll+;statement();else deal_Error( 缺少 ), wordLine);else deal_Error(if 語句缺少 (, wordLine);else deal_Error(if 語句錯誤 , wordLine);fprintf(fout,

26、 LABEL%d:n, label2);/ 設(shè)置 label2 記住的標(biāo)號/:= for(,) /* :=for (;SETIabel f Iabel1BRF f label2BR f Iabel3;SETIabel f Iabel4 BR J labell)SETlabel J IabeI3 BR J IabeI4SETIabeI J IabeI2 */ void for_stat()int IabeI1,IabeI2,IabeI3,IabeI4;if (strcmp(for, wordType) = 0) fscanf(fp, %s %s %d, wordType, wordVaIue,

27、&wordLine); wordAII+;if (strcmp(, wordType) = 0)/ 讀入 for 語句左括號fscanf(fp, %s %s %d, wordType, wordVaIue, &wordLine);wordAII+;expression();/for 語句表達式 1 判斷 fprintf(fout, POPn);if (strcmp(;, wordType) = 0)/ 讀入 for 語句的第一個條件表達式后面的 ; IabeI1 = IabeIp+;fprintf(fout, LABEL%d:n, IabeI1);/ 設(shè)置 IabeI1 標(biāo)號 fscanf(f

28、p, %s %s %d, wordType, wordVaIue, &wordLine); wordAII+;expression();/for 語句條件表達式 2IabeI2 = IabeIp+;fprintf(fout, BRF LABEL%dn, IabeI2);/ 輸出假條件轉(zhuǎn)移指令I(lǐng)abeI3 = IabeIp+;fprintf(fout, BR LABEL%dn, IabeI3);/ 輸出無條件轉(zhuǎn)移指令if (strcmp(;, wordType) = 0)/讀入 for 語句的第 二 個條件表達式后面 IabeI4 = IabeIp+;fprintf(fout, LABEL%d:

29、n, IabeI4);/ 設(shè)置 IabeI4 標(biāo)號fscanf(fp, %s %s %d, wordType, wordVaIue, &wordLine);wordAII+;expression();/for 語句條件表達式 3fprintf(fout,POPn);/fprintf(fout, BR LABEL%dn,I a be I 1 ) ; /輸出無條件轉(zhuǎn)移指令if (strcmp(), wordType) = 0)/for 語句讀入右括號fprintf(fout, LABEL%d:n, IabeI3);/ 設(shè)置 IabeI3 標(biāo)號 fscanf(fp, %s %s %d, wordTy

30、pe, wordVaIue, &wordLine); wordAII+;statement();fprintf(fout, BR LABEL%dn, IabeI4);/ 輸出無條件轉(zhuǎn)移指令fprintf(fout, LABEL%d:n, IabeI2);/ 設(shè)置 IabeI2 標(biāo)號eIse deaI_Error(for 語句缺少 ), wordLine);eIse deaI_Error(for 語句缺少 ;, wordLine);eIse deaI_Error(for 語句缺少 ;, wordLine);eIse deaI_Error(for 語句缺少 (, wordLine);eIse de

31、aI_Error(for 語句錯誤 , wordLine);/ t ()| ID f nLOOK J n f dLOAD J d |NUM f iLOADI J i void factor()if (strcmp(, wordType) = 0)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;expression();if (strcmp(), wordType) = 0)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;else deal_Er

32、ror(factor 缺少), wordLine);else if (strcmp(ID, wordType) = 0 | strcmp(NUM, wordType) = 0)int address; lookup(wordV alue, &address);查符號表,獲取變量地址 checkInitValue(wordValue);fprintf(fout, LOAD %dn, address);fscanf(fp, %s %s %d, wordType, wordValue, &wordLine); wordAll+;else deal_Error(factor 錯誤 , wordLine);/賦初值void init(char *name)int i;for(i=0;ivartablep;i+)if (strcmp(,name)=0&vartablei.notInit =0)vartablei.notInit = 1;es=23;變量沒有聲明 deal_Error( 變量沒有聲明 , wordLine);/顯示符號表vo

溫馨提示

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

評論

0/150

提交評論