




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/*测试用的程序:const a=10;var b,c;procedure p;beginc:=b+aend;beginread(b);while b#0 dobegin call p;write(2*c);read(b);endend.*/#include/*#includepl0.h*/#includestring.h/*PL/0编译系统C版本头文件pl0.h*/*typedef enumfalse,truebool;*/#define norw 13#define txmax 100#define nmax 14#define al 10#define amax 2047#define levmax 3#define cxmax 200enum symbolnul,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,;#define symnum 32enum objectconstant,variable,procedur,;enum fctlit,opr,lod,sto,cal,inte,jmp,jpc,;#define fctnum 8struct instructionenum fct f;int l;int a;FILE* fas;FILE* fa;FILE* fa1;FILE* fa2;bool listswitch;bool tableswitch;char ch;enum symbol sym;char idal+1;int num;int cc,ll;int cx;char line81;char aal+1;struct instruction codecxmax;char wordnorwal;enum symbol wsymnorw;enum symbol ssym256;char mnemonicfctnum5;bool declbegsyssymnum;bool statbegsyssymnum;bool facbegsyssymnum;struct tablestructchar nameal;enum object kind;int val;int level;int adr;int size;struct tablestruct tabletxmax;FILE* fin;FILE* fout;char fnameal;int err;#define getsymdo if(-1=getsym()return -1#define getchdo if(-1=getch()return -1#define testdo(a,b,c) if(-1=test(a,b,c)return -1#define gendo(a,b,c) if(-1=gen(a,b,c)return -1#define expressiondo(a,b,c) if(-1=expression(a,b,c)return -1#define factordo(a,b,c) if(-1=factor(a,b,c)return -1#define termdo(a,b,c) if(-1=term(a,b,c)return -1#define conditiondo(a,b,c) if(-1=condition(a,b,c)return -1#define statementdo(a,b,c) if(-1=statement(a,b,c)return -1#define constdeclarationdo(a,b,c) if(-1=constdeclaration(a,b,c)return -1#define vardeclarationdo(a,b,c) if(-1=vardeclaration(a,b,c)return -1void error(int n);int getsym();int getch();void init();int gen(enum fct x,int y,int z);int test(bool* s1,bool* s2,int n);int inset(int e,bool* s);int addset(bool* sr,bool* s1,bool* s2,int n);int subset(bool* sr,bool* s1,bool* s2,int n);int mulset(bool* sr,bool* s1,bool* s2,int n);int block(int lev,int tx,bool* fsys);void interpret();int factor(bool* fsys,int* ptx,int lev);int term(bool* fsys,int* ptx,int lev);int condition(bool* fsys,int* ptx,int lev);int expression(bool* fsys,int* ptx,int lev);int statement(bool* fsys,int* ptx,int lev);void listcode(int cx0);int vardeclaration(int* ptx,int lev,int* pdx);int constdeclaration(int* ptx,int lev,int*pdx);int position(char* idt,int tx);void enter(enum object k,int* ptx,int lev,int* pdx);int base(int l,int* s,int b);#define stacksize 500int main()bool nxtlevsymnum;printf(Input pl/0 file?);scanf(%s,fname);fin=fopen(fname,r);if(fin)printf(List object code? (Y/N);scanf(%s,fname);listswitch=(fname0=y|fname0=Y);printf(List symbol table?(Y/N);scanf(%s,fname);tableswitch=(fname0=y|fname0=Y);fa1=fopen(fa1.tmp,w);fprintf(fa1,Input pl/0 file?);fprintf(fa1,%sn,fname);init();err=0;cc=cx=ll=0;ch= ;if(-1!=getsym()fa=fopen(fa.tmp,w);fas=fopen(fas.tmp,w);addset(nxtlev,declbegsys,statbegsys,symnum);nxtlevperiod=true;if(-1=block(0,0,nxtlev)fclose(fa);fclose(fa1);fclose(fas);fclose(fin);printf(n);return 0;fclose(fa);fclose(fa1);fclose(fas);if(sym!=period)error(9);if(err=0)fa2=fopen(fa2.tmp,w);interpret();fclose(fa2);elseprintf(Errors in pl/0 program);fclose(fin);elseprintf(Cant open file!n);printf(n);return 0;void init()int i;for(i=0;i=255;i+)ssymi=nul;ssym+=plus;ssym-=minus;ssym*=times;ssym/=slash;ssym(=lparen;ssym)=rparen;ssym=eql;ssym,=comma;ssym.=period;ssym#=neq;ssym;=semicolon;strcpy(&(word00),begin);strcpy(&(word10),call);strcpy(&(word20),const);strcpy(&(word30),do);strcpy(&(word40),end);strcpy(&(word50),if);strcpy(&(word60),odd);strcpy(&(word70),procedure);strcpy(&(word80),read);strcpy(&(word90),then);strcpy(&(word100),var);strcpy(&(word110),while);strcpy(&(word120),write);wsym0=beginsym;wsym1=callsym;wsym2=constsym;wsym3=dosym;wsym4=endsym;wsym5=ifsym;wsym6=oddsym;wsym7=procsym;wsym8=readsym;wsym9=thensym;wsym10=varsym;wsym11=whilesym;wsym12=writesym;strcpy(&(mnemoniclit0),lit);strcpy(&(mnemonicopr0),opr);strcpy(&(mnemoniclod0),lod);strcpy(&(mnemonicsto0),sto);strcpy(&(mnemoniccal0),cal);strcpy(&(mnemonicinte0),int);strcpy(&(mnemonicjmp0),jmp);strcpy(&(mnemonicjpc0),jpc);for(i=0;isymnum;i+)declbegsysi=false;statbegsysi=false;facbegsysi=false;declbegsysconstsym=true;declbegsysvarsym=true;declbegsysprocsym=true;statbegsysbeginsym=true;statbegsyscallsym=true;statbegsysifsym=true;statbegsyswhilesym=true;facbegsysident=true;facbegsysnumber=true;facbegsyslparen=true;int inset(int e,bool *s)return se;int addset(bool *sr,bool *s1,bool *s2,int n)int i;for(i=0;in;i+)sri=s1i|s2i;return 0;int subset(bool *sr,bool *s1,bool *s2,int n)int i;for(i=0;in;i+)sri=s1i&(!s2i);return 0;int mulset(bool *sr,bool *s1,bool *s2,int n)int i;for(i=0;i=a&ch=z)k=0;doif(k=a&ch=0&ch=9);ak=0;strcpy(id,a);i=0;j=norw-1;dok=(i+j)/2;if(strcmp(id,wordk)=0)i=k+1;while(ij)sym=wsymk;elsesym=ident;elseif(ch=0&ch=0&chnmax)error(30);elseif(ch=:)getchdo;if(ch=)sym=becomes;getchdo;elsesym=nul;elseif(ch=)getchdo;if(ch=)sym=geq;getchdo;elsesym=gtr;elsesym=ssymch;if(sym!=period)getchdo;return 0;int gen(enum fct x,int y,int z)if(cx=cxmax)printf(Program too long);return -1;codecx.f=x;codecx.l=y;codecx.a=z;cx+;return 0;int test(bool *s1,bool *s2,int n)if(!inset(sym,s1)error(n);while(!inset(sym,s1)&(!inset(sym,s2)getsymdo;return 0;int block(int lev,int tx,bool *fsys)int i;int dx;int tx0;int cx0;bool nxtlevsymnum;dx=3;tx0=tx;tabletx.adr=cx;gendo(jmp,0,0);if(levlevmax)error(32);doif(sym=constsym)getsymdo;doconstdeclarationdo(&tx,lev,&dx);while(sym=comma)getsymdo;constdeclarationdo(&tx,lev,&dx);if(sym=semicolon)getsymdo;elseerror(5);while(sym=ident);if(sym=varsym)getsymdo;dovardeclarationdo(&tx,lev,&dx);while(sym=comma)getsymdo;vardeclarationdo(&tx,lev,&dx);if(sym=semicolon)getsymdo;elseerror(5);while(sym=ident);while(sym=procsym)getsymdo;if(sym=ident)enter(procedur,&tx,lev,&dx);getsymdo;elseerror(4);if(sym=semicolon)getsymdo;elseerror(5);memcpy(nxtlev,fsys,sizeof(bool)* symnum);nxtlevsemicolon=true;if(-1=block(lev+1,tx,nxtlev)return -1;if(sym=semicolon)getsymdo;memcpy(nxtlev,statbegsys,sizeof(bool)* symnum);nxtlevident=true;nxtlevprocsym=true;testdo(nxtlev,fsys,6);elseerror(5);memcpy(nxtlev,statbegsys,sizeof(bool)* symnum);nxtlevident=true;nxtlevperiod=true;testdo(nxtlev,declbegsys,7);while(inset(sym,declbegsys);codetabletx0.adr.a=cx;tabletx0.adr=cx;tabletx0.size=dx;cx0=cx;gendo(inte,0,dx);if(tableswitch)printf(TABLE:n);if(tx0+1tx)printf(NULLn);for(i=tx0+1;iamax)error(31);num=0;table(*ptx).val=num;break;case variable:table(*ptx).level=lev;table(*ptx).adr=(*pdx);(*pdx)+;break;case procedur:table(*ptx).level=lev;break;int position(char* idt,int tx)int i;strcpy(,idt);i=tx;while(strcmp(,idt)!=0)i-;return i;int constdeclaration(int* ptx,int lev,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;elseerror(2);elseerror(3);elseerror(4);return 0;int vardeclaration(int* ptx,int lev,int* pdx)if(sym=ident)enter(variable,ptx,lev,pdx);getsymdo;elseerror(4);return 0;void listcode(int cx0)int i;if(listswitch)for(i=cx0;iamax)error(31);num=0;gendo(lit,0,num);getsymdo;elseif(sym=lparen)getsymdo;memcpy(nxtlev,fsys,sizeof(bool)* symnum);nxtlevrparen=true;expressiondo(nxtlev,ptx,lev);if(sym=rparen)getsymdo;elseerror(22);testdo(fsys,facbegsys,23);return 0;int condition(bool* fsys,int* ptx,int lev)enum symbol relop;bool nxtlevsymnum;if(sym=oddsym)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 现场工人培训课件
- 2025年海上风力发电场运维管理设备故障诊断与创新技术探索报告
- 2025年基因检测在遗传性肿瘤流行病学调查中的应用前景报告
- 2025年家具制造业个性化定制生产模式下的定制家具行业市场风险与应对策略研究
- 2025年环境影响评价公众参与政策法规解读与应用报告
- 现代礼仪知识培训课件
- 2026届上海市鲁迅中学化学高一第一学期期中学业质量监测模拟试题含解析
- 现代殡葬知识培训课件
- 浙江省温州市苍南县巨人中学2026届高三化学第一学期期中质量跟踪监视试题含解析
- 2025年英语四六级考试听力对话理解专项训练模拟试卷
- 化学实验室通风柜安装安全操作规程
- 【川剧剧本欣赏】《白蛇传》
- 2024版痤疮专业知识课件
- 五金O2O模式-洞察分析
- 综合与实践-设计自己的运算程序教学设计
- 海尔采购管理
- 乡镇污水处理设施运行维护管理制度
- 湖南省长沙市长郡教育集团2024-2025学年上学期七年级数学期中考试试卷(含答案)
- 反恐防暴应急知识培训
- 《跨境电商基础与实务》全套教学课件
- 出生医学证明警示教育培训
评论
0/150
提交评论