编译原理上机试验报告_第1页
编译原理上机试验报告_第2页
编译原理上机试验报告_第3页
编译原理上机试验报告_第4页
编译原理上机试验报告_第5页
免费预览已结束,剩余11页可下载查看

下载本文档

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

文档简介

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

2、#39;=plus;ssym'-'=mi nus;ssym'*'=times;ssym'/'=slash;ssym'('=lpare n;ssym')'=rpare n;ssym'='=eql;ssym','=comma;ssym'.'二period;ssym#=neq;ssym''=semico Ion;ssym''=l1;ssym''=r1;/*设置保留字名字,按照字母顺序,便于折半查找*/strcpy(&(

3、word00),"begi n");strcpy(&(word10),"call");strcpy(&(word20),"cha广);strcpy(&(word30),"c on st");strcpy(&(word40),"do");strcpy(&(word 50),"e nd");strcpy(&(word 60),"for");strcpy(&(word70),"if);strcpy(&

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

5、t;u ntil");strcpy(&(word160),"va广);strcpy(&(word170),"while");strcpy(&(word180),"write");/*设置保留字符号*/wsym0=begi nsym;wsym1=callsym;wsym2=charsym;wsym3=c on stsym;wsym4=dosym;wsym5=e ndsym;wsym6=forsym;wsym7=ifsym;wsym8=oddsym;wsym9=procsym;wsym10=readsym;wsym

6、11=realsym;wsym12=returnsym; wsym13=stepsym; wsym14=the nsym; wsym15=un tilsym; wsym16=varsym; wsym17=whilesym; wsym18=writesym;修改pl0.h头文件里定义的全局数据:# defi ne norw 19# define txmax 100# defi ne nmax 14/*number的最大位数*/# define al 10/*符号的最大长度*/# define amax 2047/*地址上界*/# defi ne levmax 3/*最大允许过程嵌套声明层数0,l

7、exmax*/# define cxmax 200/*最多的虚拟机代码数*/*符号*/ enum symboln ul,ide nt,nu mber,plus, minus,times,slash,oddsym,eql, neq,lss,leq,gtr,geq, lpare n,rparen, comma,semicoIon,period, becomes,begi nsym,e ndsym,ifsym,the nsym,whilesym, writesym,readsym,dosym,callsym ,con stsym, varsym,procsym,forsym,stepsym,u nt

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

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

10、m=0;sym=nu mber;donum=10* nu m+ch-'0'k+;getchdo;while(ch>='0'&&ch<=9); /* 获取数字的值 */k-;if(k>nm ax)error(30);elseif(ch=':')/*检测赋值符号*/getchdo;if(ch='=')sym=becomes;prin tf(":=n");getchdo; elsesym=n ul; prin tf("n");/*不能识别的符号*/elseif(c

11、h='*')/*xiugai*/getchdo;if(ch='=')sym=p;prin tf("*=n"); getchdo;elsesym=times;prin tf("*n");getchdo;elseif(ch='/')getchdo;if(ch='=')sym=q;prin tf("/=n"); getchdo;elsesym=slash;prin tf("/n");getchdo;elseif(ch='v')/*检测小于或小

12、于等于符号*/getchdo;if(ch='=')sym=leq;prin tf("v=n"); getchdo;elsesym=lss;prin tf("<n");elseif(ch='>')/*检测大于或大于等于符号*/getchdo;if(ch='=')sym=geq;prin tf(">=n");getchdo;elsesym=gtr;prin tf(">n"); elsesym=ssymch;/*当符号不满足上述条件时,全部按照单 字

13、符号处理*/printf("单字符 n");/getchdo;/richardif(sym!=period)getchdo;/end richardreturn 0;2. 扩充语句1)产生式以及语法描述图:产生式:a:=1 do a:=a+1 while a<5语法描述图:a<5I f 、a:=1 ( doa:=a+1 i while2)递归下降子程序:if(sym=dosym)getsymdo;memcpy( nxtlev,fsys,sizeof(bool)*sy mnu m); n xtlevwhilesym=true;stateme ntdo(fsys,p

14、tx,lev);if(sym=whilesym)getsymdo;con diti ondo(n xtlev,ptx,lev);elseerror(18);3) 举例设计语句的pcode代码:var a;beg ina:=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 0

15、 04) 在递归下降子程序中增加语义动作:if(sym=dosym)cx1=cx;getsymdo;memcpy( nxtlev,fsys,sizeof(bool)*sy mnu m); n xtlevwhilesym=true;stateme ntdo(fsys,ptx,lev); if(sym=whilesym)getsymdo;con ditio ndo( nxtlev,ptx,lev);cx2=cx;gen do(jpc,0,0);gen do(jmp,0,cx1); codecx2.a=cx;else error(18);三. 运行测试1.扩充单词的测试(贴运行结果截图)ps:测试情

16、况要全!图片大小合适!截图如下所示:2 returnInput pl/0 file ?11.pl0 List object codeList symbol table ? <?/N>y 0 begin保留字TABLE:NULLstep保留字b until保留字2 char保留字2 real保留字保留字2 *=*=2 /= /=2 单字符2 单字符2 */2 end.单字符1. int 0 32 opr 0 0in pl/0 programEri*opsPress any key to continue2.语句的测试(贴运行结果截图) 截图如下所示:code ?<¥/N>y table ? <V/N>j/Input pl/0 f ile ?22-pl0 List object List svnbo1 0 vai* a ;尿留字iwI bes(in原留字FAB

温馨提示

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

评论

0/150

提交评论