编译原理课程设计

上传人:m**** 文档编号:218702524 上传时间:2023-06-21 格式:DOCX 页数:29 大小:358.22KB
收藏 版权申诉 举报 下载
编译原理课程设计_第1页
第1页 / 共29页
编译原理课程设计_第2页
第2页 / 共29页
编译原理课程设计_第3页
第3页 / 共29页
资源描述:

《编译原理课程设计》由会员分享,可在线阅读,更多相关《编译原理课程设计(29页珍藏版)》请在装配图网上搜索。

1、报告成绩编译原理课程设计项目名称 PL/O语言的扩充 学 院计算机学院专业班级学号姓 名指导教师2013 年 1 月 3 日一 课程设计目的 0二 课程设计要求 0基本内容: 0选做内容: 0已实现的功能: 0三 编译环境与工具 0四 结构设计说明 01PL/0 编译程序的结构图 02. PL/O编译程序的过程或函数的功能表13PL/0 编译程序的总体流程图 14. PL/0 编译程序的中间代码 25. PL0的编译程序的过程和函数的功能3五 课程设计的设计与步骤 31.扩充赋值运算:+= -= *= /= + 和- - 52增加Pascal的FOR语句153. 一维数组 17六 调试测试 1

2、91. += -= *= /= + -的测试 192. FOR 语句的测试 213. 数组的调试 224. 综合调试 23七 课程设计总结 25【参考文献】 26一课程设计目的在分析理解一个教学型编译程序(如PL/O)的基础上,对其词法分析程序、语法分析 程序和语义处理程序进行部分修改扩充。达到进一步了解程序编译过程的基本原理和基本实 现方法的目的。二课程设计要求基本内容:( 1 )扩充赋值运算:*= 和 /=( 2)扩充语句( Pascal 的 FOR 语句) : FOR变量:=表达式TO表达式DO语句 FOR变量:=表达式DOWNTO表达式DO语句其中,语句的循环变量的步长为2,语句的循环

3、变量的步长为-2。 ( 3 )增加运算:+ 和 -。选做内容:(1)增加类型:字符类型;实数类型。(2)扩充函数:有返回值和返回语句;有参数函数。( 3)增加一维数组类型(可增加指令)。( 4)其他典型语言设施。已实现的功能:( 1)扩充赋值运算: *=和 /= (另外也扩充了+=和 -=)(2)扩充语句(Pascal的FOR语句): FOR变量:=表达式TO表达式DO语句 FOR变量:=表达式DOWNTO表达式DO语句( 3)增加运算: + 和 -。( 4)增加一维数组类型(可增加指令)。三编译环境与工具编译环境:Microsoft Windows 7 (64bit) 编译工具: Micro

4、soft Visual C+ 6.0四结构设计说明1. PL/O编译程序的结构图2. PL/O编译程序的过程或函过程或函数名T/0编译程序的结构图简要功能说明pl0主程序error出错处理,打印出错位置和错误编码getsym词法分析,读取一个单词get ch漏掉空格,读取一个字符gen生成目标代码,并送入目标程序区test测试当前单词符号是否合法block分程序分析处理过程enter登录名字表posi tion (函数)杳找标识符在名字表中的位置constdeclaration常量定义处理vardeclaration变量说明处理listode列出目标代码清单statement语句处理expre

5、ssion表达式处理t erm项处理factor因子处理condition条件处理interpret对目标代码的解释执行程序base(函数)通过静态链求出数据区的基地址表 4-1 PL/0 编译程序的过程或函数的功能表3. PL/0编译程序的总体流程图启动图 4-2 PL/0 编译程序的总体流程图4. PL/O编译程序的中间代码对 PL/0 编译程序的目标代码的指令格式描述如下f1a其中f代表功能码,1表示层次差,a的含意对不同的指令有所区别,见下面对每条指令的解释说明:Lit 0 a将常数值取到栈顶,a为常数值lod 1 a将变量值取到栈顶,a为偏移量,1为层差sto 1 a将栈顶内容送入某

