(完整word版)PL0源程序-編譯原理實(shí)驗(yàn)代碼_第1頁
(完整word版)PL0源程序-編譯原理實(shí)驗(yàn)代碼_第2頁
(完整word版)PL0源程序-編譯原理實(shí)驗(yàn)代碼_第3頁
(完整word版)PL0源程序-編譯原理實(shí)驗(yàn)代碼_第4頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、附件 1小組成員:程序清單Main.c#include<stdio.h>#include<stdlib.h>#include<string.h>void error(int n);void getsym();/void enter(enum object k,int *ptx,int lev,int *pdx);int position(char*idt,int tx);int constdeclaration(int *ptx,int lev,int *pdx);int vardeclaration(int *ptx,int lev,int *pdx);i

2、nt factor(int*ptx,int lev);int term(int *ptx,int lev);int expression(int *ptx,int lev);int statement(int *ptx,int lev);int block();enum objectconstant,variable,procedure;struct tabchar name14;enum object kind;int val;int level;int adr;int size;table100;enum symbolnul,ident,number,plus,minus,times,sl

3、ash,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,progsym,;enum symbol sym=nul;enum symbol mulop;enum symbol wsym14;enum symbol ssym256;char ch=' 'char *str;charword141

4、0="begin","call","const","do","end","if","odd","procedure","program","read","then","var","while","write"/設(shè)置保留字名字int num;int lev=0;int tx=0;int k;int *mm;/=(int

5、*)malloc(sizeof(int);char *id,sign14;char a14;FILE *fp1,*fp2,*fp3;void error(int n)switch(n)case 1:printf("常數(shù)說明中的"="寫成了 ":="。 n");break;case 2:printf("常數(shù)說明中 "="后應(yīng)是數(shù)字。n");break;case 3:printf("常數(shù)說明中的標(biāo)識(shí)符后應(yīng)是"="。 n");break;case 4:print

6、f("program,const,var,procedure后應(yīng)為標(biāo)識(shí)符。n");break;case 5:printf("漏掉了 ","或""。 n");break;case 6:printf("過程說明的符號(hào)不正確。n");break;case 7:printf("應(yīng)該是語句的開始符。n");break;case 8:printf("程序體內(nèi)語句部分的后跟符不正確。n");break;case 9:printf("程序的結(jié)尾丟了句號(hào)"

7、;."。 n");break;case 10:printf("語句之間漏了 ""。 n");break;case 11:printf("標(biāo)識(shí)符未說明。n");break;case 12:printf("賦值語句中,賦值號(hào)左部標(biāo)識(shí)符屬性應(yīng)是變量。n");break;case 13:printf("賦值語句左部標(biāo)識(shí)符后應(yīng)是賦值號(hào)":="。n");break;case 14:printf("call后應(yīng)為標(biāo)識(shí)符。n");break;case

8、15:printf("call后標(biāo)識(shí)符屬性應(yīng)為過程。n");break;case 16:printf("條件語句中丟了"then"。 n");break;case 17:printf("丟了 "end"或""。n");break;case 18:printf("while型循環(huán)語句中丟了"do"。n");break;case 19:printf("語句后的符號(hào)不正確。n");break;case 20:printf(

9、"應(yīng)為關(guān)系運(yùn)算符。n");break;case 21:printf("表達(dá)式內(nèi)標(biāo)識(shí)符屬性不能是過程。n");break;case 22:printf("表達(dá)式中漏掉右括號(hào)" ) " 。 n");break;case 23:printf("因子后的非法符號(hào)。n");break;case 24:printf("表達(dá)式的開始符不能是此符號(hào)。n");break;case 25:printf("不能識(shí)別的符號(hào)。n");break;case 26:printf(&qu

10、ot;程序的層次越界。n");break;case 27:printf("程序應(yīng)該以program 保留字開始。 n");break;case 28:printf("程序沒有程序主體。n");break;case 31:printf("數(shù)越界。 n");break;case 32:printf("read語句括號(hào)中的標(biāo)識(shí)符不是變量。n");break;case 33:printf("read/write單詞后應(yīng)為左括號(hào)。n");break;case 34:printf("re

11、ad/write語句括號(hào)中的標(biāo)識(shí)符應(yīng)是申明過的變量。break;case 35:printf("read/write語句沒有右括號(hào)。n");n");void getsym()int i,n=1,l=0;int j,m;dowhile(ch=' '|ch=10|ch=9)if(ch=10)n+;ch=fgetc(fp1);if(ch>='a'&&ch<='z')/名字或保留字以字母開頭k=0;doif(k<10)ak=ch;k+=1;ch=fgetc(fp1);while(ch>

12、='a'&&ch<='z'|ch>='0'&&ch<='9');/讀取一串字符ak='0'id=a;/字符串最后置結(jié)束符單詞自身值賦給idfor(i=0;i<14;i+)for(j=0;j<k;j+)if(aj=wordij)/搜索當(dāng)前字符是否為保留字continue;elsebreak;if(j=k&&wordij='0')sym=wsymi;break;if(j=k&&wordij!='0

13、9;)sym=ident;break;if(i>13)sym=ident; /將字符串類別值賦給symelse if(ch>='0'&&ch<='9') / 檢測(cè)是否為數(shù)字:以 0.9 開頭 k=0;num=0;sym=number;doak=ch;num=10*num+(ch-'0');k+=1;ch=fgetc(fp1);while(ch>='0'&&ch<='9');/讀取數(shù)字,并轉(zhuǎn)換為數(shù)k-;id=a;if(k>14)num=0;error

