1、|fname0=Y printf(是否将符号表写入文件?/是否输出符号表 tableswitch=(fname0= init();/初始化 err=0; cc=cx=ll=0; ch= ; if(-1!=getsym() fa=fopen(虚拟代码.txt fas=fopen(符号表.txt addset(nxtlev,declbegsys,statbegsys,symnum); nxtlevperiod=true; if(-1=block(0,0,nxtlev)/调用编译程序 fclose(fa); fclose(fa1); fclose(fas); fclose(fin); return
2、0; if(sym!=period) error(9);/结尾丢失了句号 if(err!=0) printf(pl0源程序出现错误,退出编译请从第一个错误处开始修改.nn fprintf(cifa,源程序出现错误,请检查 fprintf(fa1, fprintf(fa, fprintf(fas, fclose(fa); fclose(fa1); fclose(fin); elseCant open file!n fclose(cifa);/printf( return 0;void init()/初始化 int i; for(i=0;ia&chz)/以字母开头的为保留字或者标识符 k=0,l=
3、1; do if(k|ch09 ak=0;/末尾存零 strcpy(id,a); i=0; j=norw-1; do/开始折半查找 k=(i+j)/2; if(strcmp(id,wordk) i=k+1; while(ij)/找到 即为保留字 sym=wsymk; fprintf(cifa,%stt%ssymn,id,id); else/否则为标识符或数字 sym=ident;%sttidentn,id); else if(ch) k=0; num=0; sym=number; do num=10*num+ch-/数字的数位处理 getchdo; while(ch k-; if(knmax)
4、/数字的长度限制0ttnumbern num=0; error(31); else fprintf(cifa,%dttnumbern,num); else if(ch=:)/检测赋值符号,:只能和=匹配,否则不能识别 if(ch= sym=becomes;=ttbecomesn getchdo; else sym=nul; else if(ch= sym=geq;/大于等于 fprintf(cifa,=ttgeqn getchdo; else sym=gtr;/大于ttgtrn sym=ssymch;/不满足上述条件时 按单字 /符处理 switch(ch) casefprintf(cifa,
5、%cttplusnbreak; case %cttminusn%ctttimesn%cttslashn%cttlparenn%cttrparenn%ctteqln%cttcomman%cttneqn%cttsemicolonn default :error(26); if(sym!=period)/判断是否结束 printf( fprintf(cifa,.ttperiodn return 0;/生成目标代码/目标代码的功能码,层差和位移量int gen(enum fct x,int y,int z) if(cx=cxmax)/如果目标代码索引过大,报错Program too long return -1; codecx.f=x; codecx.l=y; codecx.a=z; cx+;/测试字符串int test(bool* s1,bool* s2,int n) if(!inset(sym,s1)/测试sym是否属于s1,不属于则报错n error(n);while(!inset(sym,s1)&(!inset(sym,s2)/检测不通过时,不停获得符号,直到它属于需要或补救的集合 getsymdo;/编译程序主体/lev:当前分程序
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1