6、变里单兀中,a为偏移量,1为层差cal 1 a调用过程,a为过程地址,1为层差int 0 a在运行栈中为被调用的过程开辟a个单兀的数据区jmp 0 a无条件跳转至a地址jpc 0 a条件跳转,当栈顶布尔值非真则跳转至a地址,否则顺序执行opr 0 0过程调用结束后,返回调用点并退栈opr 0 1栈顶兀素取反opr 0 2次栈顶与栈顶相加,退两个栈兀素,结果值进栈opr 0 3次栈顶减去栈顶,退两个栈兀素,结果值进栈opr 0 4次栈顶乘以栈顶,退两个栈兀素,结果值进栈opr 0 5次栈顶除以栈顶,退两个栈兀素,结果值进栈opr 0 6栈顶兀素的奇偶判断,结果值在栈顶opr 0 7opr 0 8

7、次栈顶与栈顶是否相等,退两个栈兀素,结果值进栈opr 0 9次栈顶与栈顶是否不等,退两个栈兀素,结果值进栈opr 0 10次栈顶是否小于栈顶,退两个栈兀素,结果值进栈opr 0 11次栈顶是否大于等于栈顶,退两个栈兀素,结果值进栈opr 0 12次栈顶是否大于栈顶,退两个栈兀素,结果值进栈opr 0 13次栈顶是否小于等于栈顶,退两个栈兀素,结果值进栈opr 0 14栈顶值输出至屏幕opr 0 15屏幕输出换行opr 0 16从命令行读入一个输入置于栈顶表 4-2 PL/0 编译程序的目标指令5. PL0的编译程序的过程和函数的功能P10:主程序Error :出错处理,打印出错位置和错误编码G

8、et sym :词法分析,读取一个单词Get ch:漏掉空格,读取一个字符Gen:生成目标代码,并送入目标程序区Tes t:测试当前单词符号是否合法Block:分程序分析处理过程En ter :登陆名字表Position:查找标识符在名字表中的位置Constdeclaration:常量定义处理Vardeclaration:变量说明处理Lis tcode :列出目标代码清单Stat emen t:语句部分处理Expressio n: 表达式处理Term:项处理Fac tor:因子处理Condition:条件处理Int erpre t:对目标代码的解释执行程序Base:通过静态链求出数据区的基地址

9、五课程设计的设计与步骤本次课程设计是在实验的基础上,在实验中,已经实现对PL/0作以下修改扩充:(1)增加单词:保留字 ELSE, FOR, STEP, UNTIL, RETURN运算符 +=, -=, +, -,A,V,n(2)修改单词:不等号# 改为 (3)增加条件语句的ELSE子句在课程设计中,因为关键字增加到了 18个,所以令# define norw 18。SYMBOL扩展 为48个值。在plO.h中做了如下更改,具体如下(粗体部分为课程设计更改部分):enum symbolnul,ident,number, plus, minus,times,slash,oddsym, eql,

10、neq,lss,leq,gtr, geq, lparen,rparen,comma,semicolon,period, becomes,3beginsym, endsym, ifsym, thensym, whilesym, writesym, readsym, dosym, callsym, constsym, varsym, procsym, elsesym, forsym, stepsym, untilsym, returnsym, plusbecomes, dplus, minusbecomes, dminus, and, or, not,lepa,ripa, slashbecomes

11、,timesbecomes,;#define symnum 48 符号和关键字扩展(粗体部分为课程设计更改部分): ssym+=plus;ssym-=minus; ssym*=times;ssym/=slash; ssym(=lparen; ssym)=rparen;ssym=eql; ssym,=comma;ssym.=period; /ssym#=neq; 去掉#,改为 ssym;=semicolon;ssym!=not; /非 ssym=lepa;/维数组的左括号 ssym=ripa;/维数组的右括号/*设置保留字名字 ,按照字母顺序,便于折半查找*/ strcpy(&(word00),

12、begin);strcpy(&(word10),call); strcpy(&(word20),const);strcpy(&(word30),do); strcpy(&(word40),else);strcpy(&(word50),end); strcpy(&(word60),for);strcpy(&(word70),if); strcpy(&(word80),odd);strcpy(&(word90),procedure); strcpy(&(word100),read); strcpy(&(word110),return);strcpy(&(word120),step); strcpy

13、(&(word130),then);strcpy(&(word140),until); strcpy(&(word150),var);strcpy(&(word160),while); strcpy(&(word170),write);/*设置保留字符号*/wsym0=beginsym;wsym1=callsym;wsym2=constsym;wsym3=dosym;wsym4=elsesym;wsym5=endsym;wsym6=forsym;wsym7=ifsym;wsym8=oddsym;wsym9=procsym;wsym10=readsym;wsym11=returnsym;wsym

