實(shí)驗(yàn)三語(yǔ)義分析報(bào)告-_第1頁(yè)
實(shí)驗(yàn)三語(yǔ)義分析報(bào)告-_第2頁(yè)
實(shí)驗(yàn)三語(yǔ)義分析報(bào)告-_第3頁(yè)
實(shí)驗(yàn)三語(yǔ)義分析報(bào)告-_第4頁(yè)
實(shí)驗(yàn)三語(yǔ)義分析報(bào)告-_第5頁(yè)
已閱讀5頁(yè),還剩11頁(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)報(bào)告實(shí)驗(yàn)名稱:分析調(diào)試語(yǔ)義分析程序?qū)嶒?yàn)類型:驗(yàn)證型指導(dǎo)教師:專業(yè)班級(jí):姓 名:學(xué) 號(hào): 實(shí)驗(yàn)地點(diǎn):實(shí)驗(yàn)成績(jī): 日期: 2016 年 6 月 3 日 實(shí)驗(yàn)三 分析調(diào)試語(yǔ)義分析程序一、實(shí)驗(yàn)?zāi)康耐ㄟ^(guò)分析調(diào)試TEST語(yǔ)言的語(yǔ)義分析和中間代碼生成程序,加深對(duì)語(yǔ)法制導(dǎo)翻譯思想的理解,掌握將語(yǔ)法分析所識(shí)別的語(yǔ)法范疇變換為中間代碼的語(yǔ)義翻譯方法。2、 實(shí)驗(yàn)知識(shí)1.語(yǔ)法制導(dǎo)基本思想語(yǔ)法制導(dǎo)就是對(duì)文法中的每個(gè)產(chǎn)生式都附加一個(gè)語(yǔ)義動(dòng)作或語(yǔ)義子程序,且在語(yǔ)法分析過(guò)程中,每當(dāng)需要使用一個(gè)產(chǎn)生式進(jìn)行推導(dǎo)或歸約時(shí),語(yǔ)法分析程序除執(zhí)行相應(yīng)的語(yǔ)法分析動(dòng)作外,還要執(zhí)行相應(yīng)的語(yǔ)義動(dòng)作或調(diào)用相應(yīng)的語(yǔ)義子程序。基本思想是,

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

3、為繼承屬性,為綜合屬性)結(jié)合課本語(yǔ)法制導(dǎo)相關(guān)內(nèi)容對(duì)文法增加屬性和動(dòng)作如下:以下列出有修改的屬性翻譯文法: vartablep,datap,codep int IDnname-defn,t;其中動(dòng)作符號(hào)的含義如下 name-defn,t:插入符號(hào)表; if ()BRFlabel1BRlabel2 SETlabellabel1| if () BRFlabel1BRlabel2 SETlabellabel1else SETlabellabel2其中動(dòng)作符號(hào)的含義如下 BRFlabel1 :輸出 BRF label1; BRlabel2:輸出 BR label2; SETlabellabel1:設(shè)置標(biāo)

4、號(hào)label1; SETlabellabel2:設(shè)置標(biāo)號(hào)label2;whileSETlabellabel1() BRFlabel2 BRlabel1 SETlabellabel2其中動(dòng)作符號(hào)的含義如下SETlabellabel1:設(shè)置標(biāo)號(hào)label1;BRFlabel2 :輸出 BRF label2;BRlabel1:輸出 BR label1;SETlabellabel2:設(shè)置標(biāo)號(hào)label2;for (POP;SETlabellabel1BRFlabel2BRlabel3;SETlabellabel4 POPBRlabel1) SETlabellabel3 BRlabel4SETlabel

