ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:20.07KB ,
资源ID:4387208      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4387208.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(PL0源程序编译原理实验代码.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

PL0源程序编译原理实验代码.docx

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