




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
programPL0(file1,{label99;}norw=txmax=nmax=al=amax=levmax=cxmax=200;symbol=(nul,ident,number,plus,minus,times,slash,oddsym,eql,neq,lss,leq,gtr,geq,lparen,rparen,comma,semicolon, es,beginsym,endsym,ifsym,thensym,whilesym,writesym,readsym,dosym,callsym,constsym,varsym,procsym);alfa=packedarray[1..al]ofchar;object_my=(constant,variable,procedure_my);symset=setofsymbol;fct=(lit,opr,lod,sto,cal,int,jmp,jpc);{functions}instruction=packedrecordf:l:a:0..amax;{LIT0,aOPRLODl,aSTOl,aCALl,aINT0,aJMP0,aJPC0,afile2,file3:text;ch:sym:symbol;id:alfa;num:integer;cc:integer;ll:kk,err:integer;cx:integer;line:array[1..81]ofchar;a:alfa;code:array[0..cxmax]ofinstruction;word:array[1..norw]ofalfa;wsym:array[1..norw]ofsymbol;ssym:array[char]ofsymbol;mnemonic:array[fct]ofpackedarray[1..5]ofchar;declbegsys,statbegsys,facbegsys:symset;table:array[0..txmax]ofname:casekind:object_myofconstant:(val:integer);variable,procedure_my:(level,adr,size:integer)procedureerror(n:integer);wrin('****','':cc-1,'@',n:wrin(file1,'****','':cc-1,'@',n:2);err:=err+1endprocedureexitProcedure;endFile:=true;wrin;procedurevari,j,k:integer;proceduregetch;ifcc=llthenifeof(fileIn)then {Recegoto99}wrin;ll:=cc:=0;write(cx:5,'');write(file2,cx:5,'');whilenoteoln(fileIn)doll:=ll+1;read(fileIn,ch);write(file2,ch);line[ll]:=chwrin;ll:=ll+1;read(fileIn,line[ll]);read(fileIn,ch);cc:=cc+1;ch:=line[cc];end{getch};begin{getsym}whilech=''doifchin['a'..'z']thenbegink:=0;ifk<althenk:=k+a[k]:=untilnot(chin['a'..'z','0'..'9']);ifk>=kkthenkk:=ka[kk]:='';kk:=kk-untilkk=id:=i:=j:=norw;k:=(i+j)divifid<=word[k]thenj:=k-1;ifid>=word[k]theni:=k+1;untili>ifi-1>jsym:=wsym[k]sym:=ifchin['0'..'9']thenk:=num:=sym:=number;num:=10*num+(ord(ch)-ord('0'));k:=k+1;untilnot(chin['0'..'9']);ifk>nmaxthenifch=':'thenifch='='thensym:= sym:=nul;else*如果讀到不是字母/數(shù)字/ifchthen**)getch;*再讀一個(gè)字符ifchthen**)symleq;**)getch(*讀一個(gè)字符*)else*小于號(hào)后不是跟著等號(hào)symlss(*那就是一個(gè)單獨(dú)的小于號(hào)else*讀到不是字母/數(shù)字/冒號(hào)/小于號(hào)ifchthen*讀到大于號(hào),則類似于處理小于號(hào)*)getch*ifchthen*讀到等號(hào)*)symgeq**)getch(*讀一個(gè)字符*)else*symgtr*beginsym:=ssym[ch];getchendproceduregen(x:fct;y,z:integer);ifcx>cxmaxbeginwrite('PROGRAMTOO{Recegoto99}withcode[cx]beginf:=x;l:=y;a:=zcx:=cx+1end{gen};proceduretest(s1,s2:symset;n:integer);ifnot(symins1)beginerror(n);s1:=s1+s2;whilenot(symins1)dogetsymendprocedureblock(lev,tx:integer;fsys:symset);dx:integer;tx0:integer;cx0:procedureenter(k:object_my);tx:=txwithtable[tx]beginname:=id;kind:=k;casekofconstant:ifnum>amaxbeginerror(31);num:=0end;val:=numvariable:level:=lev;adr:=dx;dx:=dx+1;procedure_my:level:=levendfunctionposition(id:alfa):integer;vari:integer;table[0].name:=id;i:=whiletable[i].name<>iddoi:=i-position:=endprocedureconstdeclaration;ifsym=identthenbegingetsym;ifsymin[eql, es]thenifsym= esthenerror(1);ifsym=numberbeginenter(constant);getsymelseerror(2)endelseerror(3)endelseendprocedurevardeclaration;ifsym=identbeginenter(variable);getsymendelseerror(4)endprocedurelistcode;vari:integer;iflistswitchthen**)fori:=cx0tocx-1dowithcode[i]dowrin(i:4,mnemonic[f]:5,l:3,a:wrin(file1,i:4,mnemonic[f]:5,l:3,a:5)endprocedurestatement(fsys:symset);vari,cx1,cx2:integer;procedureexpression(fsys:varaddop:symbol;procedureterm(fsys:symset);varmulop:procedurefactor(fsys:symset);vari:integer;begintest(facbegsys,fsys,24);whilesyminfacbegsysdoifsym=identtheni:=ifi=0thenerror(11)elsewithtable[i]docasekindconstant:gen(lit,0,val);variable:gen(lod,lev-level,adr);procedure_my:error(21)endifsym=numberthenifnum>amaxbeginerror(31);num:=0end;gen(lit,0,num);getsymendifsym=lparenthenbegingetsym;ifsym=rparenthengetsymelseerror(22)test(fsys,facbegsys,23)endbegin{term}factor(fsys+[times,slash]);whilesymin[times,slash]domulop:=sym;getsym;factor(fsys+[times,slash]);ifmulop=timesthengen(opr,0,elsegen(opr,0,end{term};begin{expression}ifsymin[plus,minus]thenaddop:=sym;getsym;term(fsys+[plus,minus]);ifaddop=minusthengen(opr,0,1)endelseterm(fsys+[plus,minus]);whilesymin[plus,minus]doaddop:=sym;getsym;term(fsys+[plus,minus]);ifaddop=plusthengen(opr,0,elsegen(opr,0,endprocedurecondition(fsys:symset);varrelop:symbol;ifsym=oddsymthengetsym;expression(fsys);gen(opr,0,6)endelseexpression([eql,neq,lss,gtr,leq,geq]+fsys);ifnot(symin[eql,neq,lss,leq,gtr,geq])error(20)elserelop:=sym;getsym;expression(fsys);caserelopofeql:gen(opr,0,neq:gen(opr,0,lss:gen(opr,0,geq:gen(opr,0,gtr:gen(opr,0,leq:gen(opr,0,13);end{condition};begin{statement}ifsym=identthenbegini:=position(id);ifi=0thenerror(11)iftable[i].kind<>variablethenbeginerror(12);i:=0;end;ifsym= esthengetsymelseerror(13);ifi<>0withtable[i]dogen(sto,lev-level,adr)endelseifsymreadsymthen(*read語(yǔ)句getsym*獲得下一tokenifsymlparenthen*如果read語(yǔ)句后跟的不是左括號(hào)*)error(34)(*34號(hào)錯(cuò)誤*)repeat(*循環(huán)得到read語(yǔ)句括號(hào)中的參數(shù)表,依次產(chǎn)生相應(yīng)的“從鍵盤讀入”目標(biāo)代碼*)getsym*獲得一個(gè)token,正常應(yīng)是一個(gè)變量名*)ifsym=identthen(*如果確為一個(gè)標(biāo)識(shí)符*)(*這里略有問(wèn)題,還應(yīng)判斷一下這個(gè)標(biāo)識(shí)符是不是變量名,如果是常量名或過(guò)程名應(yīng)出錯(cuò)*)iposition(id)(*查符號(hào)表,找到它所在位置給i,找不到時(shí)i會(huì)為0*)i0*不是標(biāo)識(shí)符則有問(wèn)題,i0作出錯(cuò)標(biāo)志*)ifi=0then(*如果有錯(cuò)誤*)error(35)(*拋出35號(hào)錯(cuò)誤*)else(**)withtable[i]dogen(opr016*生成指令:從鍵盤讀入數(shù)字gen(sto,levleveladr*生成sto指令,把讀入的值存入指定變量所在的空間*)getsym(*獲取下一個(gè)token,如果是逗號(hào),則read語(yǔ)還沒(méi)完,否則應(yīng)當(dāng)是右括號(hào)*)untilsym<>(*不斷生成代碼直到read語(yǔ)句的參數(shù)表中的變量遍歷完為止,這里遇到不是逗號(hào),應(yīng)為右括號(hào)ifsymrparenthen(**)error(33);(*拋出33號(hào)錯(cuò)誤whilenotsyminfsysdo(*依靠fsys集,找到下一個(gè)合法的token,恢復(fù)語(yǔ)法分析*)getsym*read語(yǔ)句正常結(jié)束,得到下一個(gè)一般為分號(hào)或endifsymwritesymthen*如果遇到了write語(yǔ)句getsym*獲取下一token*)ifsym=lparenthen(*如確為左括號(hào)*)repeat(*依次獲取括號(hào)中的每一個(gè)值,進(jìn)行輸出*)getsym*獲得一個(gè)token*)expression([rparen,comma]+(*調(diào)用expression用于出錯(cuò)恢復(fù)的集合中加上右括號(hào)和逗號(hào)gen(opr0,14)*14號(hào)指令:向屏幕輸出*)untilsym<>comma;(*循環(huán)直到遇到的不再是逗號(hào),ifsymrparenthen**)error(33)(*33號(hào)錯(cuò)誤*)getsym(*獲取下一個(gè)token,為后面分析作準(zhǔn)備gen(opr0,15)(*生成15號(hào)操作指令:輸出一個(gè)換行*)(*由此可知PL/0write語(yǔ)句與Pascal中的wrin*)ifsym=callsymthenbegingetsym;ifsym<>identthenerror(14)elsei:=ifi=0thenerror(11)elsewithtable[i]doifkind=procedure_mythengen(cal,lev-level,adr)elseerror(15);endelseifsym=ifsymgetsym;condition([thensym,dosym]+fsys);ifsym=thensymthengetsymelseerror(16);cx1:=cx;gen(jpc,0,0);statement(fsys);code[cx1].a:=cxendelseifsym=beginsymthengetsym;statement([semicolon,endsym]+fsys);whilesymin[semicolon]+statbegsysdoifsym=semicolonthengetsymelseerror(10);statement([semicolon,endsym]+fsys)ifsym=endsymthengetsymelseerror(17)endelseifsym=whilesymthencx1:=cx;getsym;condition([dosym]+fsys);cx2:=cx;gen(jpc,0,0);ifsym=dosymthengetsymelseerror(18);statement(fsys);gen(jmp,0,cx1);code[cx2].a:=cxtest(fsys,[],19)end{statement};begindx:=3;tx0:=tx;table[tx].adr:=cx;gen(jmp,0,0);iflev>levmaxthenerror(32);ifsym=constsymthenbegingetsym;whilesym=commabegingetsym;constdeclarationifsym=semicolonthengetsymelseerror(5)untilsym<>identifsym=varsymthenbegingetsym;whilesym=commabegingetsym;vardeclarationifsym=semicolonthengetsymelseerror(5)untilsym<>ident;whilesym=procsymdobegingetsym;ifsym=identbeginenter(procedure_my);getsymendelseerror(4);ifsym=semicolonthengetsymelseerror(5);block(lev+1,tx,[semicolon]+fsys);ifsym=semicolonthenbegingetsym;test(statbegsys+[ident,procsym],fsys,6)elseerror(5)test(statbegsys+[ident],declbegsys,7)untilnot(symindeclbegsys);code[table[tx0].adr].a:=cx;withtable[tx0]beginadr:=cx;size:=dx;cx0:=cx;gen(int,0,dx);statement([semicolon,endsym]+fsys);gen(opr,0,0);test(fsys,[],8);end{block};procedureconststacksize=500;varp,b,t:integer;i:s:array[1..stacksize]ofinteger;functionbase(l:integer):integer;varb1:integer;b1:=b;whilel>0dobeginb1:=s[b1];l:=l-1end;base:=b1endbeginwrin('STARTPL/0');t:=0;b:=1;p:=0;s[1]:=0;s[2]:=0;s[3]:=i:=code[p];p:=p+1;withidocasefoflit:begint:=t+1;s[t]:=aopr:casea:t:=b-1;p:=s[t+3];b:=:s[t]:=-:t:=t-1;s[t]:=s[t]-s[t+1]:t:=t-1;s[t]:=s[t]-s[t+1]:t:=t-1;s[t]:=s[t]*s[t+1]:t:=t-1;s[t]:=s[t]divs[t+1]:s[t]:=ord(odd(s[t]));8:begint:=t-1;s[t]:=ord(s[t]=s[t+1])9:begint:=t-s[t]:=ord(s[t]<>s[t+1])10:begint:=t-s[t]:=ord(s[t]<s[t+1])11:begint:=t-s[t]:=ord(s[t]>=s[t+1])12:begint:=t-s[t]:=ord(s[t]>s[t+1])13:begint:=t-s[t]:=ord(s[t]<=s[t+1])14:*14*)write(s[t]);(*輸出棧頂值*)write(file3s[t**)t:=t-1(*棧頂下移*)15:*15號(hào)操作為輸出換行操作*) (*輸出換行wrin(file3**)16:*16號(hào)操作是接受鍵盤值輸入到棧頂*)tt1;(**)write('?');(*屏顯問(wèn)號(hào)*)write(file3,'?');(* (*獲得輸入wrin(file3,s[t]);(*把用戶輸入值打印到文件lod:t:=t+1;s[t]:=s[base(l)+a]sto:s[base(l)+a]:=s[t];{wrin(s[t]);}t:=t-1cal:begin{generatenewblockmark}s[t+1]:=base(l);s[t+2]:=b;s[t+3]:=p;b:=t+1;p:=aint:t:=t+a;jmp:p:=a;jpc:beginifs[t]=0thenp:=a;t:=t-1end{with,case}untilp=0;write('ENDPL/0');close(file3)*關(guān)閉用于記錄屏幕輸入輸出的file3文件(*PCODE代碼的解釋執(zhí)行過(guò)程結(jié)束end{interpret};forch:=''to'@'dossym[ch]:=word[1]:= ';word[2]:= word[3]:= ';word[4]:= word[5]:= ';word[6]:= word[7]:= ';word[8]:='PROCEDUREword[9]:='THEN ';word[10]:='VAR word[11]:='WHILE wsym[1]:=beginsym; wsym[2]:=callsym;wsym[3]:=constsym; wsym[4]:=dosym;wsym[5]:=endsym; wsym[6]:=ifsym;wsym[7]:=oddsym; wsym[8]:=procsym;wsym[9]:=readsym;wsym[10]:=thensym;wsym[11]:=varsym;wsym[12]:=whilesym;wsym[13]:=writesym;ssym['+']:= ssym['-']:=ssym['*']:= ssym['/']:=ssym['(']:= ssym[')']:=ssym['=']:= ssym[',']:=ssym['.']:= ssym['!']:=ssym['<']:= ssym['>']:=ssym['$']:=leq; ssym['#']:=geq;ssym[';']:=semicolon;mnemonic[lit]:='LIT'; mnemonic[opr]:='OPR';mnemonic[lod]:='LOD'; mnemonic[sto]:='STO';mnemonic[cal]:='CAL'; mnemonic[int]:='INT';mnemonic[jmp]:='JMP'; mn
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- TY/T 2004-2024田徑場(chǎng)地設(shè)施手冊(cè)
- 精神認(rèn)同課題申報(bào)書(shū)
- 教育課題申報(bào)書(shū)框架
- 浙江省教研課題申報(bào)書(shū)
- 信息技術(shù)相關(guān)課題申報(bào)書(shū)
- 小學(xué)微型課題申報(bào)書(shū)范文
- 受托噴涂加工合同范本
- 個(gè)人買賣叉車合同范本
- 漢語(yǔ)語(yǔ)言課題申報(bào)書(shū)
- 青年課題申報(bào)書(shū)模板
- 高等數(shù)學(xué)考研輔導(dǎo)課(一)學(xué)習(xí)通超星課后章節(jié)答案期末考試題庫(kù)2023年
- 心理健康與職業(yè)生涯(中職)PPT完整全套教學(xué)課件
- 中國(guó)文藝美學(xué)要略·論著·《畫(huà)學(xué)心法問(wèn)答》
- 公共藝術(shù)-音樂(lè)篇(中職公共藝術(shù))PPT完整版全套教學(xué)課件
- 高等教育自學(xué)考試轉(zhuǎn)考轉(zhuǎn)出登記表
- 舞臺(tái)搭建方面基礎(chǔ)知識(shí)
- 食品化學(xué)課件 ②食品化學(xué)緒論
- 小學(xué)六年級(jí)數(shù)學(xué)計(jì)算題100道(含答案)
- 【讀寫(xiě)策略】回延安朗讀指導(dǎo)
- 孟氏骨折與蓋氏骨折
- sg-uap v3.00高級(jí)開(kāi)發(fā)手冊(cè)分冊(cè)1概述
評(píng)論
0/150
提交評(píng)論