14、12=stepsym;wsym13=thensym;wsym14=untilsym;wsym15=varsym;wsym16=whilesym;wsym17=writesym;设置指令名称(粗体部分为课程设计更改部分)strcpy(&(mnemoniclit0),lit);strcpy(&(mnemonicopr0),opr);strcpy(&(mnemoniclod0),lod);strcpy(&(mnemonicsto0),sto);strcpy(&(mnemoniccal0),cal);strcpy(&(mnemonicinte0),int);strcpy(&(mnemonicjmp0)

15、,jmp);strcpy(&(mnemonicjpc0),jpc);strcpy(&(mnemonicgar0),gar);strcpy(&(mnemonicsar0),sar);strcpy(&(mnemonicshd0),shd);strcpy(&(mnemonicdel0),del);strcpy(&(mnemonicjud0),jud);strcpy(&(mnemonictra0),tra);1扩充赋值运算:+= -= *= /= + 和- -变量表达式+=*/=+表达式+a 或者-aa !或者.a-图 5-1 扩充赋值运算: += -= *= /= + 和 - -1) 在 symbo

16、l 增加字符:Plusbecomes:+=Minusbecomes:-=Slashbecomes:*=Timesbecomes:/=2) 对取字符getsym()函数进行扩充,具体如下(粗体部分为更改部分):int getsym()./此处省略部分未修改过的代码else if(ch=+) /读到加号getchdo; /再读一个字符if(ch=) /读到等号,则与+号构成加等sym=plusbecomes;getchdo;else if(ch=+) /读到加号,则与加号构成+sym=dplus;getchdo;elsesym=plus;/那就是一个单独的加号else if(ch=-)/读到减号g

17、etchdo;if(ch=)/读到等号,则与减号构成减等sym=minusbecomes;getchdo;else if(ch=-) /读到减号,则与减号构成-sym=dminus;getchdo;elsesym=minus; /那就是一个单独的减号else if(ch=*)getchdo;if(ch=)/读到乘号,则与减号构成乘等sym=timesbecomes;getchdo;elsesym=times; /那就是一个单独的乘else if(ch=/)getchdo;if(ch=)/读到乘号,则与减号构成除等sym=slashbecomes;getchdo;elsesym=slash; /

18、那就是一个单独的除./此处省略部分未修改过的代码 3)对 statemen 函数进行扩展int statement(bool* fsys,int * ptx,int lev) ./此处省略部分未修改过的代码 if(sym=ident)i=position(id,*ptx);if(i=0)error(11);else if(tablei.kind!=variable&tablei.kind!=array)error(12);i=0;else getsymdo;if(sym=lepa)/如果是数组getsymdo; /处理里的表达式 memcpy(nxtlev,fsys,sizeof(bool)*

19、 symnum); nxtlevripa=true;expressiondo(nxtlev,ptx,lev);gendo(tra,0,tablei.size);/生成将数组下标范围入栈指令 gendo(jud,0,0);/判断下标合法性if(sym!=ripa)error(26); getsymdo;if(sym=becomes)/ 赋值:=getsymdo;flag=1;else if(sym=plusbecomes)/加赋值+=getsymdo;flag=2;else if(sym=minusbecomes)/减赋值-=getsymdo;flag=3;else if(sym=dplus)/