5、label2其中動(dòng)作符號(hào)的含義如下SETlabellabel1:設(shè)置標(biāo)號(hào)label1; BRFlabel2 :輸出 BRF label2; BRlabel3:輸出 BR label3;SETlabellabel4:設(shè)置標(biāo)號(hào)label4;BRlabel1:輸出 BR label1;SETlabellabel3:設(shè)置標(biāo)號(hào)label3;BRlabel4:輸出 BR label4;SETlabellabel2:設(shè)置標(biāo)號(hào)label2; write OUT;其中動(dòng)作符號(hào)的含義如下 OUT:輸出 OUT read IDn LOOKnd INSTOdPOP;其中動(dòng)作符號(hào)的含義如下LOOKnd:查符號(hào)表n,給出

6、變量地址d; 沒(méi)有,變量沒(méi)定義;IN:輸出IN;STOd:輸出指令代碼STO d;POP:將棧頂元素出棧IDnLOOKndASSIGN=STOdPOP |其中動(dòng)作符號(hào)的含義如下LOOKnd:查符號(hào)表n,給出變量地址d; 沒(méi)有,變量沒(méi)定義;ASSIGN:記住當(dāng)前文件位置;STOd:輸出指令代碼STO d; |GT|LES|=GE|=LE|=EQ|!=NOTEQ其中動(dòng)作符號(hào)的含義如下GT:次棧頂與棧頂作大于比較;LES:次棧頂與棧頂作小于比較;GE:次棧頂與棧頂作大于等于比較;LE:次棧頂與棧頂作小于等于比較;EQ:次棧頂與棧頂作等于比較;NOTEQ:次棧頂與棧頂作不等于比較;B+BADD | -

7、BSUB | +ADD | -SUB | 其中動(dòng)作符號(hào)的含義如下ADD:操作數(shù)相加;SUB:操作數(shù)相減;C*CMULT | /CDIV | *MULT | /DIV | 其中動(dòng)作符號(hào)的含義如下MULT:操作數(shù)相乘;DIV:操作數(shù)相除; ()| IDnLOOKndLOADd |NUMiLOADIi其中動(dòng)作符號(hào)的含義如下LOOKnd:查符號(hào)表n,給出變量地址d; 沒(méi)有,變量沒(méi)定義;LOADd:將地址d的變量入棧;LOADIi:將常量i入棧;3)設(shè)計(jì)結(jié)果:1) 2) | 3) vartablep,datap,codep int IDnname-defn,t;4) | 5) | | |6) if ()

8、BRFlabel1BRlabel2 SETlabellabel1| if () BRFlabel1BRlabel2 SETlabellabel1else SETlabellabel27) whileSETlabellabel1()BRFlabel2 BRlabel1 SETlabellabel28) for (;SETlabellabel1BRFlabel2BRlabel3;SETlabellabel4 BRlabel1) SETlabellabel3 BRlabel29) write OUT;10) read IDn LOOKnd INSTOdPOP;11)12)POP;|;13) IDnL

9、OOKndASSIGN=STOdPOP |14) 15) GT|LES|=GE|=LE|=EQ|!=NOTEQ | 16) 17) +ADD | -SUB | 18) 19) *MULT | /DIV | 20) ()| IDnLOOKndLOADd |NUMiLOADIi三、實(shí)驗(yàn)過(guò)程首先,理解書上的代碼和觀看相關(guān)的知識(shí)的PPT,深入理解屬性反應(yīng)文法的作用,據(jù)此在我之前實(shí)驗(yàn)寫好的語(yǔ)法分析基礎(chǔ)上進(jìn)行修改,寫出語(yǔ)義分析代碼。在語(yǔ)義分析里增加“不可引用未賦初值變量”的規(guī)則,在init()、showVarTable()、checkInitValue()中增加了相關(guān)操作。然后,結(jié)合棧式抽象機(jī)及其匯編指令

