實(shí)驗(yàn)三語義分析報告_第1頁
實(shí)驗(yàn)三語義分析報告_第2頁
實(shí)驗(yàn)三語義分析報告_第3頁
實(shí)驗(yàn)三語義分析報告_第4頁
實(shí)驗(yàn)三語義分析報告_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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

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

3、為繼承屬性,為綜合屬性)結(jié)合課本語法制導(dǎo)相關(guān)內(nèi)容對文法增加屬性和動作如下:以下列出有修改的屬性翻譯文法: <declaration_stat>vartablep,datap,codep int IDnname-defn,t;其中動作符號的含義如下 name-defn,t:插入符號表; <if_stat>if (<expr>)BRFlabel1<statement>BRlabel2 SETlabellabel1| if (<expr>) BRFlabel1<statement >BRlabel2 SETlabellabel1

4、else < statement > SETlabellabel2其中動作符號的含義如下 BRFlabel1 :輸出 BRF label1; BRlabel2:輸出 BR label2; SETlabellabel1:設(shè)置標(biāo)號label1; SETlabellabel2:設(shè)置標(biāo)號label2;<while_stat>whileSETlabellabel1(<expression>) BRFlabel2 <statement >BRlabel1 SETlabellabel2其中動作符號的含義如下SETlabellabel1:設(shè)置標(biāo)號label1;B

5、RFlabel2 :輸出 BRF label2;BRlabel1:輸出 BR label1;SETlabellabel2:設(shè)置標(biāo)號label2;<for_stat>for (<expression>POP;SETlabellabel1< expression >BRFlabel2BRlabel3;SETlabellabel4 < expression >POPBRlabel1) SETlabellabel3 < statement >BRlabel4SETlabellabel2其中動作符號的含義如下SETlabellabel1:設(shè)置標(biāo)

6、號label1; BRFlabel2 :輸出 BRF label2; BRlabel3:輸出 BR label3;SETlabellabel4:設(shè)置標(biāo)號label4;BRlabel1:輸出 BR label1;SETlabellabel3:設(shè)置標(biāo)號label3;BRlabel4:輸出 BR label4;SETlabellabel2:設(shè)置標(biāo)號label2; <write_stat>write <expression>OUT;其中動作符號的含義如下 OUT:輸出 OUT <read_stat>read IDn LOOKnd INSTOdPOP;其中動作符號的含

7、義如下LOOKnd:查符號表n,給出變量地址d; 沒有,變量沒定義;IN:輸出IN;STOd:輸出指令代碼STO d;POP:將棧頂元素出棧<expression>IDnLOOKndASSIGN=<bool_expr>STOdPOP |<bool_expr>其中動作符號的含義如下LOOKnd:查符號表n,給出變量地址d; 沒有,變量沒定義;ASSIGN:記住當(dāng)前文件位置;STOd:輸出指令代碼STO d; <bool_expr><additive_expr>|< additive_expr >><additiv

8、e_expr>GT|< additive_expr ><<additive_expr>LES|< additive_expr >>=<additive_expr >GE|< additive_expr ><=< additive_expr >LE|< additive_expr >=< additive_expr >EQ|< additive_expr >!=< additive_expr >NOTEQ其中動作符號的含義如下GT:次棧頂與棧頂作大于比較

9、;LES:次棧頂與棧頂作小于比較;GE:次棧頂與棧頂作大于等于比較;LE:次棧頂與棧頂作小于等于比較;EQ:次棧頂與棧頂作等于比較;NOTEQ:次棧頂與棧頂作不等于比較;B+<term>BADD | -<term>BSUB | <additive_A>+<term><additive_A>ADD | -<term><additive_A>SUB | 其中動作符號的含義如下ADD:操作數(shù)相加;SUB:操作數(shù)相減;C*<factor>CMULT | /<factor>CDIV | <t

10、erm_A>*<factor><term_A>MULT | /<factor><term_A>DIV | 其中動作符號的含義如下MULT:操作數(shù)相乘;DIV:操作數(shù)相除; < factor >(< expression >)| IDnLOOKndLOADd |NUMiLOADIi其中動作符號的含義如下LOOKnd:查符號表n,給出變量地址d; 沒有,變量沒定義;LOADd:將地址d的變量入棧;LOADIi:將常量i入棧;3)設(shè)計結(jié)果:1) <program><declaration_list>

