编译原理课设报告2_第1页
编译原理课设报告2_第2页
编译原理课设报告2_第3页
编译原理课设报告2_第4页
编译原理课设报告2_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、编译原理课程设计题目:pl/0编译程序的改进与完善学生所在学院:信息科学与工程学院学生所在班级: 06级计算机软件1班学 生 姓 名 : 学 生 学 号 : 指 导 教 师 : 张世辉 一、课设目的:1. 阅读、研究、改进、设计和调试一个简单的编译程序;2. 加深对编译程序理论和编译过程的理解。二、课设内容:1 扩充语句for(;);2 扩充语句if then else ;3 扩充语句repeat ;until ;4 增加自增自减运算+和和+=,-=运算;5 修改不等号#,为!=;6 增加一维数组声明格式:/:/;赋值格式::=;调用格式:三、程序结构:程序pl0程序block语句statem

2、ent条件condition表达式expression项term因子factorPL/0源程序 词法分析程序表格管理程序语法分析程序出错管理程序代码生成程序目标程序图1 编译程序结构 图2功能模块调用1.各功能模块的作用:Pl0.c:主程序Error:出错处理,打印出错位置和错误编码Getsym:词法分析,读取一个单词Getch:漏掉空格,读取一个字符Gen:生成目标代码,并送入目标程序区Test:测试当前当前符号是否合法Block:分程序分析处理过程,词法语法分析Enter:登陆名字表Position:查找标识符在名字表中的位置Constdeclaration:常量定义处理Vardeclar

3、action:变量说明处理Listcode:列出目标代码清单Statement:语句处理Expression:表达式处理Term:项处理Factor:因子处理Condition:条件处理Interpret:对目标代码的解释执行程序Base:通过静态链求出数据取得基地址增加两个功能:Arraydeclaration:数组声明处理Arraycoef:数组索引计算和“虚拟机”动作生成2.保留字:enum symbol nul,ident,number,plus,minus, times,slash,oddsym,eql,neq, lss,leq,gtr,geq,lparen, rparen,comm

4、a,semicolon,period,becomes, beginsym,endsym,ifsym,thensym,elsesym,forsym, inc,dec,whilesym, writesym, readsym,dosym,callsym, constsym,varsym, procsym,repeatsym, untilsym, plusbk,minusbk, lbrack,rbrack,colon,共43个,其中补充保留字为:else, for, repeat, until, plusbk, minusbk, Lbrack, rbrack, colon3.虚拟机代码enum fct

5、 lit, opr, lod, sto, cal, inte, jmp, jpc,lda, sta, 共10个,补充的lda,sta用于数组操作4.名字表中的类型enum object constant, variable, procedure, arrays, 共4个,扩充arrays,以便实现数组5.名字表结构struct tablestructchar nameal;enum object kind;int val;int level;int adr;int size;/扩充名字表结构,增加一个data域保存数组的下界int data; /* 其他数据,对arrays来说是下界*/6.错

6、误信息表(1) 常数说明中的=写成了:=(2) 常数说明中的=后应是数字(3)常数说明中的标识符后应是=(4) const,var,procedure后应为标识符(5)漏掉了,或;(6)过程说明后的符号不正确(应是语句开始符,或过程定义符)(7)应是语句开始符(8)程序体内语句部分的后跟符不正确(9)程序结尾丢了句号。(10)语句之间漏了;(11)标识符未说明(12)赋值语句中,赋值号左部标识符属性应是变量(13)赋值号左部标识符属性应是赋值号(14)call后应为标识符(15)call后标识符属性应为过程(16)条件语句中丢了then(17)丢了end或;(18)while循环语句中丢了do

7、(19)语句后的符号不正确(20)应为关系运算符(21)表达式内标识符属性不能是过程(22)表达式中漏掉右括号)(23)因子后的非法符号(24)表达式的开始符不能使此符号(31)数越界(32)read语句括号中的标识符不是变量补充错误处理:(50)数组格式错误(51)数组访问错误7.语法描述图:程序分程序 .图3 程序语法描述图,。;,;=语句constidentnumbervaridentprocedureident分程序图4 分程序语法描述图语句语句until表达式表达式:=if条件endthen语句条件do语句(表达式),(ident,)begin语句语句;identcallidentw