14、(31); /數(shù)字位數(shù)超過14 位出錯(cuò)printf("第 %d行出錯(cuò) n",n);k=0;*(id+k)='0'ak='0'else if(ch=':') /k=0;檢測(cè)賦值符號(hào)ch=fgetc(fp1);*(id+k)=':'ak=':'if(ch='=')sym=becomes;k=k+1;*(id+k)='='ak='='ch=fgetc(fp1);elseerror(25);printf("sym=nul;/不能識(shí)別的符號(hào)第 %d

15、行出錯(cuò) n",n);else if (ch='<')/檢測(cè)小于或小于等于符號(hào)k=0;ch=fgetc(fp1);*(id+k)='<'ak='<'if(ch='=')sym=leq;k+=1;*(id+k)='='ak='='ch=fgetc(fp1);elsesym=lss;else if(ch='>') /檢測(cè)大于或大于等于符號(hào)k=0;ch=fgetc(fp1);*(id+k)='>'ak='>'if(

16、ch='=')sym=geq;k+=1;*(id+k)='='ak='='ch=fgetc(fp1);elsesym=gtr;elseif(ch='+'|ch='-'|ch='*'|ch='/'|ch='('|ch=')'|ch=','|ch='.'|ch='#'|ch=''|ch='=') /單字符符號(hào)處理sym=ssymch;k=0;ak=ch;id=a;ch=fget

17、c(fp1);else / 當(dāng)符號(hào)不能滿足上述條件時(shí),全部按不能識(shí)別的符號(hào)處理 sym=nul;k=0;ak=ch;id=a;error(25);printf("第 %d行出錯(cuò) n",n);ch=fgetc(fp1);switch(sym)case nul:str="nul"break;case ident:str="ident"break;case number:str="number"break;case plus:str="plus"break;case minus:str="m

18、inus"break;case times:str="times"break;case slash:str="slash"break;case oddsym:str="oddsym"break;case eql:str="eql"break;case neq:str="neq"break;case lss:str="lss"break;case leq:str="leq"break;case gtr:str="gtr"brea

19、k;case geq:str="geq"break;case lparen:str="lparen"break;case rparen:str="rparen"break;case comma:str="comma"break;case semicolon:str="semicolon"break;case period:str="period"break;case becomes:str="becomes"break;case beginsym:str=

20、"beginsym"break;case endsym:str="endsym"break;case ifsym:str="ifsym"break;case thensym:str="thensym"break;case whilesym:str="whilesym"break;case writesym:str="writesym"break;case readsym:str="readsym"break;case dosym:str="dos