20、+getsymdo;flag=4;else if(sym=dminus)/-getsymdo;flag=5;else if(sym=timesbecomes)/*=getsymdo;flag=6;else if(sym=slashbecomes)/ /=getsymdo;flag=7;elseerror(13);if(i!=0)if(flag=1) /:=memcpy(nxtlev,fsys,sizeof(bool)* symnum); expressiondo(nxtlev,ptx,lev);else if(flag=2)/+=memcpy(nxtlev,fsys,sizeof(bool)*

21、 symnum); expressiondo(nxtlev,ptx,lev);gendo(lod,lev-tablei.level,tablei.adr);/ 先取值到栈顶gendo(opr,lev-tablei.level,2);/ 执行加法else if(i!=0&flag=3)/-=memcpy(nxtlev,fsys,sizeof(bool)* symnum); expressiondo(nxtlev,ptx,lev);gendo(lod,lev-tablei.level,tablei.adr);/ 先取值到栈顶gendo(opr,lev-tablei.level,3);/执行减法 g

22、endo(opr,lev-tablei.level,1);/ 取反else if(i!=0&flag=4) /+if(tablei.kind=variable)gendo(lod,lev-tablei.level,tablei.adr);/ 先取值到栈顶 gendo(lit,lev-tablei.level,1);/ 将值为 1 入栈gendo(opr,lev-tablei.level,2);/加法,即力口1if(tablei.kind=array)gendo(gar,lev-tablei.level,tablei.adr); gendo(lit,lev-tablei.level,1); ge

23、ndo(opr,lev-tablei.level,2);gendo(lod,lev-tablei入栈gendo(gar,lev-tablei先取值到栈顶先取值到栈顶址出栈根据变量地址存入变量else if(i!=0&flag=5)/-if(tablei.kind=variable).level,tablei.adr);/先取值到栈顶gendo(lit,lev-tablei.level,1);/ 将值为 1gendo(opr,lev-tablei.level,3);/ 减法,即一1if(tablei.kind=array).level,tablei.adr);gendo(lit,lev-tabl

24、ei.level,1);gendo(opr,lev-tablei.level,3);else if(i!=0&flag=6)/*=memcpy(nxtlev,fsys,sizeof(bool)* symnum);expressiondo(nxtlev,ptx,lev);gendo(lod,lev-tablei.level,tablei.adr);/gendo(opr,lev-tablei.level,4);/ 乘法else if(i!=0&flag=7) / /=;gendo(lod,lev-tablei.level,tablei.adr);/ memcpy(nxtlev,fsys,sizeo

25、f(bool)* symnum); expressiondo(nxtlev,ptx,lev);gendo(opr,lev-tablei.level,5);/除法if(tablei.kind=array) /数组,根据偏移地址存入数组gendo(sar,lev-tablei.level,tablei.adr);gendo(del,0,0);/赋值语句需将存入数组后栈顶为偏移地else /变量gendo(sto,lev-tablei.level,tablei.adr); /else if(sym=dplus) /+变量getsymdo;if(sym=ident)/后面跟的是变量i=position

26、(id,*ptx);if(i=0)error(11);else if(tablei.kind!=variable&tablei.kind!=array) /+后没 跟变量,出错error(12);i=0;else /+后跟变量,处理生成中间代码 if(tablei.kind=variable) gendo(lod,lev-tablei.level,tablei.adr);/ 先 取 值到栈顶gendo(lit,0,1);/ 将值为 1 入栈gendo(opr,0,2);/加法,即+ 1,栈顶加次栈顶 gendo(sto,lev-tablei.level,tablei.adr);/ 出 栈 取值

27、到内存getsymdo;else if(tablei.kind=array) /后跟数组 getsymdo;if(sym=lepa)getsymdo;memcpy(nxtlev,fsys,sizeof(bool)* symnum); nxtlevripa=true;expressiondo(nxtlev,ptx,lev);gendo(tra,0,tablei.size); / /生成将数组下标范围 入栈指令gendo(jud,0,0); /判断下标合法性 if(sym!=ripa)error(26); /缺少elsegendo(gar,lev-tablei.level,tablei.adr);

28、gendo(lit,0,1);gendo(opr,0,2);gendo(sar,lev-tablei.level,tablei.adr);gendo(del,0,0);getsymdo;elseerror(27);/缺少else if(sym=dminus)/- 变量getsymdo;if(sym=ident) /后面跟的是变量i=position(id,*ptx);if(i=0)error(11);elseif(tablei.kind!=variable&tablei.kind!=array) /-后没 跟变量,出错error(12);i=0;else /-后跟变量,处理生成中间代码 if(

29、tablei.kind=variable)/ 后跟变量 gendo(lod,lev-tablei.level,tablei.adr);/ 先 取 值到栈顶gendo(lit,0,1); /将值为 1 入栈gendo(opr,0,3);/加法卩-1,栈顶减次栈顶 gendo(sto,lev-tablei.level,tablei.adr);/ 出 栈 取值到内存getsymdo;else if(tablei.kind=array)/后跟数组变量getsymdo;if(sym=lepa)getsymdo; memcpy(nxtlev,fsys,sizeof(bool)* symnum); nxtl

30、evripa=true; expressiondo(nxtlev,ptx,lev);gendo(tra,0,tablei.size);/生成将数组下标范围入 栈指令gendo(jud,0,0);/判断下标合法性 if(sym!=ripa)error(26);/ 缺少 else gendo(gar,lev-tablei.level,tablei.adr); gendo(lit,0,1); gendo(opr,0,3);gendo(sar,lev-tablei.level,tablei.adr);gendo(del,0,0); getsymdo;elseerror(27);/ 缺少 ./此处省略部

31、分未修改过的代码2.增加Pascal的FOR语句本次课程设计中要求扩充的是Pascal的FOR语句: FOR变量:=表达式TO表达式DO语句 FOR变量:=表达式DOWNTO表达式DO语句,流程图如下:WSYM 10= forsym;WSYM22=tosym;WSYM 7=downtosym;1)在 symbol 增加字符 FORSYM。 strcpy(KWORD10,for); strcpy(KWORD22,to); strcpy(KWORD 7,downto);2)对 statement 函数进行扩充int statement(bool* fsys,int * ptx,int lev) .

32、/此处省略部分未修改过的代码else if(sym= forsym)getsymdo;if(sym=ident) / ident 为变量的符号 i=position(id,*ptx);if(i=0)error(11);else if(tablei.kind!=variable) /赋值语句中,赋值号左部标识符属性应是变 error(12);i=0;elsegetsymdo;if(sym!=becomes)error(13);elsegetsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum); if(nxtlevtosym=true) / tosym els

33、e nxtlevdowntosym=true; / downtosym expressiondo(nxtlev,ptx,lev); /处理赋值语句右部的表达式 gendo(sto,lev-tablei.level,tablei.adr); /保存初始值 getsymdo;cx1=cx; /保存循环开始点memcpy(nxtlev,fsys,sizeof(bool)*symnum); if(sym=dosym)getsymdo;statement(fsys,ptx,lev); /循环体处理 gendo(lod,lev-tablei.level,tablei.adr); / 将循环变 量取出放在栈

34、顶gendo(opr,0,2); /循环变量加长 gendo(sto,lev-tablei.level,tablei.adr); / 将栈顶的 值存入循环变量gendo(jmp,0,cx1);/无条件跳转到循环开始点codecx2.a=cx; /回填循环结束点的地址elseerror(29); /for 语句中少了 doelseerror(19); /for 后面为赋值语句,赋值语句左部是变量,缺少变量./ 此处省略部分未修改过的代码3一维数组1)设置一维数组的左右括号: ssym=lepa; /一维数组的左括号 ssym=ripa; /一维数组的右括号2)增加指令:strcpy(&(mnem

35、onicgar0),gar);strcpy(&(mnemonicsar0),sar);strcpy(&(mnemonicshd0),shd);strcpy(&(mnemonicdel0),del);strcpy(&(mnemonicjud0),jud);strcpy(&(mnemonictra0),tra);enum fctlit, opr, lod, sto, cal, inte, jmp, jpcg,ar, sar, shd, del, jud, tra, ;由于指令有原来的8 条拓展到了14 条,故进行如下修改#define fctnum 14增加的指令意义如下:gar:根据栈顶的偏移地

36、址从数组中取值到新的栈顶sar:根据次栈顶的偏移地址把栈顶的值存入数组shd:将栈顶的值下移到次栈顶,栈顶出栈,即次栈顶成为栈顶del:出栈顶jud:判断数组下标合法性tra:将数组的下标范围入栈,gendo(tra,0,数组下标最大值);3) 增加标识符类型属性:enum objectconstant,variable,procedur,array, / 数组;4) 在 block 函数中添加如下代码:for(i=tx0+1;i=tx;i+)switch(tablei.kind)case constant:/*常量名字*/./此处省略部分未修改过的代码case variable:/*变量名字

37、*/./此处省略部分未修改过的代码case procedur:/*过程名字*/./此处省略部分未修改过的代码case array:/数组变量printf(%d var-array %s ,i,tablei.name);printf(lev=%daddr=%dsize=%dn,tablei.level,tablei.adr,tablei.size);fprintf(fas,%d var-array %s,i,tablei.name); fprintf(fas,lev=%daddr=%dsize=%dn,tablei.level,tablei.adr,tablei.size);5) 在enter