8、hilerepeatreadwritedecsincsincsdecselse语句for条件语句图5 语句语法描述图 条件=#=odd表达式表达式=图6条件语法描述图表达式项项+ 图7 表达式语法描述图项因子因子/*%图8 项语法描述图因子)(表达式identnumberincsdecsdecsincs图9 因子语法描述图四、功能扩充1.在语句处理中增加repeat-until语句if(sym = repeatsym)cx1 = cx;getsymdo;statementdo(nxtlev, ptx, lev);if(sym = untilsym)getsymdo;conditiondo(nx

9、tlev, ptx, lev);cx2=cx;gendo(jpc, 0, 0);codecx2.a=cx1; else error(33); /没有写until出错注意:repeat是可以作为语句的开始符,所有要在初始化函数中的语句开始符中添加statbegsysrepeatsym=true;语句。2.语句处理中加入for循环语句if(sym = forsym)getsymdo;if(sym != lparen) error(34);/没有左括号出错else getsymdo;statementdo(nxtlev, ptx, lev); /S1代码if(sym != semicolon) er

10、ror(10); /语句缺少分号出错elsecx1=cx;getsymdo;conditiondo(nxtlev, ptx, lev); /E代码if(sym!=semicolon)error(10);/语句缺少分号出错else cx2=cx;gendo(jpc,0,0);cx3=cx;gendo(jmp,0,0);getsymdo;cx4=cx;statementdo(nxtlev, ptx, lev);/S2代码if(sym != rparen) error(22);/缺少右括号出错else gendo(jmp,0,cx1);getsymdo;cx5=cx;statementdo(nxtl

11、ev, ptx, lev); /S3代码codecx3.a=cx5;gendo(jmp,0,cx4);codecx2.a=cx;3.语句处理中加入if-then-else语句在原有程序if(sym=then).后加入下列代码:cx1 = cx;gendo(jpc, 0, 0);statementdo(fsys, ptx, lev);if(sym = elsesym)getsymdo;cx2 = cx;gendo(jmp, 0, 0);codecx1.a = cx;statementdo(fsys, ptx, lev);codecx2.a = cx;elsecodecx1.a = cx;4.扩充

12、+和运算符对于+和-运算符,扩充时要注意存在两个情况:1)作为语句的时候;2)作为表达式中的因子的时候。 注意:扩充时增加因子开始符facbegsysincs=true和facbegsysdecs=true。 扩充的语法描述见结构设计中的PL/0分程序和主要语句的语法描述中的描述图,详细代码见程序。 1)作为语句的时候,有四种情况: a+; a-; +a; -a; 文法的EBNF表示形式为: :=+ |-|+|- 文法分析过程大体如下图: 语句开始符SYM=+或者-读下个SYM,如是ident,确定为自增自减语句语句开始符SYM=ident读下个SYM,如是+或者-,确定为自增自减语句 +a和

13、a a+和a生成中间代码对于a+;+a;和a-;-a;语句的处理如下: 先将变量的值取出放在栈顶,后将1入栈,后执行加法或减法运算oprv指令的2(加法)、3(减法),后将运算后的栈顶值存回变量。 a+;和+a;语句的中间代码:lod 0 3;lit 0 1;opr 0 2;sto 0 3;a-;和-a;语句的中间代码:lod 0 3;lit 0 1;opr 0 3;sto 0 3; 2)作为因子的时候,有两种情况: a+和a-作为因子,比如:b:=a+*a-;语句 +a和-a作为因子,比如:b:=-a+2*+a;语句 文法的EBNF表示形式为: :=. +|-|+| -. 其中的.表示前后都

