编译原理(PL0编译程序源代码)

上传人:汽*** 文档编号:486985928 上传时间:2023-02-02 格式:DOCX 页数:21 大小:28.36KB
返回 下载 相关 举报
编译原理(PL0编译程序源代码)_第1页
第1页 / 共21页
编译原理(PL0编译程序源代码)_第2页
第2页 / 共21页
编译原理(PL0编译程序源代码)_第3页
第3页 / 共21页
编译原理(PL0编译程序源代码)_第4页
第4页 / 共21页
编译原理(PL0编译程序源代码)_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《编译原理(PL0编译程序源代码)》由会员分享,可在线阅读,更多相关《编译原理(PL0编译程序源代码)(21页珍藏版)》请在金锄头文库上搜索。

1、精选优质文档-倾情为你奉上/*PL/0编译程序(C语言版)*编译和运行环境:*Visual C+6.0*WinXP/7*使用方法:*运行后输入PL/0源程序文件名*回答是否将虚拟机代码写入文件*回答是否将符号表写入文件*执行成功会产生四个文件 (词法分析结果.txt符号表.txt虚拟代码.txt源程序和地址.txt)*/ #include #includepl0.h#includestring#define stacksize 500/解释执行时使用的栈int main()bool nxtlevsymnum;printf(请输入源程序文件名:);scanf(%s,fname);fin=fope

2、n(fname,r);/以只读方式打开pl0源程序文件cifa=fopen(词法分析结果.txt,w);fa1=fopen(源程序和地址.txt,w);/输出源文件 及各行对应的首地址fprintf(fa1,输入pl0源程序文件名:);fprintf(fa1,%sn,fname);if(fin)printf(是否将虚拟机代码写入文件?(Y/N);/是否输出虚拟机代码scanf(%s,fname);listswitch=(fname0=y|fname0=Y); printf(是否将符号表写入文件?(Y/N);/是否输出符号表scanf(%s,fname);tableswitch=(fname0=

3、y|fname0=Y);init();/初始化err=0;cc=cx=ll=0;ch= ;if(-1!=getsym()fa=fopen(虚拟代码.txt,w);fas=fopen(符号表.txt,w);addset(nxtlev,declbegsys,statbegsys,symnum);nxtlevperiod=true;if(-1=block(0,0,nxtlev)/调用编译程序fclose(fa);fclose(fa1);fclose(fas);fclose(fin);return 0;if(sym!=period)error(9);/结尾丢失了句号if(err!=0)printf(p

4、l0源程序出现错误,退出编译!请从第一个错误处开始修改.nn);fprintf(cifa,源程序出现错误,请检查!);fprintf(fa1,源程序出现错误,请检查!);fprintf(fa,源程序出现错误,请检查!);fprintf(fas,源程序出现错误,请检查!);fclose(fa);fclose(fa1); fclose(fas);fclose(fin);elseprintf(Cant open file!n); fclose(cifa);/printf(n);return 0;void init()/初始化int i;for(i=0;i=255;i+)ssymi=nul;/设置单字

5、符符号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(

6、&(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;ws

7、ym9=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;i

8、symnum;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

9、;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;void error(int n)/出错处理,打印出错位置和错误编码char space81;memset(space, 32,81);spacecc-1=0;printf(error(%d),n);fprintf(fa1,error(%d),n);switch(n)case 1:printf

10、(tt常量说明中的“=”写成“:=”n); fprintf(fa1,tt常量说明中的“=”写成“:=”n);break;case 2:printf(tt常量说明中的=后应该是数字n); fprintf(fa1,tt常量说明中的=后应该是数字n);break;case 3:printf(tt常量说明符中的表示符应该是=n ); fprintf(fa1,tt常量说明符中的表示符应该是=n);break;case 4:printf(ttconst,var,procedure后应为标识符n ); fprintf(fa1,ttconst,var,procedure后应为标识符n);break;case

11、5:printf(tt漏掉了“,”或“;”n ); fprintf(fa1,tt漏掉了“,”或“;”n );break;case 6:printf(tt过程说明后的符号不正确n ); fprintf(fa1,tt过程说明后的符号不正确n);break;case 7:printf(tt应是语句开始符n ); fprintf(fa1,tt应是语句开始符n );break;case 8:printf(tt程序体内语句部分的后跟符不正确n ); fprintf(fa1,tt程序体内语句部分的后跟符不正确n );break;case 9:printf(tt程序结尾丢了句号“.”nn ); fprintf(fa1,tt程序结尾丢了句号“.”n);break;case 10:printf(tt语句之间漏了“;”n ); fprintf(fa1,tt语句之间漏了“;”n);break;case 11:printf(tt标识符拼写错误或未说明n ); fprintf(fa1,tt标识符拼写错误或未说明n);break;case 12:printf(tt赋值语句中,赋值号左部标识符属性应是变量n ); fprintf(fa1,tt赋值语句中,赋值号左部标识符属性应是变量n);break;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号