版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、報告成績編譯原理課程設(shè)計項目名稱 PL/0語言的擴充 學(xué) 院 計算機學(xué)院 專業(yè)班級 學(xué) 號 姓 名 指導(dǎo)教師 2013 年 1 月 3 日 TOC o 1-5 h z u HYPERLINK l _Toc345177671 一 課程設(shè)計目的 PAGEREF _Toc345177671 h 0 HYPERLINK l _Toc345177672 二 課程設(shè)計要求 PAGEREF _Toc345177672 h 0 HYPERLINK l _Toc345177673 基本內(nèi)容: PAGEREF _Toc345177673 h 0 HYPERLINK l _Toc345177674 選做內(nèi)容: PA
2、GEREF _Toc345177674 h 0 HYPERLINK l _Toc345177675 已實現(xiàn)的功能: PAGEREF _Toc345177675 h 0 HYPERLINK l _Toc345177676 三 編譯環(huán)境與工具 PAGEREF _Toc345177676 h 0 HYPERLINK l _Toc345177677 四 結(jié)構(gòu)設(shè)計說明 PAGEREF _Toc345177677 h 0 HYPERLINK l _Toc345177678 1PL/0編譯程序的結(jié)構(gòu)圖 PAGEREF _Toc345177678 h 0 HYPERLINK l _Toc345177679 2
3、PL/0編譯程序的過程或函數(shù)的功能表 PAGEREF _Toc345177679 h 1 HYPERLINK l _Toc345177680 3PL/0編譯程序的總體流程圖 PAGEREF _Toc345177680 h 1 HYPERLINK l _Toc345177681 4PL/0編譯程序的中間代碼 PAGEREF _Toc345177681 h 2 HYPERLINK l _Toc345177682 5PL0的編譯程序的過程和函數(shù)的功能 PAGEREF _Toc345177682 h 3 HYPERLINK l _Toc345177683 五 課程設(shè)計的設(shè)計與步驟 PAGEREF _T
4、oc345177683 h 3 HYPERLINK l _Toc345177684 1擴充賦值運算:+= -= *= /= + 和- - PAGEREF _Toc345177684 h 5 HYPERLINK l _Toc345177685 2增加Pascal的FOR語句 PAGEREF _Toc345177685 h 15 HYPERLINK l _Toc345177686 3一維數(shù)組 PAGEREF _Toc345177686 h 17 HYPERLINK l _Toc345177687 六 調(diào)試測試 PAGEREF _Toc345177687 h 19 HYPERLINK l _Toc3
5、45177688 1.+= -= *= /= + -的測試 PAGEREF _Toc345177688 h 19 HYPERLINK l _Toc345177689 2.FOR語句的測試 PAGEREF _Toc345177689 h 21 HYPERLINK l _Toc345177690 3.數(shù)組的調(diào)試 PAGEREF _Toc345177690 h 22 HYPERLINK l _Toc345177691 4綜合調(diào)試 PAGEREF _Toc345177691 h 23 HYPERLINK l _Toc345177692 七 課程設(shè)計總結(jié) PAGEREF _Toc345177692 h
6、25 HYPERLINK l _Toc345177693 【參考文獻(xiàn)】 PAGEREF _Toc345177693 h 26課程設(shè)計目的在分析理解一個教學(xué)型編譯程序(如PL/0)的基礎(chǔ)上,對其詞法分析程序、語法分析程序和語義處理程序進(jìn)行部分修改擴充。達(dá)到進(jìn)一步了解程序編譯過程的基本原理和基本實現(xiàn)方法的目的。課程設(shè)計要求基本內(nèi)容:(1)擴充賦值運算:*= 和 /=(2)擴充語句(Pascal的FOR語句):FOR := TO DO FOR := DOWNTO DO 其中,語句的循環(huán)變量的步長為2,語句的循環(huán)變量的步長為-2。(3)增加運算:+ 和 -。選做內(nèi)容:(1)增加類型: 字符類型; 實數(shù)
7、類型。(2)擴充函數(shù): 有返回值和返回語句; 有參數(shù)函數(shù)。(3)增加一維數(shù)組類型(可增加指令)。(4)其他典型語言設(shè)施。已實現(xiàn)的功能:(1)擴充賦值運算:*=和 /= (另外也擴充了+= 和 -=)(2)擴充語句(Pascal的FOR語句):FOR := TO DO FOR := DOWNTO DO (3)增加運算:+ 和 -。(4)增加一維數(shù)組類型(可增加指令)。編譯環(huán)境與工具編譯環(huán)境:Microsoft Windows 7 (64bit)編譯工具:Microsoft Visual C+ 6.0結(jié)構(gòu)設(shè)計說明1PL/0編譯程序的結(jié)構(gòu)圖圖4-1 PL/0編譯程序的結(jié)構(gòu)圖PL/0源程序詞法分析程序
8、語法語義分析程序代碼生成目標(biāo)代碼表格管理程序出錯管理程序2PL/0編譯程序的過程或函數(shù)的功能表過程或函數(shù)名簡要功能說明pl0主程序error出錯處理,打印出錯位置和錯誤編碼getsym詞法分析,讀取一個單詞getch漏掉空格,讀取一個字符gen生成目標(biāo)代碼,并送入目標(biāo)程序區(qū)test測試當(dāng)前單詞符號是否合法block分程序分析處理過程enter登錄名字表position(函數(shù))查找標(biāo)識符在名字表中的位置constdeclaration常量定義處理vardeclaration變量說明處理listode列出目標(biāo)代碼清單statement語句處理expression表達(dá)式處理term項處理factor
9、因子處理condition條件處理interpret對目標(biāo)代碼的解釋執(zhí)行程序base(函數(shù))通過靜態(tài)鏈求出數(shù)據(jù)區(qū)的基地址表4-1 PL/0編譯程序的過程或函數(shù)的功能表3PL/0編譯程序的總體流程圖圖4-2 PL/0編譯程序的總體流程圖4PL/0編譯程序的中間代碼對PL/0編譯程序的目標(biāo)代碼的指令格式描述如下: f l a其中f代表功能碼,l表示層次差,a的含意對不同的指令有所區(qū)別,見下面對每條指令的解釋說明:Lit 0 a將常數(shù)值取到棧頂,a為常數(shù)值lod l a將變量值取到棧頂,a為偏移量,l為層差sto l a將棧頂內(nèi)容送入某變量單元中,a為偏移量,l為層差cal l a調(diào)用過程,a為過程
10、地址,l為層差int 0 a在運行棧中為被調(diào)用的過程開辟a個單元的數(shù)據(jù)區(qū)jmp 0 a無條件跳轉(zhuǎn)至a地址jpc 0 a條件跳轉(zhuǎn),當(dāng)棧頂布爾值非真則跳轉(zhuǎn)至a地址,否則順序執(zhí)行opr 0 0過程調(diào)用結(jié)束后,返回調(diào)用點并退棧opr 0 1棧頂元素取反opr 0 2次棧頂與棧頂相加,退兩個棧元素,結(jié)果值進(jìn)棧opr 0 3次棧頂減去棧頂,退兩個棧元素,結(jié)果值進(jìn)棧opr 0 4次棧頂乘以棧頂,退兩個棧元素,結(jié)果值進(jìn)棧opr 0 5次棧頂除以棧頂,退兩個棧元素,結(jié)果值進(jìn)棧opr 0 6棧頂元素的奇偶判斷,結(jié)果值在棧頂opr 0 7opr 0 8次棧頂與棧頂是否相等,退兩個棧元素,結(jié)果值進(jìn)棧opr 0 9次棧
11、頂與棧頂是否不等,退兩個棧元素,結(jié)果值進(jìn)棧opr 0 10次棧頂是否小于棧頂,退兩個棧元素,結(jié)果值進(jìn)棧opr 0 11次棧頂是否大于等于棧頂,退兩個棧元素,結(jié)果值進(jìn)棧opr 0 12次棧頂是否大于棧頂,退兩個棧元素,結(jié)果值進(jìn)棧opr 0 13次棧頂是否小于等于棧頂,退兩個棧元素,結(jié)果值進(jìn)棧opr 0 14棧頂值輸出至屏幕opr 0 15屏幕輸出換行opr 0 16從命令行讀入一個輸入置于棧頂表4-2 PL/0編譯程序的目標(biāo)指令5PL0的編譯程序的過程和函數(shù)的功能Pl0:主程序Error:出錯處理,打印出錯位置和錯誤編碼Getsym:詞法分析,讀取一個單詞Getch:漏掉空格,讀取一個字符Gen
12、:生成目標(biāo)代碼,并送入目標(biāo)程序區(qū)Test:測試當(dāng)前單詞符號是否合法Block:分程序分析處理過程Enter:登陸名字表Position:查找標(biāo)識符在名字表中的位置Constdeclaration:常量定義處理Vardeclaration:變量說明處理Listcode:列出目標(biāo)代碼清單Statement:語句部分處理Expression:表達(dá)式處理Term:項處理Factor:因子處理Condition:條件處理Interpret:對目標(biāo)代碼的解釋執(zhí)行程序Base:通過靜態(tài)鏈求出數(shù)據(jù)區(qū)的基地址課程設(shè)計的設(shè)計與步驟本次課程設(shè)計是在實驗的基礎(chǔ)上,在實驗中,已經(jīng)實現(xiàn)對PL/0作以下修改擴充:(1)增加
13、單詞:保留字 ELSE,F(xiàn)OR,STEP,UNTIL,RETURN 運算符 +=,-=,+,-,(2)修改單詞:不等號# 改為 (3)增加條件語句的ELSE子句在課程設(shè)計中,因為關(guān)鍵字增加到了18個,所以令 # define norw 18。SYMBOL擴展為48個值。在pl0.h中做了如下更改,具體如下(粗體部分為課程設(shè)計更改部分):enum symbol nul, ident, number, plus, minus, times, slash, oddsym, eql, neq,lss, leq, gtr, geq, lparen,rparen, comma, semicolon,per
14、iod, becomes,beginsym, endsym, ifsym, thensym, whilesym,writesym, readsym, dosym, callsym, constsym,varsym, procsym, elsesym, forsym, stepsym, untilsym, returnsym,plusbecomes, dplus, minusbecomes, dminus, and, or, not,lepa,ripa,slashbecomes,timesbecomes,;#define symnum 48 符號和關(guān)鍵字?jǐn)U展(粗體部分為課程設(shè)計更改部分):ssy
15、m+=plus;ssym-=minus;ssym*=times;ssym/=slash;ssym(=lparen;ssym)=rparen;ssym=eql;ssym,=comma;ssym.=period;/ssym#=neq; 去掉#,改為ssym;=semicolon;ssym!=not; /非ssym=lepa;/一維數(shù)組的左括號ssym=ripa;/一維數(shù)組的右括號/*設(shè)置保留字名字,按照字母順序,便于折半查找*/strcpy(&(word00),begin);strcpy(&(word10),call);strcpy(&(word20),const);strcpy(&(word30
16、),do);strcpy(&(word40),else);strcpy(&(word50),end);strcpy(&(word60),for);strcpy(&(word70),if);strcpy(&(word80),odd);strcpy(&(word90),procedure);strcpy(&(word100),read);strcpy(&(word110),return);strcpy(&(word120),step);strcpy(&(word130),then);strcpy(&(word140),until);strcpy(&(word150),var);strcpy(&(w
17、ord160),while);strcpy(&(word170),write);/*設(shè)置保留字符號*/wsym0=beginsym;wsym1=callsym;wsym2=constsym;wsym3=dosym;wsym4=elsesym;wsym5=endsym;wsym6=forsym;wsym7=ifsym;wsym8=oddsym;wsym9=procsym;wsym10=readsym;wsym11=returnsym; wsym12=stepsym;wsym13=thensym;wsym14=untilsym;wsym15=varsym;wsym16=whilesym;wsym1
18、7=writesym;設(shè)置指令名稱(粗體部分為課程設(shè)計更改部分):strcpy(&(mnemoniclit0),lit);strcpy(&(mnemonicopr0),opr);strcpy(&(mnemoniclod0),lod);strcpy(&(mnemonicsto0),sto);strcpy(&(mnemoniccal0),cal);strcpy(&(mnemonicinte0),int);strcpy(&(mnemonicjmp0),jmp);strcpy(&(mnemonicjpc0),jpc);strcpy(&(mnemonicgar0),gar);strcpy(&(mnemo
19、nicsar0),sar);strcpy(&(mnemonicshd0),shd);strcpy(&(mnemonicdel0),del);strcpy(&(mnemonicjud0),jud);strcpy(&(mnemonictra0),tra);1擴充賦值運算:+= -= *= /= + 和- -:=+=-=*=/=+-+-變量表達(dá)式表達(dá)式+a或者-aa+或者a-圖5-1 擴充賦值運算:+= -= *= /= + 和- -1)在symbol增加字符:Plusbecomes:+=Minusbecomes:-=Slashbecomes:*=Timesbecomes:/=2)對取字符getsy
20、m()函數(shù)進(jìn)行擴充,具體如下(粗體部分為更改部分):int getsym()./此處省略部分未修改過的代碼else if(ch=+) /讀到加號getchdo; /再讀一個字符if(ch=) /讀到等號,則與+號構(gòu)成加等sym=plusbecomes;getchdo;else if(ch=+) /讀到加號,則與加號構(gòu)成+sym=dplus;getchdo; elsesym=plus; /那就是一個單獨的加號else if(ch=-) /讀到減號getchdo;if(ch=) /讀到等號,則與減號構(gòu)成減等sym=minusbecomes;getchdo;else if(ch=-) /讀到減號,則
21、與減號構(gòu)成-sym=dminus;getchdo;elsesym=minus; /那就是一個單獨的減號else if(ch=*) getchdo;if(ch=) /讀到乘號,則與減號構(gòu)成乘等sym=timesbecomes;getchdo;elsesym=times; /那就是一個單獨的乘else if(ch=/) getchdo;if(ch=) /讀到乘號,則與減號構(gòu)成除等sym=slashbecomes;getchdo;elsesym=slash; /那就是一個單獨的除./此處省略部分未修改過的代碼3)對statemen函數(shù)進(jìn)行擴展int statement(bool* fsys,int
22、* ptx,int lev)./此處省略部分未修改過的代碼 if(sym=ident) i=position(id,*ptx); if(i=0) error(11); else if(tablei.kind!=variable&tablei.kind!=array) error(12); i=0; else getsymdo; if(sym=lepa)/如果是數(shù)組getsymdo; /處理里的表達(dá)式memcpy(nxtlev,fsys,sizeof(bool)* symnum);nxtlevripa=true;expressiondo(nxtlev,ptx,lev);gendo(tra,0,t
23、ablei.size);/生成將數(shù)組下標(biāo)范圍入棧指令gendo(jud,0,0);/判斷下標(biāo)合法性if(sym!=ripa)error(26);getsymdo; if(sym=becomes)/賦值:= getsymdo;flag=1; else if(sym=plusbecomes)/加賦值+=getsymdo;flag=2;else if(sym=minusbecomes)/減賦值-=getsymdo;flag=3;else if(sym=dplus)/+getsymdo;flag=4;else if(sym=dminus)/-getsymdo;flag=5;else if(sym=ti
24、mesbecomes)/*=getsymdo;flag=6;else if(sym=slashbecomes)/ /=getsymdo;flag=7; else error(13); if(i!=0)if(flag=1) /:=memcpy(nxtlev,fsys,sizeof(bool)* symnum);expressiondo(nxtlev,ptx,lev);else if(flag=2)/+=memcpy(nxtlev,fsys,sizeof(bool)* symnum);expressiondo(nxtlev,ptx,lev);gendo(lod,lev-tablei.level,t
25、ablei.adr);/先取值到棧頂gendo(opr,lev-tablei.level,2);/執(zhí)行加法else if(i!=0&flag=3)/-=memcpy(nxtlev,fsys,sizeof(bool)* symnum);expressiondo(nxtlev,ptx,lev);gendo(lod,lev-tablei.level,tablei.adr);/先取值到棧頂gendo(opr,lev-tablei.level,3);/執(zhí)行減法gendo(opr,lev-tablei.level,1);/取反else if(i!=0&flag=4) /+if(tablei.kind=va
26、riable)gendo(lod,lev-tablei.level,tablei.adr);/先取值到棧頂gendo(lit,lev-tablei.level,1);/將值為1入棧gendo(opr,lev-tablei.level,2);/加法,即加1if(tablei.kind=array)gendo(gar,lev-tablei.level,tablei.adr);gendo(lit,lev-tablei.level,1);gendo(opr,lev-tablei.level,2);else if(i!=0&flag=5)/-if(tablei.kind=variable)gendo(l
27、od,lev-tablei.level,tablei.adr);/先取值到棧頂gendo(lit,lev-tablei.level,1);/將值為1入棧gendo(opr,lev-tablei.level,3);/減法,即-1if(tablei.kind=array)gendo(gar,lev-tablei.level,tablei.adr);gendo(lit,lev-tablei.level,1);gendo(opr,lev-tablei.level,3);else if(i!=0&flag=6)/*=memcpy(nxtlev,fsys,sizeof(bool)* symnum);exp
28、ressiondo(nxtlev,ptx,lev);gendo(lod,lev-tablei.level,tablei.adr);/先取值到棧頂gendo(opr,lev-tablei.level,4);/乘法else if(i!=0&flag=7) / /=;gendo(lod,lev-tablei.level,tablei.adr);/先取值到棧頂memcpy(nxtlev,fsys,sizeof(bool)* symnum);expressiondo(nxtlev,ptx,lev);gendo(opr,lev-tablei.level,5);/除法if(tablei.kind=array
29、) /數(shù)組,根據(jù)偏移地址存入數(shù)組gendo(sar,lev-tablei.level,tablei.adr);gendo(del,0,0);/賦值語句需將存入數(shù)組后棧頂為偏移地址出棧else /變量gendo(sto,lev-tablei.level,tablei.adr); /根據(jù)變量地址存入變量 else if(sym=dplus) /+變量getsymdo;if(sym=ident)/后面跟的是變量i=position(id,*ptx);if(i=0)error(11);elseif(tablei.kind!=variable&tablei.kind!=array) /+后沒跟變量,出錯
30、error(12);i=0;else /+后跟變量,處理生成中間代碼if(tablei.kind=variable)gendo(lod,lev-tablei.level,tablei.adr);/先取值到棧頂gendo(lit,0,1);/將值為1入棧gendo(opr,0,2);/加法,即+1,棧頂加次棧頂gendo(sto,lev-tablei.level,tablei.adr);/出棧取值到內(nèi)存getsymdo;else if(tablei.kind=array) /后跟數(shù)組getsymdo;if(sym=lepa)getsymdo;memcpy(nxtlev,fsys,sizeof(b
31、ool)* symnum);nxtlevripa=true;expressiondo(nxtlev,ptx,lev);gendo(tra,0,tablei.size); /生成將數(shù)組下標(biāo)范圍入棧指令gendo(jud,0,0); /判斷下標(biāo)合法性if(sym!=ripa)error(26); /缺少elsegendo(gar,lev-tablei.level,tablei.adr);gendo(lit,0,1);gendo(opr,0,2);gendo(sar,lev-tablei.level,tablei.adr);gendo(del,0,0);getsymdo;elseerror(27);
32、/缺少else if(sym=dminus)/-變量getsymdo;if(sym=ident) /后面跟的是變量i=position(id,*ptx);if(i=0)error(11);elseif(tablei.kind!=variable&tablei.kind!=array) /-后沒跟變量,出錯error(12);i=0;else /-后跟變量,處理生成中間代碼if(tablei.kind=variable)/后跟變量gendo(lod,lev-tablei.level,tablei.adr);/先取值到棧頂gendo(lit,0,1); /將值為1入棧gendo(opr,0,3);
33、/加法,即-1,棧頂減次棧頂gendo(sto,lev-tablei.level,tablei.adr);/出棧取值到內(nèi)存getsymdo;else if(tablei.kind=array)/后跟數(shù)組變量getsymdo;if(sym=lepa)getsymdo;memcpy(nxtlev,fsys,sizeof(bool)* symnum);nxtlevripa=true;expressiondo(nxtlev,ptx,lev);gendo(tra,0,tablei.size);/生成將數(shù)組下標(biāo)范圍入棧指令gendo(jud,0,0);/判斷下標(biāo)合法性if(sym!=ripa)error(
34、26);/缺少elsegendo(gar,lev-tablei.level,tablei.adr);gendo(lit,0,1);gendo(opr,0,3);gendo(sar,lev-tablei.level,tablei.adr);gendo(del,0,0);getsymdo;elseerror(27);/缺少 ./此處省略部分未修改過的代碼2增加Pascal的FOR語句本次課程設(shè)計中要求擴充的是Pascal的FOR語句:FOR := TO DO FOR := DOWNTO DO ,流程圖如下:for變量:=表達(dá)式to/downto表達(dá)式do語句圖5-2 增加Pascal的FOR語句1
35、)在symbol增加字符FORSYM。strcpy(KWORD10,for); WSYM 10= forsym;strcpy(KWORD22,to); WSYM22=tosym;strcpy(KWORD 7,downto); WSYM 7=downtosym;2)對statement函數(shù)進(jìn)行擴充int statement(bool* fsys,int * ptx,int lev)./此處省略部分未修改過的代碼else if(sym= forsym)getsymdo;if(sym=ident) / ident為變量的符號i=position(id,*ptx);if(i=0)error(11);e
36、lseif(tablei.kind!=variable) /賦值語句中,賦值號左部標(biāo)識符屬性應(yīng)是變量error(12);i=0;elsegetsymdo;if(sym!=becomes) error(13);else getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum); if(nxtlevtosym=true) / tosymelse nxtlevdowntosym=true; / downtosymexpressiondo(nxtlev,ptx,lev); /處理賦值語句右部的表達(dá)式gendo(sto,lev-tablei.level,table
37、i.adr); /保存初始值getsymdo;cx1=cx; /保存循環(huán)開始點memcpy(nxtlev,fsys,sizeof(bool)*symnum);if(sym=dosym)getsymdo;statement(fsys,ptx,lev); /循環(huán)體處理gendo(lod,lev-tablei.level,tablei.adr); /將循環(huán)變量取出放在棧頂gendo(opr,0,2); /循環(huán)變量加長gendo(sto,lev-tablei.level,tablei.adr); /將棧頂?shù)闹荡嫒胙h(huán)變量gendo(jmp,0,cx1);/無條件跳轉(zhuǎn)到循環(huán)開始點codecx2.a=cx
38、; /回填循環(huán)結(jié)束點的地址else error(29); /for語句中少了doelseerror(19); /for后面為賦值語句,賦值語句左部是變量,缺少變量./ 此處省略部分未修改過的代碼3一維數(shù)組1)設(shè)置一維數(shù)組的左右括號:ssym=lepa; /一維數(shù)組的左括號ssym=ripa; /一維數(shù)組的右括號2)增加指令:strcpy(&(mnemonicgar0),gar); strcpy(&(mnemonicsar0),sar);strcpy(&(mnemonicshd0),shd);strcpy(&(mnemonicdel0),del);strcpy(&(mnemonicjud0),j
39、ud);strcpy(&(mnemonictra0),tra);enum fctlit, opr, lod, sto, cal, inte, jmp, jpc, gar, sar, shd, del, jud, tra,;由于指令有原來的8條拓展到了14條,故進(jìn)行如下修改#define fctnum 14增加的指令意義如下:gar:根據(jù)棧頂?shù)钠频刂窂臄?shù)組中取值到新的棧頂sar:根據(jù)次棧頂?shù)钠频刂钒褩m數(shù)闹荡嫒霐?shù)組shd:將棧頂?shù)闹迪乱频酱螚m敚瑮m敵鰲#创螚m敵蔀闂m攄el:出棧頂jud:判斷數(shù)組下標(biāo)合法性tra:將數(shù)組的下標(biāo)范圍入棧,gendo(tra,0,數(shù)組下標(biāo)最大值);3)增加標(biāo)
40、識符類型屬性:enum object constant, variable, procedur, array, /數(shù)組; 4)在block函數(shù)中添加如下代碼:for(i=tx0+1;i=tx;i+) switch(tablei.kind) case constant: /*常量名字*/ ./此處省略部分未修改過的代碼 case variable: /*變量名字*/ ./此處省略部分未修改過的代碼 case procedur: /*過程名字*/ ./此處省略部分未修改過的代碼case array:/數(shù)組變量printf(%d var-array %s ,i,);printf
41、(lev=%d addr=%d size=%dn,tablei.level,tablei.adr,tablei.size);fprintf(fas,%d var-array %s,i,); fprintf(fas,lev=%d addr=%d size=%dn,tablei.level,tablei.adr,tablei.size);5)在enter()函數(shù)添加如下代碼:switch(k)case constant: /*常量名字*/./此處省略部分未修改過的代碼case variable: /*變量名字*/./此處省略部分未修改過的代碼case procedur: /*
42、過程名字*/./此處省略部分未修改過的代碼case array: /*數(shù)組名字*/table(*ptx).level=lev;table(*ptx).adr=(*pdx)-arraysize;table(*ptx).size=arraysize;break;6)在Vardeclaration()函數(shù)中添加數(shù)組的變量聲明,代碼如下:int vardeclaration(int * ptx,int lev,int * pdx) ./此處省略部分未修改過的代碼case gar: /根據(jù)棧頂?shù)钠频刂窂臄?shù)組中取值到新的棧頂st=sbase(i.l,s,b)+i.a+st-1; /偏移地址為上一層過程的
43、基址+當(dāng)前指令的層次+棧頂?shù)钠频刂穞+;break;case sar:/根據(jù)次棧頂?shù)钠频刂钒褩m數(shù)闹荡嫒霐?shù)組t-;sbase(i.l,s,b)+i.a+st-1=st;/t-;break;case shd:/將棧頂?shù)闹当4娴酱螚m攖-;st-1=st;break;case del:/將棧頂?shù)闹党鰲-;break;case jud:/判斷數(shù)組下標(biāo)的合法性t-;if(st-1=st) error(28);printf(n運行問題出錯,程序退出!請輸入任意數(shù)字退出:);scanf(%d,&p);exit(1);break;case tra:/將數(shù)組的下標(biāo)范圍入棧st=i.a;t+;break;./ 此處省略部分未修改過的代碼 調(diào)試測試1.+= -= *= /= + -的測試 圖6-1 測試文件pl0_1.txt 圖6-2 += -= *= /= + -的測試結(jié)果1圖6-2 += -= *= /= + -的測試結(jié)果22.FOR語句的測試圖6-4 FOR語句的測試文件pl0.tx
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年鋼筋施工承攬具體合同版B版
- 一年級人自然社會教案(全冊)浙江版
- 預(yù)制柱吊裝施工工藝正式版
- 2024版蘇州租賃房屋家具清單3篇
- 2024年餐飲業(yè)標(biāo)準(zhǔn)原材料購銷協(xié)議樣本一
- 2024年簡化版離婚協(xié)議書樣本
- 黔南民族師范學(xué)院《offce辦公軟件三劍客》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024蘇州二手房買賣合同風(fēng)險評估與防控措施協(xié)議3篇
- 重慶文理學(xué)院《JAVA面向?qū)ο缶幊獭?023-2024學(xué)年第一學(xué)期期末試卷
- 3.1多變的天氣【幫課堂】2025學(xué)年七年級地理上冊同步學(xué)與練(人教版)(解析版)
- 2025年下半年貴州高速公路集團(tuán)限公司統(tǒng)一公開招聘119人高頻重點提升(共500題)附帶答案詳解
- 資產(chǎn)評估服務(wù)房屋征收項目測繪實施方案
- 國家安全責(zé)任制落實情況報告3篇
- 麻醉藥品、精神藥品處方權(quán)資格考試試題(2024年)
- 2024年度玩具代工生產(chǎn)及銷售合同模板(2024版)3篇
- 業(yè)主大會和業(yè)主委員會工作指導(dǎo)手冊
- 2024年小學(xué)五年級科學(xué)教學(xué)工作總結(jié)(2篇)
- 2023年首都機場集團(tuán)有限公司招聘考試真題
- 【7歷期末】安徽省蚌埠市2023-2024學(xué)年部編版七年級歷史上學(xué)期期末統(tǒng)考試卷(含解析)
- 廣東省深圳市重點中學(xué)2021-2022學(xué)年高二上學(xué)期期末生物試題
- 2024-2025學(xué)年冀教版數(shù)學(xué)五年級上冊期末測試卷(含答案)
評論
0/150
提交評論