14、可以有其他的项或因子 生成中间代码对于因子+a和-a的中间代码生成处理和a+;等语句处理一样; 对于因子a+和a的中间代码生成处理如下:a+:lod 0 3;lit 0 1;opr 0 2;sto 0 3;lod 0 3;lit 0 1;opr 0 3; a-:lod 0 3;lit 0 1;opr 0 3;sto 0 3;lod 0 3;lit 0 1;opr 0 2; 先将变量的值取出放在栈顶,后将1入栈,后执行加法或减法运算opr指令的2(加法)、3(减法),后将运算后的栈顶值存回变量,后将变量的值又取出来放入栈顶,后将1入栈,如果是a+就执行减法,如果是a就执行加法,以实现先用a的值后

15、再加1。5.修改不等号#为!=注释源程序中的ssym# = neq语句,在getsym中加入下列代码:/修改不等号为!=else if(ch=!)getchdo;if(ch=)sym=neq;getchdo; else sym=nul; 6.加入对一维数组的支持本程序将数组看做变量的一种,由var声明函数调用array声明函数完成数组声明,这样就处加入文件输出的相关语句外,可以完全保留block函数和enter函数;通过改写factor函数使数组因子包括了后缀的索引号,这样就可以调用通用的表达式函数赋值数组了。为了方便完成数组相关功能,扩充了虚拟机处理代码。数组的越界及非法调用错误处理没有完善

16、,仅给出了错误代码。在头文件pl0.h中:/*定义两个全局变量,用来保存数组定义的下界和容量*/static int g_arrBase = 0;static int g_arrSize = 0;/* 虚拟机代码*/增加lda,sta专门由于数组的处理/增加两个虚拟机指令lda,sta,分别用来从数组中取数和存到数组中/数组元素的访问和存储,是将()后的当成表达式,先处理,得到元素的索引,放在栈顶/最后根据数组的首地址,得到某个元素的地址enum fct .lda, sta /扩充名字表结构,增加一个data域保存数组的下界struct data; /* 其他数

17、据,对arrays来说是下界*/* 名字表中的类型*/enum object .arrays /添加数组类型/数组声明处理, 下界和上界允许已经定义过的常量标识符int arraydeclaration(int* ptx, int lev, int* pdx);/数组元素索引计算与“虚拟机”生成int arraycoef(bool *fsys,int *ptx,int lev);在源程序文件pl0.c中:编写相关的arraydeclaration,arraycoef两个功能函数:/* 数组声明处理, 下界和上界允许已经定义过的常量标识符*/int arraydeclaration(int* p

18、tx, int lev, int* pdx) char arrIdal; /* 暂存数组标识名,避免被覆盖*/ int cstId; /* 常量标识符的位置*/ int arrBase=-1, arrTop=-1; /* 数组下界、上界的数值*/getsymdo; if(sym=lbrack) /* 标识符之后是,则识别为数组*/ strcpy(arrId, id); /* 检查下界*/ getsymdo; if(sym=ident) if(cstId=position(id,(*ptx)!=0)arrBase=(constant=tablecstId.kind)?tablecstId.val

19、:-1; elsearrBase=(sym=number)?num:-1; if(-1=arrBase)error(50);return -1; /* 检查冒号*/getsymdo;if(sym!=colon) error(50);return -1; /* 检查上界*/ getsymdo; if(sym=ident) if(cstId=position(id,(*ptx)!=0)arrTop=(constant=tablecstId.kind)?tablecstId.val:-1; elsearrTop=(number=sym)?num:-1; if(arrTop=-1)error(50);/随意指定,因为原程序对错误号的规划极差!return -1; /* 检查 */ getsymdo; if(sym!=rbrack) error(50);return -1; /* 上下界是否符合条件检查*/ g_arrSize=arrTop-arrBase+1; g_arrBase=arrBase; if(g_arrSizen; write(a); write(b);end.当输入的n为3时,repeat.until.语句中的循环体执行3次,所以a=4,b=72.测试增加的+,-功能 测试文件:2.txt 测试结果:var a,b;begin

温馨提示

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

评论

0/150

提交评论