11、<statement_list>2)<declaration_list><declaration_stat> <declaration_list>| 3) <declaration_stat>vartablep,datap,codep int IDnname-defn,t;4) <statement_list><statement><statement_list>| 5) <statement> <if_stat>|<while_stat>|<for_sta

12、t>|<read_stat> |<write_stat>|< compound_stat > |<expression_stat>6) <if_stat>if (<expr>)BRFlabel1<statement>BRlabel2 SETlabellabel1| if (<expr>) BRFlabel1<statement >BRlabel2 SETlabellabel1else < statement > SETlabellabel27) <while_st

13、at>whileSETlabellabel1(<expression>)BRFlabel2 <statement >BRlabel1 SETlabellabel28) <for_stat>for (<expression>SETlabellabel1< expression >BRFlabel2BRlabel3;SETlabellabel4 < expression >BRlabel1) SETlabellabel3 < statement >BRlabel29) <write_stat>wr

14、ite <expression>OUT;10) <read_stat>read IDn LOOKnd INSTOdPOP;11)<compound_stat><statement_list>12)<expression_stat>< expression >POP;|;13) <expression>IDnLOOKndASSIGN=<bool_expr>STOdPOP |<bool_expr>14) <bool_expr><additive_expr><bo

15、ol_A>15) <bool_A>><additive_expr>GT|<<additive_expr>LES|>=<additive_expr >GE|<=< additive_expr >LE|=< additive_expr >EQ|!=< additive_expr >NOTEQ | 16) < additive_expr><term><additive_A>17) <additive_A>+<term><a

16、dditive_A>ADD | -<term><additive_A>SUB | 18) < term ><factor><term_A>19) <term_A>*<factor><term_A>MULT | /<factor><term_A>DIV | 20) < factor >(< expression >)| IDnLOOKndLOADd |NUMiLOADIi三、實(shí)驗(yàn)過程首先,理解書上的代碼和觀看相關(guān)的知識的PPT,深入理解屬性反應(yīng)文法

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

18、初值vartablemaxvartablep;/改符號表最多容納maxvartablep個記錄/在插入符號表動作name-defn, t的程序中給notInit賦值為0,vartablevartablep.notInit =0;/在該函數(shù)給中判斷notInit的值是否為0和查詢表中是否有變量名,若查詢表中有該變量名,且notInit為0時,將該變量的notInit賦值為1,表示已經(jīng)判斷已經(jīng)賦值void init(char *name)/在該函數(shù)中首先判定變量是否聲明,再判定notInit的值是否為0,若變量是聲明了且notInit為0時,則判定變量未賦初值。void checkInitValu

19、e(char *name)4、 實(shí)驗(yàn)結(jié)果1) 測試數(shù)據(jù)及結(jié)果(初始程序)2) 修改后的測試數(shù)據(jù):(給sum和product賦初值)運(yùn)行結(jié)果如下3) 中間代碼如下: 五、討論與分析1、通過實(shí)驗(yàn)對課程知識點(diǎn)的理解實(shí)驗(yàn)后知識梳理與總結(jié):通過TEST屬性文法的翻譯設(shè)計,了解了語法制導(dǎo)的基本過程及方法,明白了屬性文法的基本推導(dǎo)與構(gòu)造原理,了解了不同屬性之間的傳遞關(guān)系,動作的執(zhí)行流程,也了解了棧式抽象機(jī)及其匯編指令的執(zhí)行原理,了解了TEST語言抽象機(jī)的原理。語法制導(dǎo):語法制導(dǎo)就是對文法中的每個產(chǎn)生式都附加一個語義動作或語義子程序,且在語法分析過程中,每當(dāng)需要使用一個產(chǎn)生式進(jìn)行推導(dǎo)或歸約時,語法分析程序除執(zhí)