10、相關(guān)命令的操作含義,模擬寫出TEST語(yǔ)言的抽象機(jī)模型用以運(yùn)行文法生成的中間代碼。最后,寫出執(zhí)行中間代碼的虛擬機(jī)程序。最后,編寫TEST語(yǔ)言程序進(jìn)行代碼實(shí)例測(cè)試,調(diào)試觀察運(yùn)行過(guò)程及結(jié)果,并調(diào)試修改程序BUG。代碼完成后,測(cè)試、完善。/定義符號(hào)表結(jié)構(gòu),添加未賦初值記錄structchar name8;int address;int notInit;/未賦初值vartablemaxvartablep;/改符號(hào)表最多容納maxvartablep個(gè)記錄/在插入符號(hào)表動(dòng)作name-defn, t的程序中給notInit賦值為0,vartablevartablep.notInit =0;/在該函數(shù)給中判斷n

11、otInit的值是否為0和查詢表中是否有變量名,若查詢表中有該變量名,且notInit為0時(shí),將該變量的notInit賦值為1,表示已經(jīng)判斷已經(jīng)賦值void init(char *name)/在該函數(shù)中首先判定變量是否聲明,再判定notInit的值是否為0,若變量是聲明了且notInit為0時(shí),則判定變量未賦初值。void checkInitValue(char *name)4、 實(shí)驗(yàn)結(jié)果1) 測(cè)試數(shù)據(jù)及結(jié)果(初始程序)2) 修改后的測(cè)試數(shù)據(jù):(給sum和product賦初值)運(yùn)行結(jié)果如下3) 中間代碼如下: 五、討論與分析1、通過(guò)實(shí)驗(yàn)對(duì)課程知識(shí)點(diǎn)的理解實(shí)驗(yàn)后知識(shí)梳理與總結(jié):通過(guò)TEST屬性文

12、法的翻譯設(shè)計(jì),了解了語(yǔ)法制導(dǎo)的基本過(guò)程及方法,明白了屬性文法的基本推導(dǎo)與構(gòu)造原理,了解了不同屬性之間的傳遞關(guān)系,動(dòng)作的執(zhí)行流程,也了解了棧式抽象機(jī)及其匯編指令的執(zhí)行原理,了解了TEST語(yǔ)言抽象機(jī)的原理。語(yǔ)法制導(dǎo):語(yǔ)法制導(dǎo)就是對(duì)文法中的每個(gè)產(chǎn)生式都附加一個(gè)語(yǔ)義動(dòng)作或語(yǔ)義子程序,且在語(yǔ)法分析過(guò)程中,每當(dāng)需要使用一個(gè)產(chǎn)生式進(jìn)行推導(dǎo)或歸約時(shí),語(yǔ)法分析程序除執(zhí)行相應(yīng)的語(yǔ)法分析動(dòng)作外,還要執(zhí)行相應(yīng)的語(yǔ)義動(dòng)作或調(diào)用相應(yīng)的語(yǔ)義子程序。每個(gè)語(yǔ)義子程序都指明了相應(yīng)產(chǎn)生式中各個(gè)符號(hào)的具體含義,并規(guī)定了使用該產(chǎn)生式進(jìn)行分析時(shí)所應(yīng)采取的語(yǔ)義動(dòng)作(如傳送或處理信息、查填符號(hào)表、計(jì)算值、產(chǎn)生中間代碼等等)。這種分析模式既把

13、語(yǔ)法分析與語(yǔ)義處理分開(kāi),又令其平行地進(jìn)行,從而在同一遍掃描中同時(shí)完成語(yǔ)法分析和語(yǔ)義處理兩項(xiàng)工作。語(yǔ)法制導(dǎo)的屬性翻譯:以語(yǔ)法分析為基礎(chǔ),伴隨語(yǔ)法分析的各步驟,執(zhí)行相應(yīng)的語(yǔ)義動(dòng)作;具體方法如下: 1將文法符號(hào)所代表的語(yǔ)言成分的意思,用屬于該文法符號(hào)的屬性表示; 2用語(yǔ)義規(guī)則(語(yǔ)義規(guī)則的執(zhí)行就是語(yǔ)義動(dòng)作)規(guī)定產(chǎn)生式所代表的語(yǔ)言成分之間的關(guān)系(即屬性之間的關(guān)系),即用語(yǔ)義規(guī)則實(shí)現(xiàn)屬性計(jì)算。 3.語(yǔ)義動(dòng)作(語(yǔ)義規(guī)則的執(zhí)行): 在語(yǔ)法分析的適當(dāng)時(shí)刻(如推導(dǎo)或歸約)執(zhí)行附在對(duì)應(yīng)產(chǎn)生式上的語(yǔ)義規(guī)則,以實(shí)現(xiàn)對(duì)語(yǔ)言結(jié)構(gòu)語(yǔ)義的處理,如計(jì)算、查填符號(hào)表、生成中間代碼、發(fā)布出錯(cuò)信息等。2、 回答實(shí)驗(yàn)指導(dǎo)書的實(shí)驗(yàn)思考提出

