编译原理pl语言实验(共13页)_第1页
编译原理pl语言实验(共13页)_第2页
编译原理pl语言实验(共13页)_第3页
编译原理pl语言实验(共13页)_第4页
编译原理pl语言实验(共13页)_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上编译原理课程实践报告书学员姓名: 张冠宇 学 号: 0 专 业: 软件工程 年 级: 2013 2015年 12 月 25 日 1、课程实践目的通过读懂源程序,全面掌握编译原理的基本实现过程。对 PL 编译程序进行扩充,通过扩充加深对编译程序的理解。2、任务概述首先对PL编译程序进行学习,了解其中各功能模块之间的调用关系。在阅读和理解 PL 编译程序之后, 根据教学要求和条件对 PL 语言及编译程序进行扩充。在这个实验里,我扩充了3条语句:for 语句、repeat 语句、case 语句,增加了复制运算+=,-=,3、实现方法上面的两张流程图分别是pl编译程序的总体流

2、程图和模块功能之间的调用关系,是完成三个statement的必须知识。在程序中出现了非常多的过程、函数定义,在这里列出PL编译程序的过程或函数的功能表:过程或函数名简要功能说明pl0主程序error出错处理,打印出错位置和错误编码getsym词法分析,读取一个单词getch漏掉空格,读取一个字符gen生成目标代码,并送入目标程序区test测试当前单词符号是否合法block分程序分析处理过程enter登录名字表position(函数)查找标识符在名字表中的位置constdeclaration常量定义处理vardeclaration变量说明处理listode列出目标代码清单statement语句处

3、理expression表达式处理term项处理factor因子处理condition条件处理interpret对目标代码的解释执行程序base(函数)通过静态链求出数据区的基地址一、 RepeatRepeat 语句 :S-> REPEAT S1 UNTIL ERepeat的程序结构为:Repeat的结构和while的结构比较相似,我是从这一个开始添加的。 如果遇到了repeat语句就转入repeat statement,在这里: 通过getsym()读入一个词语,在这里功能是从源程序中读出一个单词符号(token),把它的信息放入全局变量sym、id和num中。 记下当前代码分配位置,记

4、做cx1,这是repeat循环的开始位置,跳转需要用到。 使用statement函数分析repeat后的语句块,分析的同时生成相应的指令。 分析语句块遇到until符号,此时应当获取逻辑表达式,然后使用expression函数进行分析计算,expression函数第一个参数是follow集,当分析计算读取到follow集中的元素时结束,将表达式的类型存入x中,并生成该表达式的相关代码。 当栈顶值为零时进行跳转,跳转位置为cx1,即repeat开始的位置。二、 ForFOR语句:FOR->FOR ID:= E1 TO E2 DO S1基本思路:语句的基本实现思想是依次读取,首先计算E1的值

5、然后赋给ID,计算S2的值作为终结值。循环时用变量的值和终结值进行比对,决定是不是回到循环之中。每次循环都执行S1. 实现方法: 通过getsym(),获取赋值号左边的标识符id,使用assignment函数对其进行分析。从符号表nametab中找到它的地址信息adrr,并确认这个标识符就是变量名。 当getsym读取到to时进行判断,如果有tosym时,就继续getsym()进行继续分析,如果不是tosym的话,说明出现语法错误。 通过simple expression函数对do语句进行分析,simple expression的第一个参数是follow集,当读取到follow集中的元素时结束

6、,并将表达式的类型存入x中,并生成该表达式的相关代码使用。cx1记录下当前位置cx。执行到这里时,do之前的部分大致完成。 由于id是有范围的,需要对范围进行限定,首先通过lod,level,adrr指令将adrr赋给level,也就是更新了层次,level大于addr时重复操作,这里要用cx2记录当前的cx位置,这是把本循环体结束的下一个位置保存到cx2生成跳转,并在循环结束时用cx2更新为目前循环结束跳转地址。 当getsym读取到do时进行判断,如果有dosym时,就继续getsym()进行继续分析,并用statement分析do后面的表达式,如果不是tosym的话,说明出现语法错误。

7、最后要进行回填过程,为下一次循环的地址赋值。三、 CaseCASE语句:<case语句>:=<case><标识符>:<常量>:<语句> otherwise例如:Case a :1:s12:s2Otherwise: sot end 第一阶段,case和ident,在这一阶段要用casenum记下case含有的情况个数,要保存ident在nametab表中的level与adr值,供后面生成变量与常量比较指令用。并进行判断,判断case后是否为ident,判断ident地址是否为零也就是是否找到了标识符,判断ident的类型是否为变量。 第

8、二阶段,读冒号,不是冒号就报错。 第三阶段,在这里是一个常量,不是常量就报错,要判断常量和变量的值进行匹配。 第四阶段,对于冒号与冒号后语句这个小循环的处理,在这里生成后面语句的代码之前,生成jpc利用变量和常量比较所得结果进行跳转,若为假,则跳到本循环体结束的地方。这里要记录一下cx的值,cx就是跳转到下一个case的位置,便于回填。这种情况下就是case语句判断失败跳转到其他case的情况。 第五阶段对于语句的处理,也就是变量与常量的匹配为真时处理的情况,也就是case命中,处理后生成无条件跳转指令跳转到case语句结束,由于地址未知,要等先把各个循环体中的无条件跳转指令的地址放到goto

9、list数组中,待case结束后再回填跳转地址。 第六阶段是对otherwise的处理,之前写的是一个初始化过程,这里要进行循环来将所有的case进行那个处理。 最后,回填本循环体头的条件跳转地址。回填case结束后跳出的指令。四、 +=和-=运算语句:赋值语句: = <标识符>+= | -= <表达式>例如:s += a ; S -= a;思路(以+=为例):读到+=运算符单词求+=运算符后的表达式expression(fsys, x, level);取+=左部的标识符的值到栈顶gen(lod, level, iadrr);执行加法gen(add,0,0);五、 a+

10、和a和+a和-a运算语句:赋值语句: = <标识符>+= | -= <表达式>例如:a+; +a;思路(以+为例):4、实验的例程Repeat语句:测试语句:Interrupt结果:Case语句:测试语句:Interrupt结果:For语句:测试语句: Interrupt结果:+=、-=样例:Interrupt结果:+、-样例:Interrupt结果:Error样例:代码:Pl分析:Interrepet分析: 0 program main; 0 const a=10,c=1,d=2;* 23Error info: 应是“;”* 13Error info: 本符号在此出现

11、是非法的* 23Error info: 应是“;”* 13Error info: 本符号在此出现是非法的 1 var b,i,k; * 24Error info: 应是“:”* 10Error info: 标识符无定义 1 begin 2 call read(k; * 43Error info: 操作数类型错* 25Error info: 未知错误 3 b:=0; * 40Error info: 类型不一致 5 for i := 0 to k do 9 begin 11 b:=b+i; * 0Error info: 非法字符* 43Error info: 操作数类型错 13 i:=i+1 * 0Error info: 非法字符 15 end; * 40Error info: 类型不一致 27 call write(b);* 43Error info: 操作数类型错 27 end. * 13Error info: 本符号在此出现是非法的5、总结实验充分说明自己在之前的学习中基础很不扎实,在刚开始进行实验时一筹莫展,经过在微信群中的讨论以及其他同学的帮助,还是将第一个问题,也就是

温馨提示

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

最新文档

评论

0/150

提交评论