版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上實(shí) 驗(yàn) 報(bào) 告 課程名稱 編譯原理 題目名稱 PL/0編譯器的擴(kuò)充 學(xué)生學(xué)院 計(jì)算機(jī)學(xué)院 專業(yè)班級 計(jì)算機(jī)科學(xué)與技術(shù)12(4)學(xué) 號 學(xué)生姓名 柏石先 指導(dǎo)教師 李楊 程序功能完成情況測試用例全面程度學(xué)生對所編程序熟悉程度報(bào)告格式是否與要求相符報(bào)告內(nèi)容是否準(zhǔn)確、全面2014 年 12 月 20日一、 實(shí)驗(yàn)?zāi)康呐c要求對PL/0作以下修改擴(kuò)充:(1) 增加單詞:保留字 ELSE,F(xiàn)OR,STEP,UNTIL,DO,RETURN運(yùn)算符 *=,/=,&,|,!(2)修改單詞:不等號# 改為 <>(3)增加條件語句的ELSE子句,要求:寫出相關(guān)文法,語法描述
2、圖,語義描述圖。二、 實(shí)驗(yàn)環(huán)境與工具1、源語言:PL/0語言,PL/0語言是PASCAL語言的子集,它的編譯程序是一個(gè)編譯解析執(zhí)行系統(tǒng),后綴名為.PL0;2、目標(biāo)語言:生成文件后綴為*.COD的目標(biāo)代碼3、實(shí)現(xiàn)平臺(tái):Borland C+Builder 64、運(yùn)行平臺(tái):Windows 8.1三、 設(shè)計(jì)方案1、 結(jié)構(gòu)設(shè)計(jì)說明(1)PL/0 語言編譯器 PL/0語言可看成是PASCAL語言的子集,它的編譯程序是一個(gè)編譯解釋執(zhí)行系統(tǒng)。PL/0的目標(biāo)程序?yàn)榧傧霔J接?jì)算機(jī)的匯編語言,與具體計(jì)算機(jī)無關(guān)。出錯(cuò)處理函數(shù)表格管理函數(shù)PL/0 源程序目標(biāo)代碼生成程序程序目標(biāo)代碼生成程序程序目標(biāo)代碼生成程序程序目標(biāo)代
3、碼生成程序程序目標(biāo)代碼生成程序程序 (2) PL/0編譯程序的語法分析過程BLOCK是整個(gè)編譯過程的核心。這里根據(jù)編譯程序的總體流程圖,來弄清BLOCK過程在整個(gè)編譯程序中的作用??偭鞒虉D如下圖所示:PL/0 的編譯程序采用一趟掃描方式,以語法分析程序?yàn)楹诵?,詞法分析程序和代碼生成程序都作為一個(gè)獨(dú)立的過程,當(dāng)語法分析需要讀單詞時(shí)就用詞法分析程序,而當(dāng)語法分析正確需生成相應(yīng)的目標(biāo)代碼時(shí),則調(diào)用代碼生成程序。此外,用表格管理程序建立變量,常量和過程標(biāo)識(shí)符的說明與引用之間的信息聯(lián)系。用出錯(cuò)處理程序?qū)υ~法和語法分析遇到的錯(cuò)誤給出在源程序中出錯(cuò)的位置和錯(cuò)誤性質(zhì)。(3) 各功能模塊描述過程或函數(shù)名簡要功能
4、說明pl0主程序error出錯(cuò)處理,打印出錯(cuò)位置和錯(cuò)誤編碼getsym詞法分析,讀取一個(gè)單詞getch漏掉空格,讀取一個(gè)字符gen生成目標(biāo)代碼,并送入目標(biāo)程序區(qū)test測試當(dāng)前單詞符號是否合法block分程序分析處理過程enter登錄名字表position(函數(shù))查找標(biāo)識(shí)符在名字表中的位置constdeclaration常量定義處理vardeclaration變量說明處理listode列出目標(biāo)代碼清單statement語句處理expression表達(dá)式處理term項(xiàng)處理factor因子處理condition條件處理interpret對目標(biāo)代碼的解釋執(zhí)行程序base(函數(shù))通過靜態(tài)鏈求出數(shù)據(jù)區(qū)的
5、基地址2、主要成分描述符號表為了組成一條指令,編譯程序必須知道其操作碼及其參數(shù)(數(shù)或地址)。這些值是由編譯程序本身聯(lián)系到相應(yīng)標(biāo)識(shí)符上去的。這種聯(lián)系是在處理常數(shù)、變量和過程說明完成的。為此,標(biāo)識(shí)符表應(yīng)包含每一標(biāo)識(shí)符所聯(lián)系的屬性;如果標(biāo)識(shí)符被說明為常數(shù),其屬性值為常數(shù)值;如果標(biāo)識(shí)符被說明成變量,其屬性就是由層次和修正量(偏移量)組成的地址;如果標(biāo)識(shí)符被說明為過程,其屬性就是過程的入口地址及層次。常數(shù)的值由程序正文提供,編譯的任務(wù)就是確定存放該值的地址。我們選擇順序分配變量和代碼的方法;每遇到一個(gè)變量說明,就將數(shù)據(jù)單元的下標(biāo)加一(PL/0 機(jī)中,每個(gè)變量占一個(gè)存貯單元)。開始編譯一個(gè)過程時(shí),要對數(shù)據(jù)
6、單元的下標(biāo)dx 賦初值,表示新開辟一個(gè)數(shù)據(jù)區(qū)。dx 的初值為3,因?yàn)槊總€(gè)數(shù)據(jù)區(qū)包含三個(gè)內(nèi)部變量RA,DL 和SL。 運(yùn)行時(shí)存儲(chǔ)組織和管理對于源程序的每一個(gè)過程(包括主程序),在被調(diào)用時(shí),首先在數(shù)據(jù)段中開辟三個(gè)空間,存放靜態(tài)鏈SL、動(dòng)態(tài)鏈DL和返回地址RA。靜態(tài)鏈記錄了定義該過程的直接外過程(或主程序)運(yùn)行時(shí)最新數(shù)據(jù)段的基地址。動(dòng)態(tài)鏈記錄調(diào)用該過程前正在運(yùn)行的過程的數(shù)據(jù)段基址。返回地址記錄了調(diào)用該過程時(shí)程序運(yùn)行的斷點(diǎn)位置。對于主程序來說,SL、DL和RA的值均置為0。靜態(tài)鏈的功能是在一個(gè)子過程要引用它的直接或間接父過程(這里的父過程是按定義過程時(shí)的嵌套情況來定的,而不是按執(zhí)行時(shí)的調(diào)用順序定的)的
7、變量時(shí),可以通過靜態(tài)鏈,跳過個(gè)數(shù)為層差的數(shù)據(jù)段,找到包含要引用的變量所在的數(shù)據(jù)段基址,然后通過偏移地址訪問它。在過程返回時(shí),解釋程序通過返回地址恢復(fù)指令指針的值到調(diào)用前的地址,通過當(dāng)前段基址恢復(fù)數(shù)據(jù)段分配指針,通過動(dòng)態(tài)鏈恢復(fù)局部段基址指針。實(shí)現(xiàn)子過程的返回。對于主程序來說,解釋程序會(huì)遇到返回地址為0的情況,這時(shí)就認(rèn)為程序運(yùn)行結(jié)束。解釋程序過程中的base函數(shù)的功能,就是用于沿著靜態(tài)鏈,向前查找相差指定層數(shù)的局部數(shù)據(jù)段基址。這在使用sto、lod、stoArr、lodArr等訪問局部變量的指令中會(huì)經(jīng)常用到。類PCODE代碼解釋執(zhí)行的部分通過循環(huán)和簡單的case判斷不同的指令,做出相應(yīng)的動(dòng)作。當(dāng)遇
8、到主程序中的返回指令時(shí),指令指針會(huì)指到0位置,把這樣一個(gè)條件作為終至循環(huán)的條件,保證程序運(yùn)行可以正常的結(jié)束。 語法分析方法語法分析子程序采用了自頂向下的遞歸子程序法,語法分析同時(shí)也根據(jù)程序的語義生成相應(yīng)三元代碼,并提供了出錯(cuò)處理的機(jī)制。語法分析主要由分程序分析過程(BLOCK)、參數(shù)變量分析過程(ParaDeclaration)、參數(shù)變量處理過程(ParaGetSub)、數(shù)組處理過程(ParaGetSub)、常量定義分析過程(ConstDeclaration)、變量定義分析過程(Vardeclaration)、語句分析過程(Statement)、表達(dá)式處理過程(Expression)、項(xiàng)處理過
9、程(Term)、因子處理過程(Factor)和條件處理過程(Condition)構(gòu)成。這些過程在結(jié)構(gòu)上構(gòu)成一個(gè)嵌套的層次結(jié)構(gòu)。除此之外,還有出錯(cuò)報(bào)告過程(Error)、代碼生成過程(Gen)、測試單詞合法性及出錯(cuò)恢復(fù)過程(Test)、登錄名字表過程(Enter)、查詢名字表函數(shù)(Position)以及列出類 PCODE代碼過程(Listcode)作過語法分析的輔助過程。 中間代碼表示中間代碼是是源程序的一種內(nèi)部表示,復(fù)雜性介于源語言和目標(biāo)機(jī)語言之間。中間代碼的表示方法有逆波蘭式、三元式、樹形、四元式等。(1) 逆波蘭記號是最簡單的一種中間代碼表示形式,早在編譯程序出現(xiàn)之前,它就用于表示算術(shù)表達(dá)
10、式。后綴表示法表示表達(dá)式,其最大的優(yōu)點(diǎn)是易于棧式計(jì)算機(jī)處理表達(dá)式。(2) 每個(gè)三元式由三個(gè)部分組成:A. 算符opB. 第一運(yùn)算對象ARG1C. 第二運(yùn)算對象ARG2運(yùn)算對象可能是源程序中的變量,也可能是某個(gè)三元式的結(jié)果,用三元式的編號表示。(3) 樹形表示是三元式表示的翻版。(4) 四元式是一種比較普遍采用的中間代碼形式:算符op,運(yùn)算對象ARG1,運(yùn)算對象ARG2,運(yùn)算結(jié)果RESULT四、 開發(fā)過程和完成情況(一)增加單詞:保留字 ELSE,F(xiàn)OR,STEP,UNTIL,DO , RETURN運(yùn)算符 *=,/=,&,|,!新增6個(gè)保留字和5個(gè)運(yùn)算符,合計(jì)11個(gè)單詞。其中保留字ELS
11、E,F(xiàn)OR,STEP,UNTIL,DO, RETURN 分別對應(yīng)ELSESYM,FORSYM, STEPSYM, UNTILSYM,DOSYM,RETURNSYM;運(yùn)算符 *= ,/= ,& ,| , ! 分別對應(yīng) TIMESBECOMES, SLASHBECOMES, ANDSYM, ORSYM, NOTSYM。注:要求只做詞法分析部分,不做語義分析處理,實(shí)驗(yàn)的結(jié)果只是識(shí)別新增的保留字和運(yùn)算符,并且將其打印顯示出來。1.1保留字typedef enum NUL, IDENT, NUMBER, PLUS, MINUS, TIMES, SLASH, ODDSYM, EQL, NEQ, L
12、SS, 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;char *SYMOUT
13、 = "NUL", "IDENT", "NUMBER", "PLUS", "MINUS", "TIMES", "SLASH", "ODDSYM", "EQL", "NEQ", "LSS", "LEQ", "GTR", "GEQ", "LPAREN", "RPAREN", &quo
14、t;COMMA", "SEMICOLON", "PERIOD", "BECOMES", "BEGINSYM", "ENDSYM", "IFSYM", "THENSYM", "WHILESYM", "WRITESYM", "READSYM", "DOSYM", "CALLSYM", "CONSTSYM", "VARSYM
15、", "PROCSYM", "PROGSYM", "ELSESYM", "FORSYM", "STEPSYM", "STEPSYM", "RETURNSYM", "TIMESBECOMES", "SLASHBECOMES", "ANDSYM", "ORSYM", "NOTSYM" ;strcpy(KWORD 1,"BEGIN")
16、; 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&
17、quot;); 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(KWORD1
18、9,"WRITE"); WSYM 1=BEGINSYM; WSYM 2=CALLSYM; WSYM 3=CONSTSYM; WSYM 4=DOSYM; WSYM 5=ELSESYM; /*增加保留字符號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; WSY
19、M17=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'&'=A
20、NDSYM; SSYM'!'=NOTSYM;在void STATEMENT(SYMSET FSYS,int LEV,int &TX)函數(shù)中增加:case FORSYM: GetSym(); Form1->printfs("保留字:FORSYM"); break;case STEPSYM: GetSym(); Form1->printfs("保留字:STEPSYM"); break;case UNTILSYM: GetSym(); Form1->printfs("保留字:UNTILSYM");
21、break;case RETURNSYM: GetSym(); Form1->printfs("保留字:RETURNSYM"); break;case DOSYM: GetSym(); Form1->printfs("保留字:DOSYM"); break; 1.2運(yùn)算符1.2.1在GetSym()函數(shù)中在相應(yīng)位置增加下面所示的語句:else if (CH=':') GetCh();if (CH='=') SYM=BECOMES; GetCh(); else SYM=NUL; else if(CH = '
22、*') 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 <
23、= OR >= */ if (CH='<') GetCh(); if (CH='=') SYM=LEQ; GetCh(); else if(CH='>') SYM=NEQ; GetCh(); /不等號加 else SYM=LSS;else if (CH='>') GetCh(); if (CH='=') SYM=GEQ; GetCh(); else SYM=GTR; else if (CH='&') SYM=ANDSYM; GetCh(); else if (CH=&
24、#39;|') GetCh(); if (CH='|') SYM=ORSYM; GetCh(); else Error(19); else if (CH='!') SYM=NOTSYM; GetCh(); else SYM=SSYMCH; GetCh(); 1.2.2在void STATEMENT(SYMSET FSYS,int LEV,int &TX)函數(shù)中增加:case TIMESBECOMES: GetSym(); Form1->printfs("運(yùn)算符:*= "); break; case SLASHBECOME
25、S: 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;1.3保留字的個(gè)數(shù)原保留字個(gè)數(shù)是14,故const NORW
26、 = 14; /* # OF RESERVED WORDS */因?yàn)樾略黾颖A糇?個(gè),故應(yīng)改為:const NORW = 19; /* # OF RESERVED WORDS */1.4單詞總數(shù)原單詞總數(shù)是33,故所有“i<33” (i實(shí)際上是指單詞總數(shù))因?yàn)樾略黾訂卧~10個(gè),故應(yīng)改為“i<43”。為了方便以后新增加單詞,特加入了常量const WNUM = 43;然后把所有的43替換成了WNUM,以后要增加單詞,就可以直接修改該值,不必再重新把所有的值找出來做替換。2.修改單詞:不等號# 改為 <>(1) 把源代碼中的程序段 SSYM'#'=NEQ;
27、刪除或注釋消去。 (2)在GetSym()過程中把分析到的<>定義為不等號,從“<”切入修改。else /* THE FOLLOWING TWO CHECK WERE ADDED BECAUSE ASCII DOES NOT HAVE A SINGLE CHARACTER FOR <= OR >= */ if (CH='<') GetCh(); if (CH='=') SYM=LEQ; GetCh(); else if(CH='>') SYM=NEQ; GetCh(); /更改不等號為“<>”
28、 else SYM=LSS;3.增加條件語句的ELSE子句,要求:寫出相關(guān)文法,語法圖,語義規(guī)則。(1)相關(guān)文法 G(S): Sif S else S | if S | a(2)語法圖(3) 語義規(guī)則產(chǎn)生式語 義 規(guī) 則S®if B then M S1 backpatch(E.truelist, M.quad );S.nextlist:=merge(E.falselist, S1.nextlist) M ® M.quad := nextquad ; N ® N.nextlist:=makelist(nextquad);Gen( j , , , 0 ) S®
29、;if B then M1 S1 N else M2 S2 backpatch(E.truelist, M1.quad );backpatch(E.falselist, M2.quad );S.nextlist:=merge(S1.nextlist, N.nextlist, S2.nextlist) (4) 代碼修改在void STATEMENT(SYMSET FSYS,int LEV,int &TX)中加入ELSE的實(shí)現(xiàn)語句case IFSYM: GetSym(); /* 條件語句*/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可有可無,不影響IF語句 */ GetSym(); CX2=CX; GEN(JMP,0,0);/*無條件跳轉(zhuǎn)語句*/ CODECX1.A=CX; /*cx即為else語句的位置,回填之前的JPC語句跳轉(zhuǎn)的語句*/ STATE
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版塔吊租賃與驗(yàn)收及付款合同3篇
- 二零二五版科技公司股份交易與反壟斷合規(guī)合同3篇
- 二零二五年度共享辦公空間租賃與服務(wù)合同2篇
- 二零二五年度咖啡廳高品質(zhì)咖啡豆供應(yīng)合同3篇
- 2025年度個(gè)人向科技公司借款合同2篇
- 二零二五年度商業(yè)街區(qū)臨時(shí)攤位租賃及管理服務(wù)合同2篇
- 2025年度“銷售合同”英文翻譯與海外市場品牌推廣合作框架3篇
- 2025年度木地板施工安全與質(zhì)量責(zé)任合同4篇
- KTV員工勞動(dòng)合同范本
- 2025年度煤礦井巷工程應(yīng)急救援預(yù)案編制合同
- 2023-2024學(xué)年度人教版一年級語文上冊寒假作業(yè)
- 人教版語文1-6年級古詩詞
- 上學(xué)期高二期末語文試卷(含答案)
- GB/T 18488-2024電動(dòng)汽車用驅(qū)動(dòng)電機(jī)系統(tǒng)
- 投資固定分紅協(xié)議
- 高二物理題庫及答案
- 職業(yè)發(fā)展展示園林
- 七年級下冊英語單詞默寫表直接打印
- 2024版醫(yī)療安全不良事件培訓(xùn)講稿
- 中學(xué)英語教學(xué)設(shè)計(jì)PPT完整全套教學(xué)課件
- 移動(dòng)商務(wù)內(nèi)容運(yùn)營(吳洪貴)項(xiàng)目五 運(yùn)營效果監(jiān)測
評論
0/150
提交評論