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

下载本文档

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

文档简介

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

2、;ssym*=times;ssym/=slash;ssym(=lparen;ssym)=rparen;ssym=eql;ssym,=comma;ssym.=period;ssym#=neq;ssym;=semicolon; ssym=l1; ssym=r1;/*设置保留字名字,按照字母顺序,便于折半查找*/ strcpy(&(word00),begin);strcpy(&(word10),call);strcpy(&(word20),char);strcpy(&(word30),const);strcpy(&(word40),do);strcpy(&(word50),end);strcpy(&

3、(word60),for);strcpy(&(word70),if);strcpy(&(word80),odd);strcpy(&(word90),procedure);strcpy(&(word100),read);strcpy(&(word110),real);strcpy(&(word120),return);strcpy(&(word130),step);strcpy(&(word140),then);strcpy(&(word150),until);strcpy(&(word160),var);strcpy(&(word170),while);strcpy(&(word180),wr

4、ite);/*设置保留字符号*/wsym0=beginsym;wsym1=callsym;wsym2=charsym;wsym3=constsym;wsym4=dosym;wsym5=endsym;wsym6=forsym;wsym7=ifsym;wsym8=oddsym;wsym9=procsym;wsym10=readsym;wsym11=realsym; wsym12=returnsym; wsym13=stepsym;wsym14=thensym;wsym15=untilsym;wsym16=varsym;wsym17=whilesym;wsym18=writesym;修改pl0.h头

5、文件里定义的全局数据:# define norw 19 /*关键字个数*/# define txmax 100 /*名字表容量*/# define nmax 14 /*number的最大位数*/# define al 10 /*符号的最大长度*/# define amax 2047 /*地址上界*/# define levmax 3 /*最大允许过程嵌套声明层数0,lexmax*/ # define cxmax 200 /*最多的虚拟机代码数*/*符号*/enum symbolnul,ident,number,plus,minus,times,slash,oddsym,eql,neq,lss,

6、leq,gtr,geq, lparen,rparen, comma, semicolon,period, becomes,beginsym,endsym,ifsym,thensym,whilesym,writesym,readsym,dosym,callsym,constsym,varsym,procsym,forsym,stepsym,untilsym,charsym,realsym,returnsym,p,q,l1,r1;#define symnum 42/*-*/2)修改getsym()方法:/*词法分析,获取一个符号*/int getsym()int i,j,k;while( ch=

7、|ch=10|ch=9) getchdo; if(ch=a&chk=0;doif(kak=ch;k+;getchdo;while(ch=a&ch=0&chak=0;strcpy(id,a);i=0;j=norw-1;dok=(i+j)/2;if(strcmp(id,wordk)j=k-1;if(strcmp(id,wordk)=0)i=k+1;while(iif(i-1j)sym=wsymk;printf(保留字n);else sym=ident; printf(标识符n);elseif(ch=0&chk=0;num=0;sym=number;donum=10*num+ch-0;k+;getc

8、hdo;while(ch=0&chk-;if(knmax)error(30);elseif(ch=:) /*检测赋值符号*/getchdo;if(ch=)sym=becomes;printf(:=n);getchdo;else sym=nul; /*不能识别的符号*/ printf(n);elseif(ch=*) /*xiugai*/getchdo;if(ch=)sym=p;printf(*=n);getchdo;elsesym=times;printf(*n);getchdo;elseif(ch=/)getchdo;if(ch=)sym=q;printf(/=n);getchdo;elses

9、ym=slash;printf(/n); getchdo; elseif(ch=getchdo;if(ch=)sym=leq;printf(getchdo;elsesym=lss;printf(elseif(ch=) /*检测大于或大于等于符号*/getchdo;if(ch=)sym=geq;printf(=n);getchdo;elsesym=gtr;printf(n); else sym=ssymch;/* 当符号不满足上述条件时,全部按照单字符号处理*/printf(单字符n); /getchdo; /richard if(sym!=period) getchdo;/end richar

10、dreturn 0;2. 扩充语句1)产生式以及语法描述图: 产生式:a:=1 do a:=a+1 while a2)递归下降子程序:if(sym=dosym) getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlevwhilesym=true; statementdo(fsys,ptx,lev);doa:=a+1whileaa:=1 if(sym=whilesym) getsymdo;conditiondo(nxtlev,ptx,lev);elseerror(18);3)举例设计语句的pcode代码:var a;begina:=1;do

11、a:=a+1while awrite(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 0 4)在递归下降子程序中增加语义动作: if(sym=dosym)cx1=cx;getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlevwhilesym=true;statementdo(fsys,ptx,lev);if

温馨提示

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

评论

0/150

提交评论