




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计报告 ( 年度第一学期)名 称: 编译技术课程设计 题 目: pl/0语言编译器的中间代码生成院 系: 班 级: 学 号: 学生姓名: 指导教师: 设计周数: 一周 成 绩: 日期: 年 月 日 1 课程设计的目的和要求1.1 课程设计的目的本次设计的时间为1周,目的是通过使用高级语言实现部分算法加强对编译技术和理论的理解。设计的题目要求具有一定的规模,应涵盖本课程内容和实际应用相关的主要技术,同时使大家将理论与实际应用结合起来,受到软件设计等开发过程的全面训练,从而提高软件开发的能力。1.2 课程设计的要求1、要求用递归子程序法/或预测分析法实现对表达式、各种说明语句、控制语句进行语法分析。2、若语法正确,则用语法制导翻译法进行语义翻译:对说明语句,要求将说明的各符号记录到相应符号表中;对可执行语句,应产生出四元式中间代码并填写到三地址码表中;3、若语法错误,要求指出出错性质和出错位置(行号)。出错处理应设计成一个出错处理子程序。2 系统描述pl/0的编译程序和目标程序的解释执行程序都是用java语言书写的,因此pl/0语言可在配备java语言的任何机器上实现。本次课设开发平台即为java。用递归子程序法实现了对表达式、各种说明语句、控制语句进行语法的分析。其中,对各个变量符号保存到了符号表中。对可执行语句,转化成四元式中间代码进行输出。本程序中,通过出错处理子程序,也进行了语法的错误的记录,并且输出了出错的行号和出错原因。该程序的输入是打开test文件,通过文件输入流读入,输出有生成的中间代码、符号表内容、错误分析三部分内容,分别用java界面控件显示出来。2.1 pl/0语言的描述pl/0语言的编译程序是一个编译解释执行系统。pl/0的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。其编译过程采用一趟扫描方式,以语法分析类为核心,词法分析和代码生成类都作为一个独立的类,当语法分析需要读单词时就调用词法分析程序,而当语法分析正确需要生成相应的目标代码时,则调用代码生成程序。用表格管理程序建立变量、常量和过程表示符的说明与引用之间的信息联系。用出错处理程序对词法和语法分析遇到的错误给出在源程序中出错的位置和错位性质。当源程序编译正确时,pl/0编译程序自动调用解释执行程序,对目标代码进行解释执行,并按用户程序的要求输入数据和输出运行结果。2.2 pl/0文法的描述在计算机科学中,文法是编译原理的基础,是描述一门程序设计语言和实现其编译器的方法。文法的描述多用bnf(巴克斯范式),而另一个重要的概念:正则表达式,也是文法的另一种形式。pl/0文法的ebnf表示::= .:= := const,;:= =:= := |:= var, ;:= ;:= procedure;:= | := := := +|-:= := | ( ) := +|-:= *|/:= |odd:= =|=:= ifthen:= whiledo := call := begin;end:= read ( , ) := write ( , ) := a|b|c|d.x|y|z := 0|1|2|3.8|92.3 pl/0语法描述图图2-3-1 程序语法描述图图2-3-2 分程序语法描述图图2-3-3 语句语法描述图2-3-4 条件语句描述图图2-3-5 表达式语法描述图2-3-6 项语法描述图2-3-7 因子语法描述3 概要设计3.1 概要设计(体现系统的设计思路和主要功能)该编译器采用java语言编写,共采用了七个类,48个方法(函数)用来功能实现,其中pl0类为main方法所在的类,是整个编译主程序类和主界面框架类。getsym类为编译器的词法分析类和block类为编译器的语法分析类,为整个程序的核心所在。系统设计思路如图3-1。主程序词法分析源程序输入程序运行输出语法分析中间代码生成表格管理程序出错处理程序图3-1 系统设计思路图主要功能设计:首先在源程序相同的目录下创建test文件,并在文档中输入需要编译的程序语句,然后定义一个输入流文件,利用打开(button)按钮打开需要编译的文件,在调用初始化各种变量的初始化函数。接着开始进行词法分析,词法分析程序的主要任务是对构成源程序的字符串从左到右的扫描,逐个字符地读入源程序字符并按照构词规则切分成一个一个具有独立意义的单词。并确定其属性(如保留字、标识符、运算符、界限符和常量等)。词法分析是编译过程中的第一个阶段,在语法分析前进行 。也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。在语法分析过程中,将变量符号存入符号表中,语法分析完了之后就是打印中间代码的四元式形式。下表为一些主要函数方法的功能及其组织结构。(如表1)表3-1 pl/0的各类及其方法的功能简单描述pl/0编译器用到的类及其方法功能简单介绍pl0类主程序类 main()方法程序入口getsym类词法分析列,用于显示错误行号、类型号和内容 getsym()方法构造函数,定义保留字表;由文件名,建立一个输入流。 geterronumber()方法用于返回词法分析时发生的错误个数 getch()方法在原文件中读取一个符号 gettoken()方法将读取的符号组合成一个单词tokenblock类语法分析类,查出错误,生成四元式 block()方法构造函数,接收一个词法分析对象 geterronumber()方法返回语法分析时发生的错误个数analyse()方法语法分程序分析,是最主要的函数 declaration()方法常量声明的方法vardeclaration()方法变量声明的方法 enter()方法注册名字表 position()方法查找符号表 statement()方法语句的分析处理 condition()方法条件分析 expression()方法表达式的处理 term()方法项的处理 factor()方法因子的分析处理 printname()方法查看符号表内容 printcode()方法midcode的显示方法 newtemp()方法临时变量方法,记录中间变量并递增 backtemp()方法记录中间变量并递减token类 用于存放读取的token单词 token()方法构造函数 setlinenum()方法设置token对象的行号 getlinenum()方法返回token对象的行号 getnam()方法返回token对象的内容 getsym()方法返回token对象的类型error类错误处理类 getlinenumber()方法获得错误的行号 setlinenumber()方法设置错误的行号 geterrorstring ()方法获得错误的原因 error()方法构造函数nameclass类用于表示符号类,存放于符号表中 nameclass()方法构造函数 setadr()方法设置符号adr属性 getadr()方法获得符号adr属性 getkind()方法返回符号kind属性 getval()方法返回符号val属性 getlev()方法返回符号lev属性midcode类midcode类 表示midcode指令 midcode()方法构造函数 setresult()方法设置结果-中间参数 getop()方法获得操作码 getarg1()方法获得第一个操作数 getarg2()方法获得第二个操作数 getresult()方法获得结果-中间参数3.2 系统用例图图3-2 系统用例图3.3 系统用例此编译器系统共有两个面向用户的用例,导入程序用例和分析pl/0程序用例。其中分析pl/0程序用例中又包含了词法分析用例、语法分析用例、和生成四元式用例。3.4 开发环境在java开发环境下实现pl/0中间代码(四元式)生成编译器。4 详细设计4.1 系统的类图图 4-1-1 系统类图4.2 主要算法的流程图 输出数据 词法分析程序表格管理程序语法分析程序中间代码生成程序出错处理程序pl/0主执行程序pl/0源程序表示子程序表示数据流表示调用关系图4-2-1 pl/0编译程序的结构图开始置初值调用getsym获取单词调用block过程进行分析当前单词是否是源程序结束符“.”?当前单词是否是源程序结束符“.”?输出中间代码四元式和符号表至界面结束出错打印错误yn图4-2-2 pl/0编译程序总体流程图getsymk=0ch=空?getchch是数字?ch是字母?k变量说明处理yn图4-2-4 block过程的流程图语句条件表达式项因子图4-2-5 statement语句分析流程图4.3 数据分析与定义1、token类 用于存放读取的token单词class tokenprivate string sym = ; / 保存token的类型private string name = ; / 保存token的内容public int linenum;/ 该词所在的行2、符号类,存放于符号表中class nameclassstring name = null;string kind = null;int val; / 值int level;/ 层次int adr;/ 过程的入口代码地址3、错误处理类class erropublic static string errorstring = ;string err= 缺少左括号 ,非法字符:赋值符号:= ,等号后的字符为非法字符 ,缺少等号 ,声明过程中遇到的字符不是标识符 ,缺少分号 ,非法语句 ,整数大小越界 ,整数位数越界 ,缺少右括号 ,语句和语句之间没有分号 ,标识符不存在 ,标识符不是变量名 ,缺少赋值符号 ,call后不是标识符 ,call后不是过程名 ,if后不是then ,没有遇到end ,while循环缺少do ,标识符长度越界 ,缺少逻辑运算符 ,标识符为过程名 ,缺少右括号;int linenumber;int t;4、midcode类 表示midcode指令class midcodestring op = ;/ 第一个参数:操作码string arg1 = ; / 第二个参数:操作数1string arg2 = ; / 第三个参数:操作数2string result = ; / 第四个参数:结果-中间参数4.4 系统界面设计图4-4-1 系统界面这次时间比较紧,所以界面部分就只是以实现最基本的功能为主,所以界面比较简单,只有打开和分析两个按钮。打开文件选择要编译的pl文件,然后点击分析就可以执行整个程序,若源程序没有错误,则会在中间代码和符号表下面的框中内分别输出四元式和符号表,错误分析里将会显示错误信息为0的字样。若源程序有错误,则中间代码和符号表项不输出文字,在错误分析内将会显示程序的错误信息和错误数量。5 测试方法和测试结果5.1 测试用例1测试目的:通过primenum.pl文件(本身词法语法是正确的)来进行检测,在没有词法语法的前提下是否能够正确的分析pl/0程序,并且生成正确的中间代码,符号表的内容是否正确。其中test.pl文件中的程序代码包含了conset常量,var变量,procedure过程声明,begin、end关键字,复杂表达式赋值,read、write语句,算术运算符(+、*)、关系运算符(=、/、#、=、=),条件if、then语句,过程调用call语句,当型循环while、do语句,和字母数字,基本包含了所有pl0语言的语法语义规则。输入如程序5-1所示。const true=1,false=0;var x,y,m,n,pf;procedure prime;var i,f;procedure mod;x:=x-x/y*y;begin f:=true;i:=3;while i=2 dobeginwrite(2);if n=2 then pf:=true;m:=3;while m=n dobegin call prime;m:=m+2end;read(n)end;if pf = false then write(0)end.程序5-1 测试用例1输出结果如图5-1所示。图5-1 测试结果5.2 测试用例2测试目的:通过primenume.pl文件来进行检测,存在语法错误的时候,查看运行结果是否能将错误所在的行找出来,并且打印出错误的个数和错误的原因。输入如程序5-2所示。const true=1,false=0;var x,y,m,n,pf;procedure primevar i,f; procedure mod; x:=x-x/y*y; begin f:=true; t:=3; while i=2 begin write(2); if n=2 then pf:=true; m:=9234; while m=n do begin call pr; m:=m+2 end; read(n) end; if pf false then write(0)end.程序5-2 测试用例2输出结果如图5-2所示。图5-2 错误程序测试结果结论和展望结论本次课设我们做的是pl/0语言编译器的中间代码生成部分,对于做一个完整的编译器来说,这也算得上是比较重要的一部分已经完成了,接下来给出目标代码即可。但是,在整个系统设计上还有些不足,比如说一些变量定义的不规范,常量声明不够完整等等。通过写课程设计报告也让我们从软件的层面认识到了软件设计结构的重要性,只有结构明确、思路清晰,充分考虑系统的需求,做好详细设计的工作,软件做起来才会比较顺手,不然会有些无从下手的感觉。通过本次编译课程设计,让我们将理论学习与实践很好的结合了起来,是将理论应用于实际的最好的方法,通过对pl/0语言的词法和语法分析,我们了解了编译过程是一个什么样的具体分析过程,这也是通过本门课设收获最大之处,以前使用过的许多种编译器,却从来没有想过这些编译器是怎样将高级语言程序转化成低级语言程序的,这次课设让我明白了许多东西。同时,课程设计过程中对语法分析时,需要很好的数据结构的设计,也让我们认识到了数据结构的重要性。总之,通过本次课设,锻炼了自己设计算法,设计软件的能力,是一次很好的实践过程,同时也暴露了不少缺点,让我们认识到了不足,这为我们今后的学习指引了新方向。本次实验的特点:本次课设中最难的部分莫过于生成代码及执行代码,由于采用语法制导翻译,要将代码生成函数加到语法分析程序中的正确位置,以及符号表的填充,还有层次等数值的改变,对目标机运行机制的理解,都是课设里的极大难点,如果指令生成错误,造成内存分配不当等错误,程序执行就会失败。这些抽象在书本中的知识,要转化为编程中的细节,在刚开始的时候是很茫然的。在仔细研究过给出的关于pl0编译器的ppt以及一些参考代码后,终于有了大致的了解。最终我们在这个编译器中实现了pl/0语言的词法分析、语法分析和中间代码生成,其中将变量符号进行了表格管理,对错误的地方进行了错误的分析。其中,我们使用了java语言的控件设计系统界面,将生成的中间代码、符号表和错误分析部分很好的显示在系统主界面上,让用户使用起来更方便。展望本次实验的不足还有很多,作为一个完善的编译器,由于时间的原因,我们没有实现文件保存功能,即不能将生成的中间代码和错误分析写进文件进行保存,也没有将用户界面设计的很详细。但是之后我们会尽量完善该编译器的这些功能。收获:通过本次实验,我收获了很错东西。首先对编译有了进一步的深刻理解,通过对递归下降法应用,让我对数据结构的设计思想有了很深的认识,同时我们对词法分析、语法分析的原理和过程都有了进一步的巩固,使用java平台开发也让我们的编程水平也起到了锻炼的作用,巩固了平时所学的知识,真正做到了学以致用。但是在编码过程中暴露的问题是我们今后需要改进的地方,我相信认识到了问题所在,今后努力的方向才会更明确,才会更好的提高自己的水平。学习编译技术课程的体会和对本门课程的评价上编译原理这门课前就听说这是一门比较难懂难学的课,老师课上也强调过一定要认真听讲,不然自己回去看书是很难看明白的。刚开始的时候,将书翻了一遍,果然发现书本中都是一些很抽象的理论、原理和证明,自己看了看根本就是云里雾里,如果是纯粹的自学肯定要花费大量的时间和精力,因此在王老师的悉心督促下,我们上课都特别认真的听讲。让我们值得庆幸的是,王老师讲课的方式让我们比较感兴趣,在思路上不会莫名其妙的走神,感觉一学期下来,确实是每节课都听得挺认真的,因此还算是比较顺利的学习完了编译这门难课。王老师讲课很细心,对难点重点把握得张弛有度,其中,对许多知识点难点又进行了重复讲授和复习,而且,对作业安排的很合理,我们在作业中的小问题也被老师一语道破,这样充分巩固了我们对知识的掌握。就这样,在老师的带领和悉心教导下,我们渐渐找到了学习编译原理的规律,也找到了学习方法
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 艾梅乙护理培训
- 二零二五年度服装店员工劳动合同电子版范本
- 2025版股权投资及投资决策与风险控制合同
- 二零二五年工厂食堂环境卫生保洁承包合同范本
- 二零二五年度高压电线销售服务协议
- 2025版安置房房票买卖贷款提前还款合同
- 二零二五年股权期权登记与管理合同范本
- 二零二五年度智能化家居产品居间服务不可撤销合同模板
- 2025版个人房贷还款合同收据模板
- 2025版电子信息产业合作研发技术保密与市场竞争协议
- 2025淄博市沂源县历山街道社区工作者考试真题
- 高压电缆头制作培训教材
- 国旗法课件教学课件
- 食管内镜支架植入护理配合
- 老年人防诈骗课件
- 《煤矿重大事故隐患判定标准》
- 二氧化碳逆水煤气变换技术研究进展
- GB/T 45411.1-2025光学和光子学瞄准望远镜规范第1部分:普通性能仪器
- 金融知识进校园高中课件
- 常压储罐管理制度
- 税务师事务所内部管理制度
评论
0/150
提交评论