38、()函数添加如下代码:switch(k)case constant:常/量*名字*/./此处省略部分未修改过的代码case variable:变/量*名字*/./此处省略部分未修改过的代码case procedur:过/程*名字* /./此处省略部分未修改过的代码case array:数组/*名字*/table(*ptx).level=lev; table(*ptx).adr=(*pdx)-arraysize; table(*ptx).size=arraysize;break;6) 在Vardeclaration ()函数中添加数组的变量声明,代码如下:int vardeclaration(i

39、nt * ptx,int lev,int * pdx)./此处省略部分未修改过的代码case gar: /根据栈顶的偏移地址从数组中取值到新的栈顶 st=sbase(i.l,s,b)+i.a+st-1; / 偏移地址为上一层过程的基址 + 当 前指令的层次+栈顶的偏移地址t+;break;case sar:/根据次栈顶的偏移地址把栈顶的值存入数组t-;sbase(i.l,s,b)+i.a+st-1=st;/t-;break;case shd:/将栈顶的值保存到次栈顶t-;st-1=st;break;case del:/将栈顶的值出栈t-;break;case jud:/判断数组下标的合法性t-

40、;if(st-1=st)error(28);printf(n运行问题出错,程序退出!请输入任意数字退出:“); scanf(%d,&p);exit(1);break;case tra:/将数组的下标范围入栈st=i.a;t+;break;./ 此处省略部分未修改过的代码六 调试测试1.+= -= *= /= + -的测试图 6-1 测试文件 PL0_1.TXT图 6-2 += -= *= /= + - 的测试结果 1il end.L int 0 4! opr 0 16J sto 0 3I lit 0 2 lod 0 3 opr 0 2P sto 0 3t lod 0 3F opr 0 14L0