21、ym"break;case callsym:str="callsym"break;case constsym:str="constsym"break;case varsym:str="varsym"break;case procsym:str="procsym"break;case progsym:str="progsym"break;printf("(");for(m=0;m<=k;m+)printf("%c",*(id+m);*(id+

22、k+1)='0'printf("t");printf("%s)",str);printf("n");fprintf(fp2,"(%s%s)",id,str);fprintf(fp2,"n");l+;while(sym=nul && l<10);void enter(enum object k,int *ptx,int lev,int *pdx)/mm=(int *)malloc(sizeof(int);int mmm;(*ptx)+;*table(*ptx)

23、.name=*sign;table(*ptx).kind=k;switch(k)case constant:table(*ptx).val=num;break;case variable:table(*ptx).level=lev;table(*ptx).adr=(*pdx);(*pdx)+;break;case procedure:table(*ptx).level=lev;break;mmm=*ptx;/printf("11111111%d2222222n",mmm);*mm=mmm;int position(char *idt,int tx)int i,j,m;for

24、(j=0;j<k+1;j+)j=*(idt+j);for(i=tx;i>0;i-)for(m=0;m<k+1;m+)if(m!=*(idt+m)break;elsecontinue;if(m=k+1 && m='0')return i;break;elsecontinue;if(i=0)return 0;/* 常量聲明處理*/int constdeclaration(int *ptx,int lev,int *pdx)if(sym=ident)*sign=*a;getsym();

25、if(sym=eql|sym=becomes)if(sym=becomes)error(1);getsym();if(sym=number)enter(constant,ptx,lev,pdx);elseerror(2);elseerror(3);elseerror(4);getsym();return 0;/* 變量聲明處理*/int vardeclaration(int *ptx,int lev,int *pdx)if(sym=ident)*sign=*a;enter(variable,ptx,lev,pdx);getsym();elseerror(4);return 0;/ 因子處理in

26、tfactor(intlev)/*factor*int i;while(sym=ident|sym=number|sym=lparen)/*ptx,int循環(huán)直到不是因子開始符號(hào)*/if(sym=ident)/*因子為常量或變量*/i=position(id,*ptx);/*查找名字*/if(i=0)error(11);/*標(biāo)示符未聲明*/getsym();else if(sym=number)if(num>2047)/*/*因子為數(shù)數(shù)字越界 */*/error(31);num=0;getsym();else/*因子為表達(dá)式*/getsym();expression(ptx,lev);i

27、f(sym=rparen)getsym();elseerror(22);/*缺少右括號(hào) */return 0;/*factor*/ 項(xiàng)處理int term(int *ptx,int lev) /*term* */enum symbol mulop; factor(ptx,lev); /*/*用于保存乘除法符號(hào),定義為全局變量處理因子 */*/while(sym=times|sym=slash)getsym();factor(ptx,lev);return 0;/*term*/* 表達(dá)式處理 */intexpression(int*ptx,intlev)/*expression*enum sym

28、bol addop; if(sym=plus|sym=minus)/*/*用于保存正負(fù)號(hào)*/開頭的正負(fù)號(hào), 此時(shí)當(dāng)前表達(dá)式被看做一個(gè)正或負(fù)的項(xiàng)*/addop=sym;/保存開頭的正負(fù)號(hào)getsym();term(ptx,lev);elseterm(ptx,lev); / while(sym=plus|sym=minus) 處理項(xiàng)getsym();term(ptx,lev);/處理項(xiàng)return 0;/*expression*/ 條件語句處理int condition(int *ptx,int lev)enum symbol relop;if(sym=oddsym)getsym();expres

29、sion(ptx,lev);elseexpression(ptx,lev);if(sym!=eql && sym!=neq && sym!=lss &&sym!=leq && sym!=gtr &&sym!=geq)error(20);elserelop=sym;getsym();expression(ptx,lev);return 0;/ 語句處理int statement(int *ptx,int lev)int i;if(sym=ident)i=position(id,*ptx);if(i=0)error(1

30、1);elseif(tablei.kind!=variable)error(12);i=0;elsegetsym();if(sym=becomes)getsym();elseerror(13);expression(ptx,lev);printf("fprintf(fp2,"賦值語句 n");賦值語句n");else if(sym=readsym)getsym();if(sym!=lparen)error(33);elsedogetsym();if(sym=ident)i=position(id,*ptx);elsei=0;if(i=0)error(34

31、);getsym();while(sym=comma);if(sym!=rparen)error(35);elsegetsym();printf("Read語句 n");fprintf(fp2,"Read語句 n");else if(sym=writesym)getsym();if(sym=lparen)dogetsym();expression(ptx,lev);while(sym=comma);printf("write語句 n");fprintf(fp2,"write語句 n");if(sym!=rparen

32、)error(35);elsegetsym();else if(sym=callsym)getsym();if(sym!=ident)error(14);elsei=position(id,*ptx);if(i=0)error(11);elseif(tablei.kind!=procedure)error(15);getsym();printf("call語句 n");fprintf(fp2,"call語句 n");elseif(sym=ifsym)getsym();condition(ptx,lev);if(sym=thensym)getsym();e

33、lseerror(16);statement(ptx,lev);printf("if語句 n");fprintf(fp2,"if語句 n");else if(sym=beginsym)getsym();statement(ptx,lev);doif(sym=semicolon)getsym();elseerror(10);statement(ptx,lev);while(sym=semicolon);printf("Begin.end語句 n");fprintf(fp2,"Begin.end語句 n");if(sy

34、m=endsym)getsym();if(sym=procsym)block();elseerror(17);else if(sym=whilesym)getsym();condition(ptx,lev);if(sym=dosym)getsym();elseerror(18);statement(ptx,lev);printf("while語句 n");fprintf(fp2,"while循環(huán) n");return 0;int block()int dx=3,tx0;tx0=tx;if(lev>3)error(26);doif(sym=const

35、sym)getsym();if(sym=ident)constdeclaration(&tx,lev,&dx);while(sym=comma)getsym();if(sym=ident)constdeclaration(&tx,lev,&dx);elseerror(4);if(sym=semicolon)getsym();elseerror(5);elseerror(4);if(sym=varsym)getsym();if(sym=ident)vardeclaration(&tx,lev,&dx);while(sym=comma)getsym(

36、);if(sym=ident)vardeclaration(&tx,lev,&dx);elseerror(4);if(sym=semicolon)getsym();elseerror(5);elseerror(4);if(sym=procsym)lev+;dogetsym();*sign=*a;if(sym=ident)enter(procedure,&tx,lev,&dx);getsym();elseerror(4);if(sym=semicolon)getsym();elseerror(5);if(-1=block()return -1;if(sym=sem

37、icolon)getsym();elseerror(5);while(sym=procsym);while(sym!=beginsym);statement(&tx,lev);tabletx0.size=dx;return 0;void main()/freopen("in.txt","r",stdin);int i,j,n;char nn14;char file1name10,file2name10,file3name10;mm=(int *)malloc(sizeof(int);printf("輸入源程序的文件名:t");

38、scanf("%s",file1name);getchar();fp1=fopen(file1name,"r");if(!fp1)printf("cannot open the filen");printf("輸入用于存放詞法分析二維表的文件的文件名:t");scanf("%s",file2name);getchar();fp2=fopen(file2name,"w");if(!fp2)printf("cannot open the filen");pri

39、ntf(" 輸入用于存放語法分析 TABLE表的文件的文件名 :t"); scanf("%s",file3name);getchar();fp3=fopen(file3name,"w");if(!fp3)printf("cannot open the filen");for(j=0;j<255;j+)ssymj=nul;ssym'+'=plus;ssym'-'=minus;ssym'*'=times;ssym'/'=slash;ssym'('=lparen;ssym')'=rparen;ssym'='=eql;ssym','=comma;ssym'.'=period;ssym'#'=neq;ssym''=semicolon;wsym0=beginsym;wsym1=callsym;wsym2=constsym;wsym3=dosym;wsym4=endsym;wsym5=ifsym;wsym6=oddsym;wsym7=procsym;wsym8=prog

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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)論