20、行相應(yīng)的語法分析動作外,還要執(zhí)行相應(yīng)的語義動作或調(diào)用相應(yīng)的語義子程序。每個語義子程序都指明了相應(yīng)產(chǎn)生式中各個符號的具體含義,并規(guī)定了使用該產(chǎn)生式進(jìn)行分析時所應(yīng)采取的語義動作(如傳送或處理信息、查填符號表、計算值、產(chǎn)生中間代碼等等)。這種分析模式既把語法分析與語義處理分開,又令其平行地進(jìn)行,從而在同一遍掃描中同時完成語法分析和語義處理兩項(xiàng)工作。語法制導(dǎo)的屬性翻譯:以語法分析為基礎(chǔ),伴隨語法分析的各步驟,執(zhí)行相應(yīng)的語義動作;具體方法如下: 1將文法符號所代表的語言成分的意思,用屬于該文法符號的屬性表示; 2用語義規(guī)則(語義規(guī)則的執(zhí)行就是語義動作)規(guī)定產(chǎn)生式所代表的語言成分之間的關(guān)系(即屬性之間的關(guān)

21、系),即用語義規(guī)則實(shí)現(xiàn)屬性計算。 3.語義動作(語義規(guī)則的執(zhí)行): 在語法分析的適當(dāng)時刻(如推導(dǎo)或歸約)執(zhí)行附在對應(yīng)產(chǎn)生式上的語義規(guī)則,以實(shí)現(xiàn)對語言結(jié)構(gòu)語義的處理,如計算、查填符號表、生成中間代碼、發(fā)布出錯信息等。2、 回答實(shí)驗(yàn)指導(dǎo)書的實(shí)驗(yàn)思考提出的問題。(1)語義及代碼生成程序中的符號表管理方案存在什么問題?提出改進(jìn)方案。答:按照原來書上的代碼,符號表用的是數(shù)組棧,空間上容易造成浪費(fèi)或溢出,可以使用map數(shù)組。但是我沒有實(shí)現(xiàn)使用map數(shù)組。此外,原來的代碼還沒有檢查是否賦初值,對引用了未賦初值的變量也檢測不出來,為此我在符號表結(jié)構(gòu)中增加了一個int類型的變量notInit來標(biāo)記變量是否賦初值

22、。(2)給出<declaration_stat>產(chǎn)生式所添加的動作含義。答:<declaration_stat>vartablep,datap,codep int IDnname-defn,t;其中動作符號的含義如下:name-defn,t:插入符號表;(3)給出<factor>產(chǎn)生式中所添加的動作含義。答: < factor >(< expression >)| IDnLOOKndLOADd |NUMiLOADIi其中動作符號的含義如下LOOKnd:查符號表n,給出變量地址d; 沒有,變量沒定義;LOADd:將地址d的變量入棧;LO

23、ADIi:將常量i入棧;(4)在抽象機(jī)模擬程序中是如何統(tǒng)計指令總數(shù)的?畫出流程圖并做說明答:由于抽象機(jī)使用的是書上后面的代碼進(jìn)行修改的,使用的用while循環(huán)來執(zhí)行每條指令,用i來統(tǒng)計指令總數(shù),將每一條指令與code進(jìn)行比較,若兩者相同則執(zhí)行相應(yīng)的操作。執(zhí)行操作后i的次數(shù)加一,從而統(tǒng)計出指令總數(shù)。流程圖如下:開始i<codecount結(jié)束codei=LOAD| LOADIi+codei中內(nèi)容入棧棧頂指針+1codei=STOi+棧頂內(nèi)容存入data中codei=POP棧頂指針-1codei=ADD|SUB|MULT|DIV次棧頂與棧頂出棧并相加|相減|相乘|相除棧頂指針-1codei=B

24、Ri+i=codeicodei=BRFi+i=codei棧頂=0codei=EQ|NOTEQ|GT|LES|GE|LE|AND|OR次棧頂作=|!=|>|<|>=|<=|&&|棧頂?shù)慕Y(jié)果代替棧頂下面的元素棧頂指針-1codei=NOT將棧頂?shù)倪壿嬛迪喾碿odei=IN輸入數(shù)據(jù)放入棧頂棧頂指針+1codei=OUT棧頂出棧,輸出結(jié)果棧頂指針-1codei=STOP(5)如果要檢查變量在參與運(yùn)算時是否有值,應(yīng)當(dāng)如何處理?給出詳細(xì)的解決方案答:在符號表結(jié)構(gòu)中增加了一個int類型的變量notInit來標(biāo)記變量是否賦初值,當(dāng)變量聲明的時候給標(biāo)記賦值為0,當(dāng)表達(dá)式為

25、其賦初值時(如for_stat()和read_stat()),就將其變?yōu)?,在checkInitValue(char *name)函數(shù)中檢測用到的變量對應(yīng)的屬性,如果notInit是0則報錯,變量未賦值。6、 附錄:關(guān)鍵代碼(給出適當(dāng)注釋,可讀性高)TESTparse:/定義符號表結(jié)構(gòu)structchar name8;int address;int notInit;/未賦初值vartablemaxvartablep;/改符號表最多容納maxvartablep個記錄/插入符號表動作name-defn, t的程序如下:void name_def(char *name) int i,es=0;if