41、 opr 0 15LI lit 0 4L2 lod 0 3L3 opr 0 3L4 opr 0 1L5 sto 0 3L6 lod 0 3L7 opr 0 14L8 opr 0 15L9 lit 0 30 lod 0 34kilit01342opr03343sto031444lod031545opr014346opr015247lod03548lit01Etart pl0349opr02卜4350sto03b1451lod03b1552opr014353opr015b154lod03255lit01h356opr03357sto03h1458lod031559opr014【返回主菜单】360o

42、pr015图 6-2 += -= *= /= + - 的测试结果 2 2.FOR 语句的测试C pio_2.tzt -记事本文件朋 编辑 格式 查看(V)帮用uar x;beginfor x:=8 step 3 until 30 beginwrite(x);end;end.图 6-4 FOR 语句的测试文件 PL0.TXTd0Input pl/0 file:pl0_2.txtList object code ?y List symbol table ? y h uar x;a. beginTABLE:. uarxleu=0 addr=310101317 end.for x:=0 step 3

43、until JM dobeginwrite;end:012345674 5 037311323403 3 11_M _M _M _M _M _M _M -M -M- -M- -M- -M- -M- _M _M _M -Mdppdpopp tt odtdt F c o p p o p t m p nit i i PPI 1 s j i 1 s 1 1 1 1 o j图 6-5 FOR 语句的测试结果3.数组的调试t- pl0_3. txt -记事本图 6-6 数组的测试结果 1uar a4;beginread(a0,a1,a2,a3); write(a0,a1,a2,a3); end.图 6-6

44、 数组的测试文件 PL0_3.TXT1 beginTABLE:1 uar-array a leu=0 addr=3 siae=4*Fead;*2WFite;47 end.文件 编辑 格式(Q)查看(V)帮助Input pl/0 f ile:pl0_3.txtList object code ?yList snbol table ? y0 uar a4;图 6-6 数组的测试结果 24综合调试综合测试是定语一个1 维数组,数组每个元素的值等于它的位置。然后依次输出数组元 素。再次,对数组元素分别进行+=-=*=/=+-运算,用FOR语句输出结果。最后用FOR 语句对其进行求和,再次输出结果。E1

45、 pl0_4. tzt -记事本文件 编辑 格式辺 查看 帮助uar x,y,array8; beginfor x:=B step 1 until 7 dobeginarrayx :=x;end;For x:=8 step 1 until 3 do beginwrite(arrayx); end;arrayB+=3;array1-=2;array2*=4; array3/=3; array4+; array5_; +array6; _array7; for x:=0 step 1 until 3 dobegin write(arrayx); end;y:=0;for x:=0 step 1 u