14、的問(wèn)題。(1)語(yǔ)義及代碼生成程序中的符號(hào)表管理方案存在什么問(wèn)題?提出改進(jìn)方案。答:按照原來(lái)書上的代碼,符號(hào)表用的是數(shù)組棧,空間上容易造成浪費(fèi)或溢出,可以使用map數(shù)組。但是我沒(méi)有實(shí)現(xiàn)使用map數(shù)組。此外,原來(lái)的代碼還沒(méi)有檢查是否賦初值,對(duì)引用了未賦初值的變量也檢測(cè)不出來(lái),為此我在符號(hào)表結(jié)構(gòu)中增加了一個(gè)int類型的變量notInit來(lái)標(biāo)記變量是否賦初值。(2)給出產(chǎn)生式所添加的動(dòng)作含義。答:vartablep,datap,codep int IDnname-defn,t;其中動(dòng)作符號(hào)的含義如下:name-defn,t:插入符號(hào)表;(3)給出產(chǎn)生式中所添加的動(dòng)作含義。答: ()| IDnLOOKn

15、dLOADd |NUMiLOADIi其中動(dòng)作符號(hào)的含義如下LOOKnd:查符號(hào)表n,給出變量地址d; 沒(méi)有,變量沒(méi)定義;LOADd:將地址d的變量入棧;LOADIi:將常量i入棧;(4)在抽象機(jī)模擬程序中是如何統(tǒng)計(jì)指令總數(shù)的?畫出流程圖并做說(shuō)明答:由于抽象機(jī)使用的是書上后面的代碼進(jìn)行修改的,使用的用while循環(huán)來(lái)執(zhí)行每條指令,用i來(lái)統(tǒng)計(jì)指令總數(shù),將每一條指令與code進(jìn)行比較,若兩者相同則執(zhí)行相應(yīng)的操作。執(zhí)行操作后i的次數(shù)加一,從而統(tǒng)計(jì)出指令總數(shù)。流程圖如下:開(kāi)始i|=|= maxvartablep)printf(符號(hào)表溢出n);exit(0);for(i=vartablep-1;i=0;i

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

17、,name)=0)*paddress=vartablei.address;exit(0);deal_Error(變量未聲明!, wordLine);/vartablep,datap,codep int IDnname-defn,t;void declaration_stat()if (strcmp(int, wordType) = 0)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;if (strcmp(ID, wordType) = 0)fscanf(fp, %s %s %d, wordType, wor

18、dValue, &wordLine);wordAll+;name_def(wordValue);if (strcmp(;, wordType) = 0)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;else deal_Error(聲明語(yǔ)句缺少;, wordLine - 1);else deal_Error(聲明語(yǔ)句ID錯(cuò)誤, wordLine);else deal_Error(聲明語(yǔ)句缺少int, wordLine);/*if ()BRFlabel1 BRlabel2 SETlabellabel1 else SETl

19、abellabel2*/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表達(dá)式的左括號(hào)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;expression();if (strcmp(), wordType) = 0)/讀到if表達(dá)式的右括號(hào)la

