用C语言写的PL0编译器(《编译原理第二版》清华大学出版社)

上传人:小** 文档编号:159564028 上传时间:2022-10-09 格式:DOC 页数:28 大小:313KB
收藏 版权申诉 举报 下载
用C语言写的PL0编译器(《编译原理第二版》清华大学出版社)_第1页
第1页 / 共28页
用C语言写的PL0编译器(《编译原理第二版》清华大学出版社)_第2页
第2页 / 共28页
用C语言写的PL0编译器(《编译原理第二版》清华大学出版社)_第3页
第3页 / 共28页
资源描述:

《用C语言写的PL0编译器(《编译原理第二版》清华大学出版社)》由会员分享,可在线阅读,更多相关《用C语言写的PL0编译器(《编译原理第二版》清华大学出版社)(28页珍藏版)》请在装配图网上搜索。

1、测试用的程序:consta=10;varb,c;procedurep;beginc:=b+aend;beginread(b);wliileb#0dobegincallp;write(2*c);read(b);endend.*/# iiiclude/*#mcludeHplO.hH*/# mcludeHstiiiig.hH/*PL.O编译系统C版本头文件plO.h*/*tvpedefenumfalse.truebool;*/#definenonv13#definetxinax100#defineimiax14#defineal10#defineaniax2047#definelevniax3#de

2、finecxinax200enumsymbolnuLident.number.plusjiiuiusJimesslash.oddsynLeqljieqJssJeqgtr.geqJpaienjpaienxoniiiia,seinicolon.period,becomes,beguisym,endsynijfsynKtliensym,whilesym,wntesym,ieadsynKdosym,callsym5constsym,vaisym,procsym,;#definesyinnum32enumobjectconstant,variable,procedur.;enumfctlit,opr,l

3、od,sto,cal,intejmpjpc,;#definefctnum8stmctuistiuctionenumfctf;int1;inta;FILE*fas;FILE*fa;FILE*fol;FILE*fa2;boollistswitch;booltableswitch;charch;enumsymbolsym;charidal+l;uitnum;intcc.ll;mtex;charline81;charaal+l;stmetmstmctioncodecxinax;charwoidnonval;enumsymbolwsymnonr;enumsymbolssym256;charmnemoni