26、(vartablep >= maxvartablep)printf("符號表溢出n");exit(0);for(i=vartablep-1;i=0;i-)/查符號表 if (strcmp(,name)=0)deal_Error("變量重復(fù)定義",wordLine);break;strcpy(,name);vartablevartablep.address=datap;vartablevartablep.notInit =0;datap+;/分配一個單元,數(shù)據(jù)區(qū)指針加1varta

27、blep+;/查詢符號表返回地址void lookup(char *name,int *paddress)int i;for(i=0;i<vartablep;i+)if (strcmp(,name)=0)*paddress=vartablei.address;exit(0);deal_Error("變量未聲明!", wordLine);/<declaration_stat>vartablep,datap,codep int IDnname-defn,t;void declaration_stat()if (strcmp(&quo

28、t;int", wordType) = 0)fscanf(fp, "%s %s %d", wordType, wordValue, &wordLine);wordAll+;if (strcmp("ID", wordType) = 0)fscanf(fp, "%s %s %d", wordType, wordValue, &wordLine);wordAll+;name_def(wordValue);if (strcmp("", wordType) = 0)fscanf(fp, "

29、%s %s %d", wordType, wordValue, &wordLine);wordAll+;else deal_Error("聲明語句缺少;", wordLine - 1);else deal_Error("聲明語句ID錯誤", wordLine);else deal_Error("聲明語句缺少int", wordLine);/*if (<expression>)BRFlabel1 <statement > BRlabel2 SETlabellabel1 else < sta

30、tement > SETlabellabel2*/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á)式的左括號fscanf(fp, "%s %s %d", wordType, wordValue, &w

31、ordLine);wordAll+;expression();if (strcmp(")", wordType) = 0)/讀到if表達(dá)式的右括號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)

32、號fprintf(fout, " BR LABEL%dn", label2);/輸出無條件轉(zhuǎn)移指令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("缺少)", w

33、ordLine);else deal_Error("if語句缺少(", wordLine);else deal_Error("if語句錯誤", wordLine);fprintf(fout, "LABEL%d:n", label2);/設(shè)置label2記住的標(biāo)號/<for_stat>:= for(<expr>,<expr>,<expr>)<statement>/*<for_stat>:=for (<expression>SETlabellabel1&l

34、t; expression >BRFlabel2BRlabel3;SETlabellabel4 < expression >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+;

35、if (strcmp("(", wordType) = 0)/讀入for語句左括號fscanf(fp, "%s %s %d", wordType, wordValue, &wordLine);wordAll+;expression();/for語句表達(dá)式1 判斷fprintf(fout, " POPn");if (strcmp("", wordType) = 0)/讀入for語句的第一個條件表達(dá)式后面的 ""label1 = labelp+;fprintf(fout, "LAB

36、EL%d:n", label1);/設(shè)置label1標(biāo)號fscanf(fp, "%s %s %d", wordType, wordValue, &wordLine);wordAll+;expression();/for語句條件表達(dá)式 2label2 = labelp+;fprintf(fout, " BRF LABEL%dn", label2);/輸出假條件轉(zhuǎn)移指令label3 = labelp+;fprintf(fout, " BR LABEL%dn", label3);/輸出無條件轉(zhuǎn)移指令if (strcmp(&

37、quot;", wordType) = 0)/讀入for語句的第 二 個條件表達(dá)式后面的 ""label4 = labelp+;fprintf(fout, "LABEL%d:n", label4);/設(shè)置label4標(biāo)號fscanf(fp, "%s %s %d", wordType, wordValue, &wordLine);wordAll+;expression();/for語句條件表達(dá)式 3fprintf(fout, " POPn");/fprintf(fout, " BR LAB

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

39、"LABEL%d:n", label2);/設(shè)置label2標(biāo)號else deal_Error("for語句缺少)", wordLine);else deal_Error("for語句缺少;", wordLine);else deal_Error("for語句缺少;", wordLine);else deal_Error("for語句缺少(", wordLine);else deal_Error("for語句錯誤", wordLine);/< factor >(&

40、lt; expression >)| IDnLOOKndLOADd |NUMiLOADIivoid 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)

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

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論