20、bel1 = labelp+;/用label1記住條件為假時(shí)要轉(zhuǎn)向的標(biāo)號(hà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)號(hào)fprintf(fout, BR LABEL%dn, label2);/輸出無(wú)條件轉(zhuǎn)移指令fprintf(fout, LABEL%d:n, label1);/設(shè)置label1記住的標(biāo)號(hào)if (strcmp(else, word

21、Type) = 0)/讀到if語(yǔ)句中的else部分fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;statement();else deal_Error(缺少), wordLine);else deal_Error(if語(yǔ)句缺少(, wordLine);else deal_Error(if語(yǔ)句錯(cuò)誤, wordLine);fprintf(fout, LABEL%d:n, label2);/設(shè)置label2記住的標(biāo)號(hào)/:= for(,)/*:=for (;SETlabellabel1BRFlabel2BRlabel3;SE

22、Tlabellabel4 BRlabel1) SETlabellabel3 BRlabel4SETlabellabel2 */void for_stat()int label1,label2,label3,label4; if (strcmp(for, wordType) = 0)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;if (strcmp(, wordType) = 0)/讀入for語(yǔ)句左括號(hào)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAl

23、l+;expression();/for語(yǔ)句表達(dá)式1 判斷fprintf(fout, POPn);if (strcmp(;, wordType) = 0)/讀入for語(yǔ)句的第一個(gè)條件表達(dá)式后面的 ;label1 = labelp+;fprintf(fout, LABEL%d:n, label1);/設(shè)置label1標(biāo)號(hào)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;expression();/for語(yǔ)句條件表達(dá)式 2label2 = labelp+;fprintf(fout, BRF LABEL%dn, label2)

24、;/輸出假條件轉(zhuǎn)移指令label3 = labelp+;fprintf(fout, BR LABEL%dn, label3);/輸出無(wú)條件轉(zhuǎn)移指令if (strcmp(;, wordType) = 0)/讀入for語(yǔ)句的第 二 個(gè)條件表達(dá)式后面的 ;label4 = labelp+;fprintf(fout, LABEL%d:n, label4);/設(shè)置label4標(biāo)號(hào)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;expression();/for語(yǔ)句條件表達(dá)式 3fprintf(fout, POPn);/fprin

25、tf(fout, BR LABEL%dn, label1);/輸出無(wú)條件轉(zhuǎn)移指令if (strcmp(), wordType) = 0)/for語(yǔ)句讀入右括號(hào)fprintf(fout, LABEL%d:n, label3);/設(shè)置label3標(biāo)號(hào)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;statement();fprintf(fout, BR LABEL%dn, label4);/輸出無(wú)條件轉(zhuǎn)移指令fprintf(fout, LABEL%d:n, label2);/設(shè)置label2標(biāo)號(hào)else deal_Erro

26、r(for語(yǔ)句缺少), wordLine);else deal_Error(for語(yǔ)句缺少;, wordLine);else deal_Error(for語(yǔ)句缺少;, wordLine);else deal_Error(for語(yǔ)句缺少(, wordLine);else deal_Error(for語(yǔ)句錯(cuò)誤, wordLine);/()| IDnLOOKndLOADd |NUMiLOADIivoid factor()if (strcmp(, wordType) = 0)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;ex

27、pression();if (strcmp(), wordType) = 0)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;else deal_Error(factor缺少), wordLine);else if (strcmp(ID, wordType) = 0 | strcmp(NUM, wordType) = 0)int address;lookup(wordValue, &address);/查符號(hào)表,獲取變量地址checkInitValue(wordValue);fprintf(fout, LOAD %dn

28、, address);fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;else deal_Error(factor錯(cuò)誤, wordLine);/賦初值void init(char *name)int i;for(i=0;ivartablep;i+)if (strcmp(,name)=0&vartablei.notInit =0)vartablei.notInit = 1;/es=23;/變量沒(méi)有聲明deal_Error(變量沒(méi)有聲明, wordLine);/顯示符號(hào)表void showVarTable()int i;printf(tt符號(hào)表n);printf(tt名字tt地址tt是否初值n);for(i=0;ivartablep;i+)printf(tt%s

溫馨提示

  • 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)論