版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、一、 實(shí)驗(yàn)要求1、 基本內(nèi)容(1)擴(kuò)充賦值運(yùn)算:+= 和 -=(2)擴(kuò)充語句(Pascal的FOR語句):FOR := STEP UNTIL DO (3)增加運(yùn)算:+ 和 -。2、 選做內(nèi)容(1)增加類型: 字符類型; 實(shí)數(shù)類型。(2)擴(kuò)充函數(shù): 有返回值和返回語句; 有參數(shù)函數(shù)。(3)增加一維數(shù)組類型(可增加指令)。(4)其他典型語言設(shè)施。二、 實(shí)驗(yàn)環(huán)境與工具1、 源語言:P0語言2、 目標(biāo)語言:假想式計算機(jī)的匯編語言,與具體計算機(jī)無關(guān)3、 實(shí)現(xiàn)工具:編譯工具:C+ builder 6,實(shí)現(xiàn)語言c語言4、 運(yùn)行平臺:由C+ builder 6解釋目標(biāo)語言,實(shí)現(xiàn)程序功能三、 結(jié)構(gòu)設(shè)計說明1、
2、PL0編譯程序的結(jié)構(gòu):2、 編譯程序中各功能模塊的描述過程或函數(shù)名簡要功能說明pl0主程序error出錯處理getsym詞法分析,讀取一個單詞getch漏掉空格,讀取一個字符gen生成目標(biāo)代碼,并送入目標(biāo)程序區(qū)test測試當(dāng)前單詞符號是否合法block分程序分析處理過程enter登錄名字表position查找標(biāo)識符在名字表中的位置constdeclaration常量定義處理vardeclaration變量說明處理listcode列出目標(biāo)代碼清單statement語句部分處理expression表達(dá)式處理term項(xiàng)處理factor因子處理condition條件處理interpret對目標(biāo)代碼的解
3、釋執(zhí)行程序base(函數(shù))通過靜態(tài)鏈求出數(shù)據(jù)區(qū)的基地址3、 編譯程序的總體流程圖 啟動置初值調(diào)用getsym取單詞調(diào)用block過程是否為源程序結(jié)束符源程序是否有錯誤調(diào)用解釋過程interpret解釋執(zhí)行目標(biāo)執(zhí)行目標(biāo)程序結(jié)束出錯打印錯誤NNYY 4、 詞法分析過程四、 主要成分描述1、 符號表結(jié)構(gòu)NAMEKIND(總共有一下5種類型)VAL/vpvp:LEVEL或者VALADRSIZEACONSTANT存放常量的數(shù)BVARIABLELEV該變量所在地址CREALLEV該變量所在地址DCHARACTERLEV該變量所在地址EPROCEDURLEV開辟空間大小2、 運(yùn)行時存儲組織和管理當(dāng)源程序經(jīng)過
4、語法分析,如果未發(fā)現(xiàn)錯誤時,由編譯程序調(diào)用解釋程序,對存放在CODE中的代碼CODE0開始進(jìn)行解釋執(zhí)行.當(dāng)廢棄結(jié)束后,記錄源程序中標(biāo)識符的TABLE表已沒有作用.因此存儲區(qū)只需以數(shù)組CODE存儲的只讀目標(biāo)程序和運(yùn)行機(jī)制時的數(shù)據(jù)區(qū)S,S是由解釋程序定義的一維整數(shù)型數(shù)組. 解釋執(zhí)行時的數(shù)據(jù)空間S為棧式計算機(jī)的在座空間,遵循后進(jìn)先出規(guī)則,對每個過程(包括主程序)當(dāng)調(diào)用 時,才分配數(shù)據(jù)空間,退出過程進(jìn), 則所分配原則的數(shù)據(jù)空間被釋放.解釋程序還定義了4個寄存器:1、指令寄存器.存放當(dāng)前正在解釋的一條目標(biāo)指令2、程序地址寄存器.指向下一條要執(zhí)行的目標(biāo)程序的地址3、棧頂寄存器.4、基址寄存器.指向每個過程
5、被調(diào)用時,在數(shù)據(jù)區(qū)S中給它分配原則的數(shù)據(jù)段起始地址,也稱基地址.3、 語法分析方法PL/0編譯程序的語法分析采用了自頂向下的遞歸的子程序法。其語法調(diào)用關(guān)系如圖左:block過程流程圖如圖右4、 中間代碼中間代碼總共有8條,具體如下程序中的代碼生成是由過程GEN完成的。GEN過程有3個參數(shù),分別代表目標(biāo)的功能碼、層差和位移量。生成的代碼順序存放在數(shù)組CODE中五、 測試用例1、 擴(kuò)充賦值運(yùn)算:+= 和 -=(必作部分)2、 擴(kuò)充for語句FOR := STEP UNTIL DO :(必作部分)3、 增加運(yùn)算:+、-:(必做部分)4、 增加類型: 字符類型; 實(shí)數(shù)類型。(選作部分) 變量A:實(shí)數(shù)到
6、整型的轉(zhuǎn)換,變量B:實(shí)數(shù)的讀取,變量C:字符的辨認(rèn)和輸出,變量D: 實(shí)型和整型的混合運(yùn)算,實(shí)數(shù)的輸出。 字符型不能參加算術(shù)運(yùn)算,不能將實(shí)數(shù)和整型數(shù)據(jù)賦值給字符型的檢測六、 開發(fā)過程和完成情況1、 賦值運(yùn)算+=,-=和運(yùn)算+,-的實(shí)現(xiàn)過程 添加保留字實(shí)驗(yàn)部分已經(jīng)完成,主要是在STATEMENT函數(shù)部分增加語法語義的識別。在case IDENT:后面增加一下部分代碼,實(shí)現(xiàn)A+=B;A-=B;A+;A的功能.else if(SYM=PLUSEQL) /增加+=,-=賦值運(yùn)算 GetSym(); EXPRESSION(FSYS,LEV,TX); if (i!=0) GEN(LOD,LEV-TABLEi
7、.vp.LEVEL,TABLEi.vp.ADR); GEN(OPR,0,2); GEN(OPR,0,17); GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); else if(SYM=MINUSEQL) /-= GetSym(); GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); EXPRESSION(FSYS,LEV,TX); if (i!=0) GEN(OPR,0,3); GEN(OPR,0,17); GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); else if(SYM=P
8、LUSPLUS) /添加+,- (修改的) if (i!=0) GetSym(); GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(LIT,0,1); GEN(OPR,0,2); GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); else if(SYM = MINUSMINUS) /- if (i!=0) GetSym(); GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(LIT,0,1); GEN(OPR,0,3); GEN(STO,LEV-TABLEi.vp
9、.LEVEL,TABLEi.vp.ADR); . 在switch下添加一下代碼,實(shí)現(xiàn)+A;-A;的功能case PLUSPLUS: /添加+i形式的語句 GetSym(); if(SYM!=IDENT) Error(12);/+后面應(yīng)該為變量 i=POSITION(ID,TX);if (i=0) Error(11);else if (TABLEi.KIND!=VARIABLE) /*ASSIGNMENT TO NON-VARIABLE*/Error(12); i=0; if (i!=0) GetSym(); GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);
10、 GEN(LIT,0,1); GEN(OPR,0,2); GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); break; case MINUSMINUS: /添加-i形式的語句 GetSym(); if(SYM!=IDENT) Error(12);/+后面應(yīng)該為變量 i=POSITION(ID,TX);if (i=0) Error(11);else if (TABLEi.KIND!=VARIABLE) /*ASSIGNMENT TO NON-VARIABLE*/Error(12); i=0; if (i!=0) GetSym(); GEN(LOD,LEV-
11、TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(LIT,0,1); GEN(OPR,0,3); GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); break;.2、 擴(kuò)充語句FOR := STEP UNTIL DO 的實(shí)現(xiàn)過程:保留字的添加在實(shí)驗(yàn)已經(jīng)做過,現(xiàn)在只需要添加語法語義分析,在STATEMENT函數(shù)下的switch中添加一下代碼。在實(shí)現(xiàn)的過程中是先寫出了for語句的的四元式,然后才根據(jù)四元式寫出語義分析代碼,四元式在書中192面有。case FORSYM: /添加FOR:=STEPUNTILDO GetSym(); i=PO
12、SITION(ID,TX);if (i=0) Error(11);else if (TABLEi.KIND!=VARIABLE) /*ASSIGNMENT TO NON-VARIABLE*/Error(12); i=0; GetSym();if (SYM=BECOMES) GetSym(); EXPRESSION(SymSetUnion(SymSetNew(STEPSYM),FSYS),LEV,TX); If (i!=0) GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); else Error(13); /:=結(jié)束 if(SYM!=STEPSYM)Erro
13、r(19);/step的判斷 GetSym(); CX1=CX; GEN(JMP,0,0); CX2=CX; /循環(huán)的無條件跳轉(zhuǎn)回這里 EXPRESSION(SymSetUnion(SymSetNew(UNTILSYM),FSYS),LEV,TX); if (i!=0) GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(OPR,0,2); GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);/STEP結(jié)束 if(SYM!=UNTILSYM)Error(19);/until的判斷 GetSym(); CODECX1.
14、A=CX; if (i!=0) GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); EXPRESSION(SymSetUnion(SymSetNew(DOSYM),FSYS),LEV,TX); GEN(OPR,0,12); CX1=CX; /待回填 ,已填 GEN(JPC,0,0); CX3 = CX; /待回填 ,已填 GEN(JMP,0,0); if(SYM!=DOSYM)Error(19);/DO的判斷 GetSym(); CODECX1.A=CX; STATEMENT(FSYS,LEV,TX); GEN(JMP,0,CX2); CODECX3.A=C
15、X; break;.3、 增加類型:字符類型和實(shí)數(shù)類型的實(shí)現(xiàn)過程 對保留字,內(nèi)部表示類型增加,和前面的類似,在實(shí)驗(yàn)報告中有 添加符號表的object類型,和symset中的開始符聲明typedef enum CONSTANT, VARIABLE, PROCEDUR, CHARACTER, REAL OBJECTS ;DECLBEGSYSCONSTSYM=1; /聲明開始符號集 添加char和real的聲明 DECLBEGSYSVARSYM=1; DECLBEGSYSPROCSYM=1; DECLBEGSYSCHARSYM=1; DECLBEGSYSREALSYM=1; FACBEGSYSIDE
16、NT =1; /因子開始符號集 FACBEGSYSNUMBER=1; FACBEGSYSLPAREN=1; FACBEGSYSREALNUM=1; /添加實(shí)數(shù)和字符作為因子的開始符 FACBEGSYSCHARNUM=1; GetSym()函數(shù)中對字符“A”和實(shí)數(shù)“2.23”的識別if (CH=0 & CH=0 & CH=0 & CHNMAX) Error(30); else if(CH=) /加入字符類型 GetCh(); if(CH=A & CH=a & CH=z) NUM=(int)CH; GetCh(); if(CH=) SYM=CHARNUM; else NUM=0;SYM=NUL;E
17、rror(33); /類型錯誤 else Error(33); /類型不匹配 GetCh(); 在登陸符號表enter函數(shù)里面添加實(shí)型字符型.case CHARACTER: /添加字符型和實(shí)型 TABLETX.vp.LEVEL=LEV; TABLETX.vp.ADR=DX; DX+; break; case REAL: TABLETX.vp.LEVEL=LEV; TABLETX.vp.ADR=DX; DX+; break; Block函數(shù)中添加real和char型的聲明if (SYM=REALSYM) /判斷實(shí)數(shù) 聲明 GetSym(); do RealDeclaration(LEV,TX,D
18、X); while (SYM=COMMA) GetSym(); RealDeclaration(LEV,TX,DX); if (SYM=SEMICOLON) GetSym(); else Error(5); while(SYM=IDENT); if (SYM=CHARSYM) /判斷字符 聲明 GetSym(); do CharDeclaration(LEV,TX,DX); while (SYM=COMMA) GetSym(); CharDeclaration(LEV,TX,DX); if (SYM=SEMICOLON) GetSym(); else Error(5); while(SYM=I
19、DENT); Interpret函數(shù)的運(yùn)行棧改成浮點(diǎn)型數(shù)據(jù),這樣才能實(shí)現(xiàn)實(shí)數(shù),添加opr的17,將實(shí)型轉(zhuǎn)為整型。18輸出字符。將5、6運(yùn)算中的%改為/ Write函數(shù)和read函數(shù)要添加類型處理。分為字符和整型兩種情況case WRITESYM: /添加整型,實(shí)型,字符型輸出的處理GetSym();if (SYM=LPAREN) do GetSym(); if(SYM = IDENT) i=POSITION(ID,TX); f (i=0) Error(11); if(TABLEi.KIND = CHARACTER | SYM = CHARNUM) /輸出字符型 EXPRESSION(SymSe
20、tUnion(SymSetNew(RPAREN,COMMA),FSYS),LEV,TX);GEN(OPR,0,18); else /輸出整型或者實(shí)型 EXPRESSION(SymSetUnion(SymSetNew(RPAREN,COMMA),FSYS),LEV,TX); GEN(OPR,0,14); while(SYM=COMMA); /實(shí)數(shù)的 if (SYM!=RPAREN) Error(33); else GetSym();GEN(OPR,0,15);break; /*WRITESYM*/ Statement的賦值語句,call語句,字符和實(shí)型的處理。字符型的不能做+=-=賦值.在條件語
21、句,表達(dá)式語句中字符不能參與算術(shù)運(yùn)算,但是可以參加條件運(yùn)算的判斷;由于涉及代碼特別多,并且很瑣碎,這里這展示部分代碼;Statement的賦值語句:.case IDENT:i=POSITION(ID,TX);if (i=0) Error(11); if(TABLEi.KIND=CHARACTER) /字符型的賦值語句處理 GetSym(); if(SYM!=BECOMES) Error(13); else GetSym(); if(SYM!=CHARNUM) Error(35); else GEN(LIT,0,NUM); GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.v
22、p.ADR); GetSym();break; else if(TABLEi.KIND=REAL) /實(shí)數(shù)型處理 :=,+=,-= . /實(shí)型處理結(jié)束 else if(TABLEi.KIND=VARIABLE) /整型的,增加類型轉(zhuǎn)換處理 . /整型處理完畢break;.在FACTOR函數(shù)中處理類型switch (TABLEi.KIND) case CONSTANT: GEN(LIT,0,TABLEi.VAL);GetSym(); break; case VARIABLE: GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);GetSym(); break; /實(shí)型,作為因子 case REAL: GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);GetSym(); break; case CHARACTER: GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GetSym(); if(SYM = PLUS|SYM = MINUS|SYM = TIMES |SYM=SLASH) Error(34); break; /字符作為因子不能參加加減乘除運(yùn)算 case PROCE
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023年6月福建省普通高中學(xué)業(yè)水平合格性考試化學(xué)試題(解析版)
- 西南林業(yè)大學(xué)《材料研究及分析方法》2022-2023學(xué)年第一學(xué)期期末試卷
- 西京學(xué)院《企業(yè)級應(yīng)用開發(fā)》2023-2024學(xué)年期末試卷
- 高中化學(xué):油脂
- 西京學(xué)院《電力系統(tǒng)分析實(shí)驗(yàn)》2022-2023學(xué)年期末試卷
- 人教版教育課件
- 西華師范大學(xué)《油畫基礎(chǔ)》2022-2023學(xué)年第一學(xué)期期末試卷
- 西華師范大學(xué)《憲法學(xué)》2021-2022學(xué)年期末試卷
- 西華師范大學(xué)《人體解剖生理學(xué)實(shí)驗(yàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 錄制課件功能
- 北京市東城區(qū)2023-2024學(xué)年六年級上學(xué)期期末數(shù)學(xué)試卷
- 急診護(hù)理質(zhì)量安全管理
- 加裝電梯設(shè)計方案
- 員工試用期轉(zhuǎn)正評估問卷調(diào)查(360評估)
- 禪修活動策劃方案
- 口腔正畸學(xué)課件
- 2024年高考語文備考:內(nèi)容理解和分析客觀題設(shè)置錯誤選項(xiàng)的九大手段
- 寵物醫(yī)院聘用合同范本
- 小學(xué)教育課件教案國家財政與稅收認(rèn)識國家財政的來源與用途
- 大型集團(tuán)公司企業(yè)內(nèi)部控制制度和流程匯編
- 關(guān)于開展返鄉(xiāng)農(nóng)民工服務(wù)工作的實(shí)施方案
評論
0/150
提交評論