46、ntil 3 dobegin y+=arrayx; end; write(y) ;| end.图 6-7 综合的测试文件 PL0_4.TXTInput pl/0 f ile:pl0_4.txt List object code ?y List symbol table ? y 0 uar x,y,array81;arraj4 + + ;80aFraijES 一一 ;88+ +arraiF6 J ;1 begin96array7;TABLE:1 uarxleu=02 uaryleu=03 uar-array104for x:=0 step 1 until 3101016addr=3addr=4

47、array leu=0 addr=5for x:=0 step 1 until 7beginarrayx:=x;end;for x:=0 step 1 until 3beginwrite;110112112119123125131133133141145148beginwrite;end;for x:=0 step 1 until 3beginend.图 6-8 综合结果的代码tra!8 jmp19 lit3 opr !4 opr :5 lod:0 Jud!1 gar2 shd:9 traopr :? JPC :8 lod!5 lit!4 lod!3 lit!2 lod!1 sto9 jn*P

48、 !0 lit.7 opr .8 sto6 lod5 del.4 sar2 jud3 lod.1 tralit 0lod 0lit 0lod 0:sto 0lit 0int 0tl417(80 0d p c o PPI oJ0:6 opr l? sto13 03313713200 30 80 00 30 50 00 30 20 30 40 00 30 30 10 30 30 130 390 30 80 00 50 00 140 150 30 20 30 220 00 8tra jud I gar lit pr sar del lit tra jud I gar lit opr sar del

49、lit tra jud I gar lit opr sar del lit sto lod lit lod lit opr jpc lod tra jud gar shd opr opr lod opr0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 006800780003313313123380121122123124125126127128129130131132133134135136137138139140141142143144145146147148sto jnp lit sto

50、lit sto lod lit lod lit opr jpc lod tra jud gar slid lod opr sto lod opr sto jnp lod opr opr opr0000000000000000000000000000106040127414150start pl0010141532112117图 6-8 综合结果的中间代码及其运算结果七课程设计总结本次课程设计的过程中我主要根据课本中的实现思想及算法以及源程序的方法编写和 修改程序,体现以课本知识的应用为主,在学习了 PL/0语言以及词法分析等知识的基础上, 以能够更加熟练的应用所学知识,并能结合一些著名算法来实

51、现对一些实际问题的应用,例 如, else 语句的实验等,从而更为深刻理编译原理的内涵,熟悉它们各自的应用场合及方 法。有些在平时课程中并没有掌握的内容在这次课程设计中都是先通过看课本学懂了,然后 再在课程设计中加深印象,实现算法的应用和扩展。程序设计设计语言采用C,程序运行平 台为 Windows XP,编译器为 Microsoft Visual C+6.0。通过本次实验,熟悉了 PL/0 的词法分析。设计前感觉很简单,但当自己动手去做后才 发现挺多要注意的东西。例如设置保留字名字,按照字母顺序,因为程序查找时用到了折半 查找法。通过这次课程设计的练习,认识到知识的迁移运用,理论应用实际和相

52、互间的密切联系, 感受到理论知识的重要,在今后的学习中一定会更加努力,认真。体会到自己知识有所缺乏, 和个人能力的有限,只有通过同学、老师间的密切配合才能完成一项不错的工作。从中也体 会到了学习中的乐趣,可以自由的创作自己喜欢的东西并自己调试。在一个星期的课程设计中,我较为全面系统的理解了编译原理程序构造的原理和基本实 现方法。自己对修改的方案比较满意,在扩充功能上去实现自己希望PL0能具备的功能。在 条件选择和循环的语句扩展上比较有心得,增加了 FOR语句。实现了 +以及+等扩展功能。 印象比较深刻的是一维数组的扩展,扩展此功能时,我先设计方案,明确需要修改的地方 然而虽然思路明确,但扩展时却出现了很多意想不到的问题,结果花费了大量的时间调试 再加上找参考书,咨询同学,还是顺利完成了这项扩展功能。这次的课程设计可以说比较顺利,但是过程也有一定的曲折。在此期间我们也失落过, 也曾一度热情高涨。从开

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!