編譯原理(PL0編譯程序源代碼)_第1頁(yè)
編譯原理(PL0編譯程序源代碼)_第2頁(yè)
編譯原理(PL0編譯程序源代碼)_第3頁(yè)
編譯原理(PL0編譯程序源代碼)_第4頁(yè)
編譯原理(PL0編譯程序源代碼)_第5頁(yè)
已閱讀5頁(yè),還剩24頁(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)介

下載可編輯/*PL/0編譯程序(C語(yǔ)言版)*編譯和運(yùn)行環(huán)境 :*VisualC++6.0*WinXP/7*使用方法:*運(yùn)行后輸入 PL/0源程序文件名*回答是否將虛擬機(jī)代碼寫入文件*回答是否將符號(hào)表寫入文件*執(zhí)行成功會(huì)產(chǎn)生四個(gè)文件 (詞法分析結(jié)果.txt符號(hào)表.txt虛擬代碼.txt源程序和地址 .txt)*/#include<stdio.h>#include"pl0.h"#include"string"#definestacksize500// 解釋執(zhí)行時(shí)使用的棧intmain(){boolnxtlev[symnum];printf("請(qǐng)輸入源程序文件名 :");scanf("%s",fname);fin=fopen(fname,"r");// 以只讀方式打開(kāi) pl0源程序文件cifa=fopen(" 詞法分析結(jié)果.txt","w");fa1=fopen(" 源程序和地址 .txt","w");// 輸出源文件 及各行對(duì)應(yīng)的首地址fprintf(fa1," 輸入pl0源程序文件名:");fprintf(fa1,"%s\n",fname);if(fin){printf("是否將虛擬機(jī)代碼寫入文件 ?(Y/N)");//是否輸出虛擬機(jī)代碼scanf("%s",fname);listswitch=(fname[0]=='y'||fname[0]=='Y');printf(" 是否將符號(hào)表寫入文件 ?(Y/N)");//是否輸出符號(hào)表scanf("%s",fname);tableswitch=(fname[0]=='y'||fname[0]=='Y');init();//初始化err=0;cc=cx=ll=0;ch='';if(-1!=getsym()){fa=fopen(" 虛擬代碼.txt","w");fas=fopen(" 符號(hào)表.txt","w");.專業(yè).整理.下載可編輯addset(nxtlev,declbegsys,statbegsys,symnum);nxtlev[period]=true;if(-1==block(0,0,nxtlev)){// 調(diào)用編譯程序fclose(fa);fclose(fa1);fclose(fas);fclose(fin);return0;}if(sym!=period){error(9);// 結(jié)尾丟失了句號(hào)}if(err!=0){printf("pl0 源程序出現(xiàn)錯(cuò)誤 ,退出編譯!!!請(qǐng)從第一個(gè)錯(cuò)誤處開(kāi)始修改.\n\n");fprintf(cifa," 源程序出現(xiàn)錯(cuò)誤 ,請(qǐng)檢查!!!");fprintf(fa1," 源程序出現(xiàn)錯(cuò)誤 ,請(qǐng)檢查!!!");fprintf(fa," 源程序出現(xiàn)錯(cuò)誤 ,請(qǐng)檢查!!!");fprintf(fas," 源程序出現(xiàn)錯(cuò)誤 ,請(qǐng)檢查!!!");}fclose(fa);fclose(fa1);fclose(fas);}fclose(fin);}else{printf("Can'topenfile!\n");}fclose(cifa);//printf("\n");return0;}voidinit(){// 初始化inti;for(i=0;i<=255;i++)ssym[i]=nul;// 設(shè)置單字符符號(hào)ssym['+']=plus;ssym['-']=minus;ssym['*']=times;ssym['/']=slash;ssym['(']=lparen;.專業(yè).整理.下載可編輯ssym[')']=rparen;ssym['=']=eql;ssym[',']=comma;ssym['.']=period;ssym['#']=neq;ssym[';']=semicolon;strcpy(&(word[0][0]),"begin");// 保留字設(shè)置,以字母順序排列 便于折半查找strcpy(&(word[1][0]),"call");strcpy(&(word[2][0]),"const");strcpy(&(word[3][0]),"do");strcpy(&(word[4][0]),"end");strcpy(&(word[5][0]),"if");strcpy(&(word[6][0]),"odd");strcpy(&(word[7][0]),"procedure");strcpy(&(word[8][0]),"read");strcpy(&(word[9][0]),"then");strcpy(&(word[10][0]),"var");strcpy(&(word[11][0]),"while");strcpy(&(word[12][0]),"write");wsym[0]=beginsym;// 設(shè)置保留字類別 一字即一類wsym[1]=callsym;wsym[2]=constsym;wsym[3]=dosym;wsym[4]=endsym;wsym[5]=ifsym;wsym[6]=oddsym;wsym[7]=procsym;wsym[8]=readsym;wsym[9]=thensym;wsym[10]=varsym;wsym[11]=whilesym;wsym[12]=writesym;strcpy(&(mnemonic[lit][0]),"lit");// 設(shè)置指令名稱strcpy(&(mnemonic[opr][0]),"opr");strcpy(&(mnemonic[lod][0]),"lod");strcpy(&(mnemonic[sto][0]),"sto");strcpy(&(mnemonic[cal][0]),"cal");strcpy(&(mnemonic[inte][0]),"int");.專業(yè).整理.下載可編輯strcpy(&(mnemonic[jmp][0]),"jmp");strcpy(&(mnemonic[jpc][0]),"jpc");for(i=0;i<symnum;i++){// 設(shè)置符號(hào)集declbegsys[i]=false;statbegsys[i]=false;facbegsys[i]=false;}declbegsys[constsym]=true;// 設(shè)置聲明開(kāi)始符號(hào)集declbegsys[varsym]=true;declbegsys[procsym]=true;statbegsys[beginsym]=true;// 設(shè)置語(yǔ)句開(kāi)始符號(hào)集statbegsys[callsym]=true;statbegsys[ifsym]=true;statbegsys[whilesym]=true;facbegsys[ident]=true;// 設(shè)置因子開(kāi)始符號(hào)集facbegsys[number]=true;facbegsys[lparen]=true;}//用數(shù)組實(shí)現(xiàn)集合的集合運(yùn)算intinset(inte,bool*s){returns[e];}intaddset(bool*sr,bool*s1,bool*s2,intn){inti;for(i=0;i<n;i++)sr[i]=s1[i]||s2[i];return0;}voiderror(intn){// 出錯(cuò)處理,打印出錯(cuò)位置和錯(cuò)誤編碼charspace[81];memset(space,32,81);space[cc-1]=0;printf("error(%d)",n);fprintf(fa1,"error(%d)",n);switch(n){.專業(yè).整理.下載可編輯case1:printf("\t\t 常量說(shuō)明中的“=”寫成“:=”\n");fprintf(fa1,"\t\t 常量說(shuō)明中的 “=”寫成“:=”\n");break;case2:printf("\t\t 常量說(shuō)明中的=后應(yīng)該是數(shù)字\n");fprintf(fa1,"\t\t 常量說(shuō)明中的 =后應(yīng)該是數(shù)字\n");break;case3:printf("\t\t 常量說(shuō)明符中的表示符應(yīng)該是 =\n");fprintf(fa1,"\t\t 常量說(shuō)明符中的表示符應(yīng)該是 =\n");break;case4:printf("\t\tconst,var,procedure 后應(yīng)為標(biāo)識(shí)符 \n");fprintf(fa1,"\t\tconst,var,procedure 后應(yīng)為標(biāo)識(shí)符\n");break;case5:printf("\t\t 漏掉了“,”或“;”\n");fprintf(fa1,"\t\t 漏掉了“,”或“;”\n");break;case6:printf("\t\t 過(guò)程說(shuō)明后的符號(hào)不正確 \n");fprintf(fa1,"\t\t 過(guò)程說(shuō)明后的符號(hào)不正確 \n");break;case7:printf("\t\t 應(yīng)是語(yǔ)句開(kāi)始符 \n");fprintf(fa1,"\t\t 應(yīng)是語(yǔ)句開(kāi)始符 \n");break;case8:printf("\t\t 程序體內(nèi)語(yǔ)句部分的后跟符不正確 \n");fprintf(fa1,"\t\t程序體內(nèi)語(yǔ)句部分的后跟符不正確\n");break;case9:printf("\t\t 程序結(jié)尾丟了句號(hào) “.”\n\n");fprintf(fa1,"\t\t 程序結(jié)尾丟了句號(hào) “.”\n");break;case10:printf("\t\t 語(yǔ)句之間漏了“;”\n");.專業(yè).整理.下載可編輯fprintf(fa1,"\t\t 語(yǔ)句之間漏了 “;”\n");break;case11:printf("\t\t 標(biāo)識(shí)符拼寫錯(cuò)誤或未說(shuō)明 \n");fprintf(fa1,"\t\t 標(biāo)識(shí)符拼寫錯(cuò)誤或未說(shuō)明 \n");break;case12:printf("\t\t 賦值語(yǔ)句中,賦值號(hào)左部標(biāo)識(shí)符屬性應(yīng)是變量 \n");fprintf(fa1,"\t\t 賦值語(yǔ)句中,賦值號(hào)左部標(biāo)識(shí)符屬性應(yīng)是變量\n");break;case13:printf("\t\t 賦值語(yǔ)句左部標(biāo)識(shí)符后應(yīng)是復(fù)制號(hào) “:=”\n");fprintf(fa1,"\t\t 賦值語(yǔ)句左部標(biāo)識(shí)符后應(yīng)是復(fù)制號(hào) “:=”\n");break;case14:printf("\t\tcall 后應(yīng)為標(biāo)識(shí)符 \n");fprintf(fa1,"\t\tcall 后應(yīng)為標(biāo)識(shí)符 \n");break;case15:printf("\t\tcall 后標(biāo)識(shí)符屬性應(yīng)為過(guò)程 \n");fprintf(fa1,"\t\tcall 后標(biāo)識(shí)符屬性應(yīng)為過(guò)程 \n");break;case16:printf("\t\t 條件語(yǔ)句中丟了 then\n");fprintf(fa1,"\t\t 條件語(yǔ)句中丟了 then\n");break;case17:printf("\t\t 丟了“end”或“;”\n");fprintf(fa1,"\t\t 丟了“end”或“;”\n");break;case18:printf("\t\twhile 型循環(huán)語(yǔ)句中丟了 “do”\n");fprintf(fa1,"\t\twhile 型循環(huán)語(yǔ)句中丟了 “do”\n");break;case19:printf("\t\t 語(yǔ)句后的符號(hào)不正確 \n");fprintf(fa1,"\t\t 語(yǔ)句后的符號(hào)不正確 \n");.專業(yè).整理.下載可編輯break;case20:printf("\t\t 應(yīng)為關(guān)系運(yùn)算符 \n");fprintf(fa1,"\t\t 應(yīng)為關(guān)系運(yùn)算符 \n");break;case21:printf("\t\t 表達(dá)式內(nèi)標(biāo)示符屬性不能是過(guò)程 \n");fprintf(fa1,"\t\t 表達(dá)式內(nèi)標(biāo)示符屬性不能是過(guò)程 \n");break;case22:printf("\t\t 表達(dá)式漏掉了右括號(hào) \n");fprintf(fa1,"\t\t 表達(dá)式漏掉了右括號(hào) \n");break;case23:printf("\t\t 因子后的非法符號(hào) \n");fprintf(fa1,"\t\t 因子后的非法符號(hào) \n");break;case24:printf("\t\t 表達(dá)式的開(kāi)始符不能是此符號(hào) \n");fprintf(fa1,"\t\t 表達(dá)式的開(kāi)始符不能是此符號(hào) \n");break;case25:printf("\t\t 標(biāo)識(shí)符越界\n");fprintf(fa1,"\t\t 標(biāo)識(shí)符越界\n");break;case26:printf("\t\t 非法字符\n");fprintf(fa1,"\t\t 非法字符\n");break;case31:printf("\t\t 數(shù)越界\n");fprintf(fa1,"\t\t 數(shù)越界\n");break;case32:printf("\t\tread 語(yǔ)句括號(hào)中的標(biāo)識(shí)符不是變量 \n");fprintf(fa1,"\t\tread語(yǔ)句括號(hào)中的標(biāo)識(shí)符不是變量\n");break;case33:.專業(yè).整理.下載可編輯printf("\t\twrite() 或read()中應(yīng)為完整表達(dá)式 \n");fprintf(fa1,"\t\twrite() 或read()中應(yīng)為完整表達(dá)式 \n");break;default:printf("\t\t 出現(xiàn)未知錯(cuò)誤 \n");fprintf(fa1,"\t\t 出現(xiàn)未知錯(cuò)誤 \n");}err++;}漏掉空格,讀取一個(gè)字符,每次讀一行,存入line緩沖區(qū),line被getsym取空后再讀一行,被函數(shù)getsym調(diào)用intgetch(){if(cc==ll){if(feof(fin)){printf("programincomplete");return-1;}ll=0;cc=0;printf("\n%d",cx);fprintf(fa1,"\n%d",cx);ch='';while(ch!=10){if(EOF==fscanf(fin,"%c",&ch)){line[ll]=0;break;}printf("%c",ch);fprintf(fa1,"%c",ch);line[ll]=ch;ll++;}fprintf(cifa,"\n");}ch=line[cc];cc++;return0;}intgetsym(){// 詞法分析inti,j,k,l;.專業(yè).整理.下載可編輯while(ch==''||ch==10||ch==9)// 忽略空格 換行TABgetchdo;if(ch>='a'&&ch<='z'){// 以字母開(kāi)頭的為保留字或者標(biāo)識(shí)符k=0,l=1;do{if(k<al){//al 為標(biāo)識(shí)符或保留字最大長(zhǎng)度a[k]=ch;k++;}if(k==al&&l==1){error(25);l=0;}getchdo;}while(ch>='a'&&ch<='z'||ch>='0'&&ch<='9');a[k]=0;// 末尾存零strcpy(id,a);i=0;j=norw-1;do{//開(kāi)始折半查找k=(i+j)/2;if(strcmp(id,word[k])<=0){j=k-1;}if(strcmp(id,word[k])>=0){i=k+1;}}while(i<=j);if(i-1>j){// 找到即為保留字sym=wsym[k];fprintf(cifa,"%s\t\t%ssym\n",id,id);//printf("%s\t\t%ssym\n",id,id);}else{//否則為標(biāo)識(shí)符或數(shù)字sym=ident;fprintf(cifa,"%s\t\tident\n",id);//printf("%s\t\tident\n",id);}}else{.專業(yè).整理.下載可編輯if(ch>='0'&&ch<='9'){k=0;num=0;sym=number;do{num=10*num+ch-'0';// 數(shù)字的數(shù)位處理k++;getchdo;}while(ch>='0'&&ch<='9');k--;if(k>nmax){// 數(shù)字的長(zhǎng)度限制fprintf(cifa,"0\t\tnumber\n");num=0;error(31);}elsefprintf(cifa,"%d\t\tnumber\n",num);//printf("%d\t\tnumber\n",num);}else{if(ch==':'){//檢測(cè)賦值符號(hào),:只能和=匹配,否則不能識(shí)別getchdo;if(ch=='='){sym=becomes;fprintf(cifa,":=\t\tbecomes\n");getchdo;}else{sym=nul;}}else{if(ch=='<'){getchdo;if(ch=='='){sym=leq;// 小于等于fprintf(cifa,"<=\t\tleq\n");getchdo;}else{sym=lss;//小于fprintf(cifa,"<\t\tlss\n");}.專業(yè).整理.下載可編輯}else{if(ch=='>'){getchdo;if(ch=='='){sym=geq;// 大于等于fprintf(cifa,">=\t\tgeq\n");getchdo;}else{sym=gtr;// 大于fprintf(cifa,">\t\tgtr\n");}}else{sym=ssym[ch];// 不滿足上述條件時(shí) 按單字//符處理switch(ch){case'+':fprintf(cifa,"%c\t\tplus\n",ch);break;case'-':fprintf(cifa,"%c\t\tminus\n",ch);break;case'*':fprintf(cifa,"%c\t\ttimes\n",ch);break;case'/':fprintf(cifa,"%c\t\tslash\n",ch);break;case'(':fprintf(cifa,"%c\t\tlparen\n",ch);break;case')':fprintf(cifa,"%c\t\trparen\n",ch);break;case'=':fprintf(cifa,"%c\t\teql\n",ch);break;case',':fprintf(cifa,"%c\t\tcomma\n",ch);.專業(yè).整理.下載可編輯break;case'#':fprintf(cifa,"%c\t\tneq\n",ch);break;case';':fprintf(cifa,"%c\t\tsemicolon\n",ch);break;case'.':break;default:error(26);}if(sym!=period){// 判斷是否結(jié)束getchdo;}else{printf("\n");fprintf(cifa,".\t\tperiod\n");}}}}}}return0;}生成目標(biāo)代碼//目標(biāo)代碼的功能碼,層差和位移量intgen(enumfctx,inty,intz){if(cx>=cxmax){// 如果目標(biāo)代碼索引過(guò)大 ,報(bào)錯(cuò)printf("Programtoolong");return-1;}code[cx].f=x;code[cx].l=y;code[cx].a=z;cx++;return0;}測(cè)試字符串.專業(yè).整理.下載可編輯inttest(bool*s1,bool*s2,intn){if(!inset(sym,s1)){// 測(cè)試sym是否屬于 s1,不屬于則報(bào)錯(cuò) nerror(n);while((!inset(sym,s1))&&(!inset(sym,s2))){// 檢測(cè)不通過(guò)時(shí) ,不停獲得符號(hào) ,直到它屬于需要或補(bǔ)救的集合getsymdo;}}return0;}編譯程序主體//lev:當(dāng)前分程序所在層,tx:名字表當(dāng)前尾指針fsys:當(dāng)前模塊后跟符號(hào)集合intblock(intlev,inttx,bool*fsys){inti;intdx;// 名字分配到的相對(duì)地址inttx0;// 保留初始 txintcx0;// 保留初始 cxboolnxtlev[symnum];dx=3;//相對(duì)地址從 3開(kāi)始,前3個(gè)單元即 0、1、2單元分別為 SL:靜態(tài)鏈;//DL:動(dòng)態(tài)鏈;RA:返回地址tx0=tx;// 記錄本層的初始位置table[tx].adr=cx;gendo(jmp,0,0);if(lev>levmax){// 層數(shù)超過(guò) 3error(32);}do{if(sym==constsym){// 收到常量聲明printf("該語(yǔ)句為常量定義語(yǔ)句 \n");getsymdo;do{constdeclarationdo(&tx,lev,&dx);// 常量聲明處理,dx會(huì)改變所以使用指針while(sym==comma){// 處理一次多常量定義getsymdo;constdeclarationdo(&tx,lev,&dx);}if(sym==semicolon){// 常量聲明處理結(jié)束.專業(yè).整理.下載可編輯getsymdo;}else{error(5);// 漏掉了逗號(hào)或者分號(hào) (一般是分號(hào))}}while(sym==ident);}if(sym==varsym){// 收到變量聲明printf("該語(yǔ)句為變量聲明語(yǔ)句 \n");getsymdo;do{vardeclarationdo(&tx,lev,&dx);// 變量聲明處理while(sym==comma){// 處理一次多變量定義getsymdo;vardeclarationdo(&tx,lev,&dx);}if(sym==semicolon){// 變量聲明處理結(jié)束getsymdo;}else{error(5);// 漏掉逗號(hào)或者分號(hào)}}while(sym==ident);}while(sym==procsym){// 收到過(guò)程聲明printf("該語(yǔ)句為過(guò)程聲明語(yǔ)句 \n");getsymdo;if(sym==ident){enter(procedur,&tx,lev,&dx);// 記錄過(guò)程名getsymdo;}else{error(4);// 過(guò)程聲明后應(yīng)為標(biāo)識(shí)符}if(sym==semicolon){getsymdo;}else{error(5);// 漏掉了分號(hào)}memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[semicolon]=true;.專業(yè).整理.下載可編輯if(-1==block(lev+1,tx,nxtlev)){return-1;}if(sym==semicolon){getsymdo;memcpy(nxtlev,statbegsys,sizeof(bool)*symnum);nxtlev[ident]=true;nxtlev[procsym]=true;testdo(nxtlev,fsys,6);}else{error(5);}}memcpy(nxtlev,statbegsys,sizeof(bool)*symnum);nxtlev[ident]=true;nxtlev[period]=true;testdo(nxtlev,declbegsys,7);}while(inset(sym,declbegsys));// 直到?jīng)]有聲明符號(hào)code[table[tx0].adr].a=cx;// 開(kāi)始生成當(dāng)前過(guò)程代碼table[tx0].adr=cx;// 當(dāng)前過(guò)程代碼地址table[tx0].size=dx;cx0=cx;gendo(inte,0,dx);// 生成分配內(nèi)存代碼if(tableswitch){// 輸出符號(hào)表if(tx0+1<tx){fprintf(fas,"TABLE:\n");//printf("NULL\n");}for(i=tx0+1;i<=tx;i++){switch(table[i].kind){caseconstant:fprintf(fas,"%dconst%s",i,table[i].name);fprintf(fas,"val=%d\n",table[i].val);break;casevariable:fprintf(fas,"%dvar%s",i,table[i].name);fprintf(fas,"lev=%daddr=%d\n",table[i].level,table[i].adr);break;caseprocedur:.專業(yè).整理.下載可編輯fprintf(fas,"%dproc%s",i,table[i].name);fprintf(fas,"lev=%daddr=%dsize=%d\n",table[i].level,table[i].adr,table[i].size);break;}}}memcpy(nxtlev,fsys,sizeof(bool)*symnum);// 每個(gè)后跟符號(hào)集和都包含上層后跟符號(hào)集和,以便補(bǔ)救nxtlev[semicolon]=true;nxtlev[endsym]=true;statementdo(nxtlev,&tx,lev);gendo(opr,0,0);//每個(gè)過(guò)程出口都要使用的釋放數(shù)據(jù)指令memset(nxtlev,0,sizeof(bool)*symnum);// 分程序沒(méi)有補(bǔ)救集合testdo(fsys,nxtlev,8);// 檢測(cè)后跟符號(hào)集的正確性listcode(cx0);// 輸出代碼return0;}//k:constvarprocedure//ptx:符號(hào)表尾的指針//pdx:dx 為當(dāng)前應(yīng)分配變量的相對(duì)地址//lev:符號(hào)名字所在的層次 //往符號(hào)表中添加voidenter(enumobjectk,int*ptx,intlev,int*pdx){(*ptx)++;strcpy(table[(*ptx)].name,id);table[(*ptx)].kind=k;switch(k){caseconstant:if(num>amax){error(31);num=0;}table[(*ptx)].val=num;break;casevariable:table[(*ptx)].level=lev;table[(*ptx)].adr=(*pdx);(*pdx)++;.專業(yè).整理.下載可編輯break;caseprocedur:table[(*ptx)].level=lev;break;}}尋找符號(hào)在符號(hào)表中的地址intposition(char*idt,inttx){inti;strcpy(table[0].name,idt);i=tx;//符號(hào)表尾while(strcmp(table[i].name,idt)!=0){i--;}returni;}常量聲明處理intconstdeclaration(int*ptx,intlev,int*pdx){if(sym==ident){getsymdo;if(sym==eql||sym==becomes){if(sym==becomes){error(1);}getsymdo;if(sym==number){enter(constant,ptx,lev,pdx);getsymdo;}else{error(2);}}else{error(3);}}else{error(4);}return0;}變量聲明處理.專業(yè).整理.下載可編輯intvardeclaration(int*ptx,intlev,int*pdx){if(sym==ident){enter(variable,ptx,lev,pdx);getsymdo;}else{error(4);}return0;}輸出目標(biāo)代碼清單voidlistcode(intcx0){inti;if(listswitch){for(i=cx0;i<cx;i++){fprintf(fa,"%d%s%d%d\n",i,mnemonic[code[i].f],code[i].l,code[i],a);}}}語(yǔ)句處理intstatement(bool*fsys,int*ptx,intlev){inti,cx1,cx2;boolnxtlev[symnum];if(sym==ident){i=position(id,*ptx);if(i==0){error(11);}else{if(table[i].kind!=variable){error(12);i=0;}else{getsymdo;if(sym==becomes){getsymdo;printf("該語(yǔ)句為賦值語(yǔ)句 。\n");}else{error(13);.專業(yè).整理.下載可編輯}memcpy(nxtlev,fsys,sizeof(bool)*symnum);expressiondo(nxtlev,ptx,lev);if(i!=0){gendo(sto,lev-table[i].level,table[i].adr);}}}//if(i==0)}else{//保留字匹配if(sym==readsym){printf("該語(yǔ)句為讀語(yǔ)句 \n");getsymdo;if(sym!=lparen){error(34);}else{do{getsymdo;if(sym==ident){i=position(id,*ptx);}else{i=0;}if(i==0){error(35);}else{gendo(opr,0,16);gendo(sto,lev-table[i].level,table[i].adr);}getsymdo;}while(sym==comma);}if(sym!=rparen){error(33);while(!inset(sym,fsys)){getsymdo;}}else{.專業(yè).整理.下載可編輯getsymdo;}}else{if(sym==writesym){printf("該語(yǔ)句為寫語(yǔ)句 \n");getsymdo;if(sym==lparen){do{getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[rparen]=true;nxtlev[comma]=true;expressiondo(nxtlev,ptx,lev);gendo(opr,0,14);}while(sym==comma);if(sym!=rparen){error(33);}else{getsymdo;}}gendo(opr,0,15);}else{if(sym==callsym){printf("該語(yǔ)句為調(diào)用語(yǔ)句 \n");getsymdo;if(sym!=ident){error(14);}else{i=position(id,*ptx);if(i==0){error(11);}else{if(table[i].kind==procedur){gendo(cal,lev-table[i].level,table[i].adr);}else{error(15);}}getsymdo; }.專業(yè).整理.下載可編輯}else{if(sym==ifsym){printf("該語(yǔ)句為if條件語(yǔ)句\n");getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[rparen]=true;nxtlev[comma]=true;conditiondo(nxtlev,ptx,lev);if(sym==thensym){getsymdo;}else{error(16);}cx1=cx;gendo(jpc,0,0);statementdo(fsys,ptx,lev);code[cx1].a=cx;}else{if(sym==beginsym){getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[rparen]=true;nxtlev[comma]=true;statementdo(nxtlev,ptx,lev);while(inset(sym,statbegsys)||sym==semicolon){if(sym==semicolon){getsymdo;}else{error(10);}statementdo(nxtlev,ptx,lev);}if(sym==endsym){getsymdo;}else{error(17);}}else{.專業(yè).整理.下載可編輯if(sym==whilesym){printf("該語(yǔ)句為 while循環(huán)語(yǔ)句\n");cx1=cx;getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[dosym]=true;conditiondo(nxtlev,ptx,lev);cx2=cx;gendo(jpc,0,0);if(sym==dosym){getsymdo;}else{error(18);}statementdo(fsys,ptx,lev);gendo(jmp,0,cx1);code[cx2].a=cx;}else{memset(nxtlev,0,sizeof(bool)*symnum);testdo(fsys,nxtlev,19);}}}}}}}return0;}intexpression(bool*fsys,int*ptx,intlev){enumsymboladdop;boolnxtlev[symnum];if(sym==plus||sym==minus){addop=sym;getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[plus]=true;nxtlev[minus]=true;termdo(fsys,ptx,lev);.專業(yè).整理.下載可編輯if(addop==minus)gendo(opr,0,1);}else{memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[plus]=true;nxtlev[minus]=true;termdo(fsys,ptx,lev);}while(sym==plus||sym==minus){addop=sym;getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[plus]=true;nxtlev[minus]=true;termdo(nxtlev,ptx,lev);if(addop==plus){gendo(opr,0,2);}else{gendo(opr,0,3);}}return0;}intterm(bool*fsys,int*ptx,intlev){enumsymbolmulop;boolnxtlev[symnum];memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[times]=true;nxtlev[slash]=true;factordo(nxtlev,ptx,lev);while(sym==times||sym==slash){mulop=sym;getsymdo;factordo(nxtlev,ptx,lev);if(mulop==times){gendo(opr,0,4);}else{gendo(opr,0,5);}.專業(yè).整理.下載可編輯}return0;}intfactor(bool*fsys,int*ptx,intlev){inti;boolnxtlev[symnum];testdo(facbegsys,fsys,24);while(inset(sym,facbegsys)){if(sym==ident){i=position(id,*ptx);if(i==0){error(11);}else{switch(table[i].kind){caseconstant:gendo(lit,0,table[i].val);break;casevariable:gendo(lod,lev-table[i].level,table[i].adr);break;caseprocedur:error(21);break;}}getsymdo;}else{if(sym==number){if(num>amax){error(31);num=0;}gendo(lit,0,num);getsymdo;}else{if(sym==lparen){getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[rparen]=true;expressiondo(nxtlev,ptx,lev);if(sym==rparen){.專業(yè).整理.下載可編輯getsymdo;}else{error(22);}}testdo(fsys,facbegsys,23);}}}return0;}intcondition(bool*fsys,int*ptx,intlev){enumsymbolrelop;boolnxtlev[symnum];if(sym==oddsym){getsymdo;expressiondo(fsys,ptx,lev);gendo(opr,0,6);}else{memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[eql]=true;nxtlev[neq]=true;nxtlev[lss]=true;nxtlev[leq]=true;nxtlev[gtr]=true;nxtlev[geq]=true;expressiondo(nxtlev,ptx,lev);if(sym!=eql&&sym!=neq&&sym!=lss&&sym!=leq&&sym!=gtr&&sym!=geq){error(20);}else{relop=sym;getsymdo;expressiondo(fsys,ptx,lev);switch(relop){caseeql:gendo(opr,0,8);break;caseneq:gendo(opr,0,9);break;.專業(yè).整理.下載可編輯caselss:gendo(opr,0,10);break;casegeq:gendo(opr,0,11);break;casegtr:gendo(opr,0,12);break;caseleq:gendo(opr,0,13);break;}}}return0;}//pl0 頭文件#definenorw13#definetxmax100#definenmax14#defineal10#defineamax2047#definelevmax3#definecxmax200enumsymbol{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,};#definesymnum32enumobject{.專業(yè).整理.constant,variable,procedur,};enumfct{lit, opr,sto, cal,jmp, jpc,};#definefctnum8structinstruction{enumfctf

溫馨提示

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