编译原理上机实验报告_第1页
编译原理上机实验报告_第2页
编译原理上机实验报告_第3页
编译原理上机实验报告_第4页
编译原理上机实验报告_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、编译原理课内实验报告学院 计算机学院专业计算机科学与技术年级班别2012级6班学号3112006028学生姓名曾主赐辅导教师刘添添成绩2014年12月一.完成内容1 .扩充单词:(1)保留字:for,step, until,char,real,return双字符:*=,/=;(3)单字符:,*,/ ;2 .扩充语句:var a;begina:=1;doa:=a+1while a<5;write(a);end.二.设计思路1 .扩充单词1)修改变量定义:void init()int i;for(i=0;i<=255;i+)ssymi=nul;ssym'+'=plus;

2、ssym'-'=minus;ssym'*'=times;ssym'/'=slash;ssym'('=lparen;ssym')'=rparen;ssym'='=eql;ssym','=comma;ssym'.'=period;ssym'#'=neq;ssym''=semicolon;ssym''=l1;ssym''=r1;/*设置保留字名字,按照字母顺序便于折半查找*/strcpy(&(word0

3、0),"begin");strcpy(&(word10),"call");strcpy(&(word20),"char");strcpy(&(word30),"const");strcpy(&(word40),"do");strcpy(&(word50),"end");strcpy(&(word60),"for");strcpy(&(word70),"if");strcpy(&am

4、p;(word80),"odd");strcpy(&(word90),"procedure");strcpy(&(word100),"read");strcpy(&(word110),"real");strcpy(&(word120),"return");strcpy(&(word130),"step");strcpy(&(word140),"then");strcpy(&(word150),&quo

5、t;until");strcpy(&(word160),"var");strcpy(&(word170),"while");strcpy(&(word180),"write");/*设置保留字符号*/wsym0=beginsym;wsym1=callsym;wsym2=charsym;wsym3=constsym;wsym4=dosym;wsym5=endsym;wsym6=forsym;wsym7=ifsym;wsym8=oddsym;wsym9=procsym;wsym10=readsym;wsy

6、m11=realsym;wsym12=returnsym;wsym13=stepsym;wsym14=thensym;wsym15=untilsym;wsym16=varsym;wsym17=whilesym;wsym18=writesym;修改pl0.h头文件里定义的全局数据# define norw 19# define txmax 100# define nmax 14# define al 10# define amax 2047# define levmax 3# define cxmax 200*/*关键字个数*/*名字表容量*/*number的最大位数*/*符号的最大长度*/*地

7、址上界*/*最大允许过程嵌套声明层数0, lexmax*/*最多的虚拟机代码数*/*符号*/ enum 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,forsym,stepsym,untilsym,

8、 charsym,realsym,returnsym,p,q,l1,r1;#define symnum 42 /*2)修改GetSym()方法:/*词法分析,获取一个符号*/int getsym() int i,j,k;while( ch=' '|ch=1011ch=9) getchdo;)if(ch>='a'&&ch<='z')(k=0;doif(k<al)ak=ch;k+;)getchdo;while(ch>='a'&&ch<='z'|ch>=

9、'0'&&ch<='9');ak=0;strcpy(id,a);i=0;j=norw-1;dok=(i+j)/2;if(strcmp(id,wordk)<=0)j=k-1;if(strcmp(id,wordk)>=0)i=k+1;while(i<=j);if(i-1>j)sym=wsymk;printf("保留字 n");elsesym=ident;printf("标识符 n");elseif(ch>='0'&&ch<='9&

10、#39;)k=0;num=0;sym=number;donum=10*num+ch-'0'k+;getchdo;while(ch>='0'&&ch<='9'); /* 获取数字的值 */ k-;if(k>nmax)error(30);elseif(ch=':')/*检测赋值符号*/getchdo;if(ch='=')sym=becomes;printf("kn");getchdo; else sym=nul;printf("n");/*不能识

11、别的符号*/elseif(ch='*')/*xiugai*/getchdo; if(ch='=') sym=p; printf("*=n"); getchdo; else sym=times; printf("*n"); getchdo;elseif(ch='/') getchdo; if(ch='=') sym=q;printf("/=n"); getchdo; else sym=slash; printf("八n");getchdo;elseif(

12、ch='<,)/*检测小于或小于等于符号*/getchdo;if(ch='=')sym=leq;printf("<=n");getchdo;elsesym=lss;printf("<n");elseif(ch='>')/*检测大于或大于等于符号*/getchdo;if(ch='=')sym=geq;printf(">=n");getchdo;elsesym=gtr;printf(">n"); else sym=ssymch;

13、/*当符号不满足上述条件时,全部按照单 字符号处理*/printf("单字符 n");/getchdo;/richardif(sym!=period) getchdo;/end richardreturn 0;2 .扩充语句1)产生式以及语法描述图:产生式:a:=1 do a:=a+1 while a<5语法描述图:a:=1a:=a+1whilea<52)递归下降子程序:if(sym=dosym)getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlevwhilesym=true;statementdo(fsy

14、s,ptx,lev);if(sym=whilesym) getsymdo; conditiondo(nxtlev,ptx,lev); else error(18);3)举例设计语句的pcode代码:var a;begina:=1;doa:=a+1while a<5;write(a);end.1 int 0 42 int 0 13 sto 0 34 lod 0 35 lit 0 16 opr 0 27 sto 0 38 lod 0 39 lit 0 510 opr 0 1011 jpc 0 1312 jmp 0 413 lod 0 314 opr 0 1415 opr 0 1516 opr

15、 0 04)在递归下降子程序中增加语义动作:if(sym=dosym) cx1=cx;getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlevwhilesym=true;statementdo(fsys,ptx,lev); if(sym=whilesym) getsymdo;conditiondo(nxtlev,ptx,lev);cx2=cx;gendo(jpc,0,0);gendo(jmp,0,cx1); codecx2.a=cx; else error(18);三.运行测试1.扩充单词的测试(贴运行结果截图)ps:测试情况要全!图片大

16、小合适!截图如下所示:Input pl/0 file ?11.pl0 List object code ?<Y/N)y List symbol table ? <Y/N)y 0 begin保留字TABLE: NULL2 step保留字XXXX f192 until保留字2 char保留字2 real保留字return保留字2 *=单字符 单字符2 end.单字符.int 0 3! opr 0 0in pl/0 progpan iess any key to continue2.语句的测试(贴运行结果截图) 截图如下所示:Input pl/0 file ?22-pl0 List object code ?<¥/N>y List symbol table ?0 vai* a ;住留字fel1 begin保留字TABLE: 1 u

温馨提示

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

最新文档

评论

0/150

提交评论