4、cfctnum5;booldeclbegsyssymiium;boolstatbegsyssynuium;boolfacbegsyssynmum;structtablestmctcharnainefal;enumobjectkuid;intval;mtlevel;mtadr;intsize;stmcttablestmcttabletxinax;FILE*fin;FILE*fout;charfiiameal;iiiterr;definegetsymdoif(-1=getsym()retuin-1definegetchdoif(-1=getchQ)return-1definetestdo(a,b,

5、c)if(-l=test(a,b,c)return-1definegendo(a,b,c)if(-l=gen(a,bx)return-1defineexpressiondo(a,b,c)if(-1=expression(a,bx)iemindefinefactordo(a,b,c)if(-1=factor(a?b,c)return-1definetermdo(a,b,c)if(-1=term(a,b,c)ietuindefineconditiondo(a,b,c)if(-l=condition(a,b,c)returndefinestatementdo(a,b.c)if(-l=statemen

6、t(a,b,c)retuin-1defineconstdeclarationdo(a,b,c)if(-l=constdeclaration(a,b,c)ienin-1definevardeclaiationdo(a,b,c)if(-1=vaideclaration(a,b,c)retuin-1voidenor(iiitn);mtgetsymQ;mtgetchQ;voidinit();mtgen(enumfctx.iiityjntz);iiittest(bool*si,bool*s2,intn);mte,bool*s);mtaddset(bool*srbool*school*s2,intn);m

7、tsubset(bool*srbool*sLbool*s2,intn);mtmulset(bool*srbool*sLbool*s2,intn);mtblock(iiitlev,iiittx.bool*fsvs);voidinteipretQ;mtfactor(bool*fsys.iiit*ptx.mtlev);mtterm(bool*fsysmt*ptx.iiitlev);mtcondition(bool*fsysmt*ptx.iiitlev);mtexpression(bool*fsys.int*ptx.iiitlev);mtstatement(bool*fsys.mt*ptx.intle

8、v);voidlistcod亡(intcxO);mtvardeclaiation(iiit*ptx.mtlev,int*pdx);mtconstdeclaration(iiit*ptxjntlevjnt*pdx);mtposition(char*idt,iiittx);voidenter(enumobjectkjnt*ptxjntlevjnt*pdx);mtbase(inthint*sjntb);#definestacksize500mtmam()booliixtlevsyiniium;pnntf(MIiiputpVOfile?*);scanf(”s,fhame);fiii=fbpen(fii

9、ame/,rH);if(fin)priiitf(nListobjectcode?(Y/N)”);scaiif(,%s,fiiame);listswitch=(fiiaineO=y|fiiameO=tY,);prmtf(nListsymboltable?(Y/N)M);scaiif(,%s,fiiame);tableswitch=(fiiameO=y|fhameO=fY,);fa1=fbpeii(”fh1tmp;W);fprmtfalIiiputpl-0file?”);fpriiitf(fa1sn;fhame);UUt();en=0;cc=cx=ll=0;chJ:if(-l!=getsym()f

10、a=fbpen(Hfa.mipH;,wM);fas=fopen(Mfas.tmpM/wH);addset(iixtlev.declbegsys,statbegsys,synmum);nxtlevperiod=true;if(-l=block(0.0aixtlev)fclose(fa);fclose(fal);fclose(fas);fclose(fiii);pnntW);return0;fclose(fa);fclose(fal);fclose(fas);if(sym!=penod)error(9);if(en-=0)fa2=fopen(nfa2.tmp,;,wH);mterpretQ;fcl

11、ose(fa2);elsepriiitf(nEnoisinpl/0piogramH);fclose(fin);elseprintf(”CanTopenfile!nn);pnntfC,nM);return0;voidinit()inti;fbr(i=O;i=255;i+)ssymi=nul;ssym中=plus;ssym=niini】s;ssym*=tini亡s;ssymf/slash;ssymtXlparen;ssym)=ipa代ii;ssym,=,=eql;ssymV=conmia;ssymf.period;ssyin#=n亡q;ssym:=semicolon;strcpv(&(word00

12、)/,beginH);sticpv(&(wordl0)/callH);strcpv(&(woid20FconsL);sticpv(&(woid30FdoJ;strcpv(&(word40)/endH);strcpv(&(word50)/ifr);strcpv(&(word60)/oddH);sticpv(&(word70)/,proceduieH);strcpv(&(woTd80)kacT);strcpv(&(woid90Fthe);strcpv(&(woid100),”vaFJ;sticpv(&(woid110)while”);strcpv(&(woid120)/wnten);wsymO=b

13、egiiisym;wsvm1=callsym;wsvm2=constsvm;wsvm3=dosym;wsvm4=endsvm;wsvm5=ifsym;wsvm6=oddsym;wsvm7=procsym;wsvm8=ieadsym;wsvm9=thensym;wsvml0=vaisym;wsvmfll=whilesym;wsvml2=writesym;strcpv(&(miwmoniclit0)lh”);strcpv(&(mnemonicopr0)/oprH);strcpv(&(miwmoniclod0)lod);strcpv(&(nmemonicsto0),nstoH);strcpv(&(m

14、iwmoniccal0)cal”);strcpv(&(nmemonicmte0),MuitH);sticpv(&(miwmonicjmp0),MjmpH);strcpv(&(miwmonicjpc0)jpc”);fbr(i=O;isyninum;i-H-)declbegsysi=false;statbegsysi=false;facbegsysi=false;declbegsysconstsym=ti-ue;declbegsysvarsym=tme;declbegsysprocsym=tme;statbegsysbegmsym=tiiie;statbegsyscallsym=tine;stat

15、begsysifsym=tine;statbegsyswhilesym=ti-ue;facbegsysident=tme;facbegsysnumber=tRie;facbegsyslparen=tiiie;mte,bool*s)retuinse;mtaddset(bool*sr.bool*sl,bool*s2,iiitn)inti;fbr(i=O;in;i-H-)sri=sli|s2i;return0;mtsubset(bool*sr,bool*sLbool*s2,iiitn)inti;fbr(i=0;in;i+)sii=sli&(!s2i);return0;mtmulset(bool*si

16、bool*sl,bool*s2,intn)inti;fbr(i=0;i=,a,&ch=N)k=0;doif(k=ta,&ch=O&ch=9);ak=0;strcpv(id.a);1=0;j=noiw-l;dok=(i+j)/2;if(strcmp(id,woidk)=0)i=k+l;while(i=,0&ch=,0,&chmuax)error(30);elseif(ch=Jgetchdo;if(ch=,=,)svm=becomes;Jzgetchdo;elsesvm=nul;J7elsegetchdo;if(ch=,=,)svm=leq;getchdo;elsesym=lss;elseif(c

17、h=)getchdo;if(ch=Tsym=geq;getchdo;elsesym=gtr;elsesvm=ssymch;if(sym?=penocl)getchdo;return0;mtgen(enumfctx.iiityjntz)if(cx=cxmax)pimtf(nPiogramtoolongJ;return-1;codecx.f=x;codecx.l=v;codecx.a=z;CX+;return0;mttest(bool*sl,bool*s2,intn)if(!iiiset(sym.sl)error(n);while(!iiiset(sym,si)&(!ms战(sym,s2)gets

18、vmdo;return0;mtblock(iiitlev,mttx.bool*fsvs)inti;intdx;inttxO;intcxO;booliixtlevsyiniium;dx=3;txO=tx;tabletx.adr=cx;gendo(jmp,0,0);if(levlevniax)enor(32);doif(sym=constsym)getsvmdo;doconstdeclarationdo(&txjev,&dx);while(sym=conima)getsymdo;constdeclarationdo(&txdev,&dx);1)if(sym=seniicolon)getsymdo;

19、elseerror(5);while(sym=ident);if(sym=varsym)getsvmdo;dovaideclarationdo(&txev,&dx);while(sym=conima)getsymdo;vaideclaiationdo(&txjev,&dx);1)if(sym=seniicolon)getsymdo;elseerror(5);while(sym=ident);while(sym=procsvm)getsvmdo;if(sym=ident)enter(procedui;&txev,&dx);getsvmdo;elseerror(4);if(sym=semicolo

20、n)getsvmdo;elseerror(5);memcpy(iixtlev,fsys,sizeof(bool)*synmum);iixtlevsenncolon=tnie;if(-l=block(lev+1,tx,iixtlev)return-1;if(sym=semicolon)getsvmdo;memcpy(nxtlev,statbegsys,sizeof(bool)*syninum);iixtlevident=tme;iixtlevprocsym=tiue;elsetestdo(iixtlev,fsys,6);error(5);memcpy(iixtlev,statbegsys,siz

21、eof(bool)*synmum);iixtlevident=tine;iixtlevpenod=tnie;testdo(nxtlev,declbegsys,7);while(inset(sym,declbegsys);codetabletxO.adr.a=cx;tabletxO.adr=cx;tabletxO.size=dx:cxO=cx;gendo(iiite.O,dx);if(tableswitch)pimtf(nTABLE:nH);if(txO+ltx)pnntf(”NULLn);for(i=txO+1;ianiax)error(31);num=0;table(*ptx).val=nu

22、m;break;casevariable:table(*ptx).level=lev;table(*ptx).adi-(*pdx);(*pdx)+;break;caseprocedur:table(*ptx).level=lev;break;mtposition(char*idtiiittx)mti;strcpv(tableO.nameadt);i=tx;while(sticnip(tablei.nameadt)!=O)returni;mtconstdeclaration(iiit*ptxjntlevjnt*pdx)if(sym=ident)getsymdo;if(sym=eql|svm=be

23、comes)if(sym=becomes)error(l);getsvmdo;if(sym=number)enter(constaiit,ptx,lev,pdx);getsvmdo;elseerror(2);elseenor(3);elseenor(4);return0;mtvardeclaiation(mt*ptx.mtlev.iiit*pdx)if(sym=ident)enter(variable.ptxjev,pdx);getsymdo;elseerror(4);return0;voidlistcode(iiitcxO)inti;if(listswitch)for(i=cxO;iaina

24、x)enor(31);num=0;gendo(lit.Oaium);getsvmdo;elseif(sym=lpaien)getsymdo;memcpy(nxtlev,fsvs,sizeof(bool)*synmum);iixtleviparen=tine;expressiondo(iixtlev,ptxdev);if(sym=rpaien)getsymdo;elseenor(22);testdo(fsys,facbegsys,23);retuin0;mtcondition(bool*fsysmt*ptx.iiitlev)enumsymbolrelop;booliixtlevsyininim;

25、if(sym=oddsym)getsymdo;expiessiondo(fsys.ptxjev);gendo(opr.0.6);elsememcpy(iixtle;fsys,sizeof(bool)*synmum);iixtleveql=tRie;iixtlevneq=tme;iixtlevlss=tiue;iixtlevleq=tRie;iixtlevgtr=tine;iixtlevgeq=tme;expressiondo(nxtlev,ptx,lev);if(sym?=eql&sym!=neq&sym!=lss&sym?=leq&sym!=gtr&sym!=geq)enor(20);els

26、erelop=sym;getsvmdo;expressiondo(fsvs.ptxjev);switch(relop)caseeql:gendo(opr,0,8);break;caseneq:gendo(opr,0,9);break;caselss:gendo(opr,0,10);break;casegeq:gendo(opr.OJl);break;casegti:gendo(opr,0J2);break;caseleq:gendo(opr,0,13);break;return0;voidinteipretQintp,b,t;stmctiiistmctioni;intsstacksize;pn

27、ntf(MstartplOE);t=o;b=0;p=0;s0=sl=s2=0;doi=codep;P+;switch(i.f)caselit:st=i.a;t+;break;caseopr:switch(i.a)case0:t=b;p=st+2;b=st+l;break;case1:st-l=-st-l;break;case2:t-Sst-l=st-l+st;break;case3:t-Sst-l=st-l-st;break;case4:t-Sst-l=st-l*st;break;case5:t-Sst-l=st-l/st;break;case6:st-l=st-l%2;break;case8:t-Sst-l=(st-l=st);break;case9:t-SsM=(sM!=st);break;case10:t-Sst-l=(st-l=st);break;case12:t-Sst-l=(st-lst);break;case13:t-Sst-l=(st-l0)bl=sbl;1-;returnbl;

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!