1、PL0源程序编译原理实验代码附件1 小组成员:程序清单Main.c#include#include#includevoid 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);int factor(int*ptx,int lev);int te
2、rm(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,slash,oddsym,eql,neq,lss,leq,g
3、tr,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;char word1410=begin,call,const,do,end,if,odd,pro
4、cedure,program,read,then,var,while,write;/设置保留字名字int num;int lev=0;int tx=0;int k;int *mm;/=(int *)malloc(sizeof(int);char *id,sign14;char a14;FILE *fp1,*fp2,*fp3;void error(int n) switch(n) case 1:printf(常数说明中的=写成了:=。n); break; case 2:printf(常数说明中=后应是数字。n); break; case 3:printf(常数说明中的标识符后应是=。n); br
5、eak; case 4:printf(program,const,var,procedure后应为标识符。n); break; case 5:printf(漏掉了,或;。n); break; case 6:printf(过程说明的符号不正确。n); break; case 7:printf(应该是语句的开始符。n); break; case 8:printf(程序体内语句部分的后跟符不正确。n); break; case 9:printf(程序的结尾丢了句号.。n); break; case 10:printf(语句之间漏了;。n); break; case 11:printf(标识符未说明。
6、n); break; case 12:printf(赋值语句中,赋值号左部标识符属性应是变量。n); break; case 13:printf(赋值语句左部标识符后应是赋值号:=。n); break; case 14:printf(call后应为标识符。n); break; case 15:printf(call后标识符属性应为过程。n); break; case 16:printf(条件语句中丢了then。n); break; case 17:printf(丢了end或;。n); break; case 18:printf(while型循环语句中丢了do。n); break; case 1
7、9:printf(语句后的符号不正确。n); break; case 20:printf(应为关系运算符。n); break; case 21:printf(表达式内标识符属性不能是过程。n); break; case 22:printf(表达式中漏掉右括号)。n); break; case 23:printf(因子后的非法符号。n); break; case 24:printf(表达式的开始符不能是此符号。n); break; case 25:printf(不能识别的符号。n); break; case 26:printf(程序的层次越界。n); break; case 27:printf(
8、程序应该以program保留字开始。n); break; case 28:printf(程序没有程序主体。n); break; case 31:printf(数越界。n); break; case 32:printf(read语句括号中的标识符不是变量。n); break; case 33:printf(read/write单词后应为左括号。n); break; case 34:printf(read/write语句括号中的标识符应是申明过的变量。n); break; case 35:printf(read/write语句没有右括号。n); void getsym() int i,n=1,l=
9、0; int j,m; do while(ch= |ch=10|ch=9) if(ch=10) n+; ch=fgetc(fp1); if(ch=a&ch=z) /名字或保留字以字母开头 k=0; do if(k=a&ch=0&ch=9);/读取一串字符 ak=0; /字符串最后置结束符 id=a; /单词自身值赋给id for(i=0;i14;i+) for(j=0;j13) sym=ident; /将字符串类别值赋给sym else if(ch=0&ch=0&ch14) num=0; error(31); /数字位数超过14位出错 printf(第%d行出错n,n); k=0; *(id+
10、k)=0; ak=0; else if(ch=:) /检测赋值符号 k=0; ch=fgetc(fp1); *(id+k)=:; ak=:; if(ch=) sym=becomes; k=k+1; *(id+k)=; ak=; ch=fgetc(fp1); else error(25); sym=nul; /不能识别的符号 printf(第%d行出错n,n); else if (ch=) /检测小于或小于等于符号 k=0; ch=fgetc(fp1); *(id+k)=; ak=) /检测大于或大于等于符号 k=0; ch=fgetc(fp1); *(id+k)=; ak=; if(ch=)
11、sym=geq; k+=1; *(id+k)=; ak=; ch=fgetc(fp1); else sym=gtr; else if(ch=+|ch=-|ch=*|ch=/|ch=(|ch=)|ch=,|ch=.|ch=#|ch=;|ch=) /单字符符号处理 sym=ssymch; k=0; ak=ch; id=a; ch=fgetc(fp1); else /当符号不能满足上述条件时,全部按不能识别的符号处理 sym=nul; k=0; ak=ch; id=a; error(25); printf(第%d行出错n,n); ch=fgetc(fp1); switch(sym) case nul
12、:str=nul;break; case ident:str=ident;break; case number:str=number;break; case plus:str=plus;break; case minus:str=minus;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=l
13、eq;break; case gtr:str=gtr;break; 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=beginsym;break; case endsym:str=endsym
14、;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=dosym;break; case callsym:str=callsym;break; case constsym:str=constsym;break; case varsym:str=varsym;break; case pro
15、csym:str=procsym;break; case progsym:str=progsym;break; printf(); for(m=0;m=k;m+) printf(%c,*(id+m); *(id+k+1)=0; printf(t); printf(%s),str); printf(n); fprintf(fp2,(%s %s),id,str); fprintf(fp2,n); l+; while(sym=nul & l10);void enter(enum object k,int *ptx,int lev,int *pdx) /mm=(int *)malloc(sizeof(
16、int); int mmm; (*ptx)+; *table(*ptx).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 %d 2222222n,mmm); *mm=mmm;i
17、nt position(char *idt,int tx) int i,j,m; for(j=0;j0;i-) for(m=0;m2047) /*数字越界*/ error(31); num=0; getsym(); else /*因子为表达式*/ getsym(); expression(ptx,lev); if(sym=rparen) getsym(); else error(22); /*缺少右括号*/ return 0; /*factor*/项处理int term(int *ptx,int lev) /*term* /enum symbol mulop; /*用于保存乘除法符号,定义为全
18、局变量*/ factor(ptx,lev); /*处理因子*/ while(sym=times|sym=slash) getsym(); factor(ptx,lev); return 0; /*term*/*表达式处理*/int expression(int *ptx,int lev)/*expression* enum symbol addop; /*用于保存正负号*/ if(sym=plus|sym=minus) /*开头的正负号,此时当前表达式被看做一个正或负的项*/ addop=sym; /保存开头的正负号 getsym(); term(ptx,lev); else term(ptx
19、,lev); /处理项 while(sym=plus|sym=minus) getsym(); term(ptx,lev);/处理项 return 0; /*expression*/条件语句处理int condition(int *ptx,int lev) enum symbol relop; if(sym=oddsym) getsym(); expression(ptx,lev); else expression(ptx,lev); if(sym!=eql & sym!=neq & sym!=lss &sym!=leq & sym!=gtr &sym!=geq) error(20); els
20、e relop=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(11); else if(tablei.kind!=variable) error(12); i=0; else getsym(); if(sym=becomes) getsym(); else error(13); expression(ptx,lev); printf(赋值语句n); fprintf(fp2,赋值语句n); else if(sym=readsym) getsym(); if(sym!=lparen) error(33); else do getsym(); if(sym=ident)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1