廣工2014編譯原理實(shí)驗(yàn)報(bào)告.doc_第1頁(yè)
廣工2014編譯原理實(shí)驗(yàn)報(bào)告.doc_第2頁(yè)
廣工2014編譯原理實(shí)驗(yàn)報(bào)告.doc_第3頁(yè)
廣工2014編譯原理實(shí)驗(yàn)報(bào)告.doc_第4頁(yè)
廣工2014編譯原理實(shí)驗(yàn)報(bào)告.doc_第5頁(yè)
已閱讀5頁(yè),還剩8頁(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)介

實(shí) 驗(yàn) 報(bào) 告 課程名稱 編譯原理 題目名稱 PL/0編譯器的擴(kuò)充 學(xué)生學(xué)院 計(jì)算機(jī)學(xué)院 專業(yè)班級(jí) 計(jì)算機(jī)科學(xué)與技術(shù)12(4)學(xué) 號(hào) 3112005901 學(xué)生姓名 柏石先 指導(dǎo)教師 李楊 程序功能完成情況測(cè)試用例全面程度學(xué)生對(duì)所編程序熟悉程度報(bào)告格式是否與要求相符報(bào)告內(nèi)容是否準(zhǔn)確、全面2014 年 12 月 20日一、 實(shí)驗(yàn)?zāi)康呐c要求對(duì)PL/0作以下修改擴(kuò)充:(1) 增加單詞:保留字 ELSE,F(xiàn)OR,STEP,UNTIL,DO,RETURN運(yùn)算符 *=,/=,&,|,!(2)修改單詞:不等號(hào)# 改為 (3)增加條件語(yǔ)句的ELSE子句,要求:寫出相關(guān)文法,語(yǔ)法描述圖,語(yǔ)義描述圖。二、 實(shí)驗(yàn)環(huán)境與工具1、源語(yǔ)言:PL/0語(yǔ)言,PL/0語(yǔ)言是PASCAL語(yǔ)言的子集,它的編譯程序是一個(gè)編譯解析執(zhí)行系統(tǒng),后綴名為.PL0;2、目標(biāo)語(yǔ)言:生成文件后綴為*.COD的目標(biāo)代碼3、實(shí)現(xiàn)平臺(tái):Borland C+Builder 64、運(yùn)行平臺(tái):Windows 8.1三、 結(jié)構(gòu)流程1、 結(jié)構(gòu)設(shè)計(jì)說(shuō)明(1)PL/0 語(yǔ)言編譯器 PL/0語(yǔ)言可看成是PASCAL語(yǔ)言的子集,它的編譯程序是一個(gè)編譯解釋執(zhí)行系統(tǒng)。PL/0的目標(biāo)程序?yàn)榧傧霔J接?jì)算機(jī)的匯編語(yǔ)言,與具體計(jì)算機(jī)無(wú)關(guān)。出錯(cuò)處理函數(shù)表格管理函數(shù)PL/0 源程序目標(biāo)代碼生成程序程序目標(biāo)代碼生成程序程序目標(biāo)代碼生成程序程序目標(biāo)代碼生成程序程序目標(biāo)代碼生成程序程序 2、 詞法分析程序的設(shè)計(jì)四、 開(kāi)發(fā)過(guò)程(一) 增加單詞:保留字 ELSE,F(xiàn)OR,STEP,UNTIL,DO , RETURN運(yùn)算符 *=,/=,&,|,!新增6個(gè)保留字和5個(gè)運(yùn)算符,合計(jì)11個(gè)單詞。其中保留字ELSE,F(xiàn)OR,STEP,UNTIL,DO, RETURN 分別對(duì)應(yīng)ELSESYM,FORSYM, STEPSYM, UNTILSYM,DOSYM,RETURNSYM;運(yùn)算符 *= ,/= ,& ,| , ! 分別對(duì)應(yīng) TIMESBECOMES, SLASHBECOMES, ANDSYM, ORSYM, NOTSYM。注:要求只做詞法分析部分,不做語(yǔ)義分析處理,實(shí)驗(yàn)的結(jié)果只是識(shí)別新增的保留字和運(yùn)算符,并且將其打印顯示出來(lái)。運(yùn)算符*=/=&|!SYM表示TIMESBECOMESSLASHBECOMESANDSYMORSYMNOTSYM1 首先考慮需要增加保留字的個(gè)數(shù),以及如何命名,再將新增的保留字添加對(duì)應(yīng)的保留字的集合中。具體實(shí)現(xiàn)的語(yǔ)句如下所示:typedef enum NUL, IDENT, NUMBER, PLUS, MINUS, TIMES, SLASH, ODDSYM, EQL, NEQ, LSS, LEQ, GTR, GEQ, LPAREN, RPAREN, COMMA, SEMICOLON, PERIOD, BECOMES, BEGINSYM, ENDSYM, IFSYM, THENSYM, WHILESYM, WRITESYM, READSYM, DOSYM, CALLSYM, CONSTSYM, VARSYM, PROCSYM, PROGSYM, ELSESYM, FORSYM, STEPSYM, STEPSYM, RETURNSYM, TIMESBECOMES, SLASHBECOMES, ANDSYM, ORSYM, NOTSYM SYMBOL;2 這里需要注意,一定要參照已有的保留字,進(jìn)行相應(yīng)的命名和添加規(guī)范。具體實(shí)現(xiàn)的語(yǔ)句如下所示:char *SYMOUT = NUL, IDENT, NUMBER, PLUS, MINUS, TIMES, SLASH, ODDSYM, EQL, NEQ, LSS, LEQ, GTR, GEQ, LPAREN, RPAREN, COMMA, SEMICOLON, PERIOD, BECOMES, BEGINSYM, ENDSYM, IFSYM, THENSYM, WHILESYM, WRITESYM, READSYM, DOSYM, CALLSYM, CONSTSYM, VARSYM, PROCSYM, PROGSYM, ELSESYM, FORSYM, STEPSYM, STEPSYM, RETURNSYM, TIMESBECOMES, SLASHBECOMES, ANDSYM, ORSYM, NOTSYM ;3 將新增的保留字按照字母表升序的方式添加,運(yùn)算符參照已有的運(yùn)算符來(lái)進(jìn)行添加,注意好符號(hào)與SYM的對(duì)應(yīng)。具體實(shí)現(xiàn)的語(yǔ)句如下所示:特別注意點(diǎn):此處一定要考慮到PLO編譯器采用了折半查找算法來(lái)進(jìn)行操作,如果新增的保留字沒(méi)有按照既定的升序規(guī)則來(lái)插入,會(huì)造成在編譯過(guò)程中,編譯器無(wú)法識(shí)別某些保留字。strcpy(KWORD 1,BEGIN); strcpy(KWORD 2,CALL); strcpy(KWORD 3,CONST); strcpy(KWORD 4,DO); strcpy(KWORD 5,ELSE); strcpy(KWORD 6,END); strcpy(KWORD 7,FOR); strcpy(KWORD 8,IF); strcpy(KWORD 9,ODD); strcpy(KWORD 10,PROCEDURE); strcpy(KWORD 11,PROGRAM); strcpy(KWORD12,READ); strcpy(KWORD13,RETURN); strcpy(KWORD14,STEP); strcpy(KWORD15,THEN); strcpy(KWORD16,UNTIL); strcpy(KWORD17,VAR); strcpy(KWORD18,WHILE); strcpy(KWORD19,WRITE); WSYM 1=BEGINSYM; WSYM 2=CALLSYM; WSYM 3=CONSTSYM; WSYM 4=DOSYM; WSYM 5=ELSESYM; /*增加保留字符號(hào)elsesym*/ WSYM 6=ENDSYM; WSYM 7=FORSYM; WSYM 8=IFSYM; WSYM 9=ODDSYM; WSYM 10=PROCSYM; WSYM 11=PROGSYM; WSYM12=READSYM; WSYM13=RETURNSYM; WSYM14=STEPSYM; WSYM15=THENSYM; WSYM16=UNTILSYM; WSYM17=VARSYM; WSYM18=WHILESYM; WSYM19=WRITESYM; SSYM+=PLUS; SSYM-=MINUS; SSYM*=TIMES; SSYM/=SLASH; SSYM(=LPAREN; SSYM)=RPAREN; SSYM=EQL; SSYM,=COMMA; SSYM.=PERIOD; SSYM;=SEMICOLON; SSYM&=ANDSYM; SSYM!=NOTSYM;4 在完成保留字的添加以后,在void STATEMENT(SYMSET FSYS,int LEV,int &TX)函數(shù)中增加相應(yīng)的語(yǔ)句,注意滿足語(yǔ)法規(guī)則。這是用來(lái)檢驗(yàn)保留字是否添加成功的標(biāo)志。具體實(shí)現(xiàn)的語(yǔ)句如下所示:case FORSYM: GetSym(); Form1-printfs(保留字:FORSYM); break;case STEPSYM: GetSym(); Form1-printfs(保留字:STEPSYM); break;case UNTILSYM: GetSym(); Form1-printfs(保留字:UNTILSYM); break;case RETURNSYM: GetSym(); Form1-printfs(保留字:RETURNSYM); break;case DOSYM: GetSym(); Form1-printfs(保留字:DOSYM); break; 5 新增的運(yùn)算符需要被編譯器識(shí)別,必須滿足編譯器做詞法分析時(shí),能夠正確得到對(duì)于的SYM,因此在GetSym()函數(shù)中在相應(yīng)位置增加相應(yīng)的運(yùn)算符分析判斷,具體實(shí)現(xiàn)如下面所示的語(yǔ)句:else if (CH=:) GetCh();if (CH=) SYM=BECOMES; GetCh(); else SYM=NUL; else if(CH = *) GetCh(); if(CH = =) SYM = TIMESBECOMES; GetCh(); else SYM=SSYM*; else if(CH = /) GetCh(); if(CH = =) SYM = SLASHBECOMES; GetCh(); else SYM=SSYM/; else /* THE FOLLOWING TWO CHECK WERE ADDED BECAUSE ASCII DOES NOT HAVE A SINGLE CHARACTER FOR = */ if (CH=) SYM=NEQ; GetCh(); /不等號(hào)加 else SYM=LSS;else if (CH=) GetCh(); if (CH=) SYM=GEQ; GetCh(); else SYM=GTR; else if (CH=&) SYM=ANDSYM; GetCh(); else if (CH=|) GetCh(); if (CH=|) SYM=ORSYM; GetCh(); else Error(19); else if (CH=!) SYM=NOTSYM; GetCh(); else SYM=SSYMCH; GetCh(); 6 完成運(yùn)算符語(yǔ)義分析之后,按照增加保留字的方法一樣,同樣在void STATEMENT(SYMSET FSYS,int LEV,int &TX)函數(shù)中增加相應(yīng)語(yǔ)句,這是用來(lái)檢驗(yàn)運(yùn)算符是否添加成功的標(biāo)志。具體實(shí)現(xiàn)的語(yǔ)句如下所示:case TIMESBECOMES: GetSym(); Form1-printfs(運(yùn)算符:*= ); break; case SLASHBECOMES: GetSym(); Form1-printfs(運(yùn)算符: /= ); break; case ANDSYM: GetSym(); Form1-printfs(運(yùn)算符:& ); break; case ORSYM: GetSym(); Form1-printfs(運(yùn)算符:| ); break; case NOTSYM: GetSym(); Form1-printfs(運(yùn)算符:! ); break;7 特別需要注意的兩點(diǎn),這個(gè)是很容易被忽略的地方,就是在完成保留字和運(yùn)算符的增加以后,一定要對(duì)PLO編譯器對(duì)保留字個(gè)數(shù)已經(jīng)單詞總數(shù)定義進(jìn)行相應(yīng)的修改。保留字總數(shù)比如說(shuō)在不添加任何保留字的情況下,PL0編譯器的原保留字應(yīng)該是14個(gè),所以在Unit1.CPP中有定義const NORW = 14; /* # OF RESERVED WORDS */而在實(shí)驗(yàn)中因?yàn)樾略黾颖A糇?個(gè),故此處應(yīng)改為:const NORW = 19; /* # OF RESERVED WORDS */單詞總數(shù)與保留字總數(shù)一樣,我們?cè)黾油瓯A糇趾瓦\(yùn)算符以后,要修改單詞總是,比如原單詞總數(shù)是33,因?yàn)樵幾g器中并未定義一個(gè)常量來(lái)進(jìn)行統(tǒng)一管理,所以需要對(duì)所有“i33”的地方進(jìn)行修改。因?yàn)閷?shí)驗(yàn)中新增加單詞10個(gè),故應(yīng)改為“i43”。(二) 修改運(yùn)算符:不等號(hào) # 改為 1. 因?yàn)樵鹊牟坏扔谠诰幾g器中是用單字符#表示的,如今改成的雙字符形式,所以需要做的詞法分析過(guò)程不一樣。首先把源代碼中的程序段 SSYM#=NEQ; 語(yǔ)句刪除或注釋消去。 2. 在GetSym()過(guò)程中把分析到的定義為不等號(hào),從“”的if判斷語(yǔ)句進(jìn)行相應(yīng)的修改。 else /* THE FOLLOWING TWO CHECK WERE ADDED BECAUSE ASCII DOES NOT HAVE A SINGLE CHARACTER FOR = */ if (CH=) SYM=NEQ; GetCh(); /更改不等號(hào)為“” else SYM=LSS;(三) 增加條件語(yǔ)句的ELSE子句,要求:寫出相關(guān)文法,語(yǔ)法圖,語(yǔ)義規(guī)則。1. 相關(guān)文法規(guī)則G(S): Sif S else S | if S | a2. 語(yǔ)法描述圖3. IFELSE語(yǔ)句的語(yǔ)義分析4. 代碼修改首先明白if語(yǔ)句的處理,按if語(yǔ)句的語(yǔ)法,首先調(diào)用邏輯表達(dá)式處理過(guò)程處理if語(yǔ)句的條件,把相應(yīng)的真假值放到數(shù)據(jù)棧頂。接下去記錄下代碼段分配位置(即下面生成的jpc指令的位置),然后生成條件轉(zhuǎn)移jpc指令(遇0或遇假轉(zhuǎn)移),轉(zhuǎn)移地址未知暫時(shí)填0。然后調(diào)用語(yǔ)句處理過(guò)程處理then語(yǔ)句后面的語(yǔ)句或語(yǔ)句塊。then后的語(yǔ)句處理完后,當(dāng)前代碼段分配指針的位置就應(yīng)該是上面的jpc指令的轉(zhuǎn)移位置。通過(guò)前面記錄下的jpc指令的位置,把它的跳轉(zhuǎn)位置改成當(dāng)前的代碼段指針位置。在void STATEMENT(SYMSET FSYS,int LEV,int &TX)中加入ELSE的實(shí)現(xiàn)語(yǔ)句,如下所示的實(shí)現(xiàn)方式:case IFSYM: GetSym(); /* 條件語(yǔ)句*/CONDITION(SymSetUnion(SymSetNew(THENSYM,DOSYM),FSYS),LEV,TX);if (SYM=THENSYM) GetSym();else Error(16); CX1=CX; GEN(JPC,0,0); STATEMENT(FSYS,LEV,TX); if (SYM=ELSESYM) /* 如果THAN后面跟ELSE,ELSE可有可無(wú),不影響IF語(yǔ)句 */ GetSym(); CX2=CX; GEN(JMP,0,0);/*無(wú)條件跳轉(zhuǎn)語(yǔ)句*/ CODECX1.A=CX; /*cx即為else語(yǔ)句的位置,回填之前的JPC語(yǔ)句跳轉(zhuǎn)的語(yǔ)句*/ STATEMENT(FSYS,LEV,TX); /*else中的語(yǔ)句體*/ CODECX2.A=CX; /*執(zhí)行完ELSE中的語(yǔ)句體后的地址,把它回填JMP中的跳轉(zhuǎn)地址*/ else /*如果than語(yǔ)句后面沒(méi)有發(fā)現(xiàn)else*/ CODECX1.A=CX; /*執(zhí)行JPC語(yǔ)句跳轉(zhuǎn)到此地址,當(dāng)前地址為then后面Statement語(yǔ)句執(zhí)行完的地址*/ break;五、 關(guān)于測(cè)試用例說(shuō)明:六、 實(shí)驗(yàn)結(jié)果 1實(shí)例代碼:可測(cè)試實(shí)驗(yàn)中所有增加的內(nèi)容。(使用的測(cè)試用例:E01.PL0)PROGRAM E01;VAR A,B,C;BEGIN B:=8; C:=2; READ(A); IF A1 THEN WRITE(B) ELSE WRITE(C); FOR; DO; UNTIL; RETURN; *=; /=;

溫馨提示

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