版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 编译原理实验报告 课程名称_编译原理_ 题目名称 PL0上机作业 学生学院_ 计算机学院_ 专业班级_ 12级计科8班 学 号_ 3112006110 _学生姓名_ 谢偲灏 _ 指导教师_ 杨劲涛 _2015年 1 月 3 日一、 概述目的:在分析理解一个教学型编译程序(如PL/0)的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充。达到进一步了解程序编译过程的基本原理和基本实现方法的目的。1 要求:课内实验(考试前交报告)对PL/0作以下修改扩充:(1)增加单词:保留字:FOR,TO,DOWNTO,+=,-=,+,-;RETURN 要求:词法识别即可(2)替换单词:不等
2、号# 改为 < >,(3)增加条件语句的ELSE子句,要求:写出相关文法,语法图,语义规则。二、 实验环境与工具(1)源:C语言(2)程序目标语言: PL/0(3)实现工具(平台):vc+6.0 (4)运行平台:PC机,Windows7三、 设计方案1、 结构设计说明(1)PL/0 语言编译器 PL/0语言可看成是PASCAL语言的子集,它的编译程序是一个编译解释执行系统。PL/0的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。(2) PL/0编译程序的语法分析过程BLOCK是整个编译过程的核心。这里根据编译程序的总体流程图,来弄清BLOCK过程在整个编译程序中的作用。总流
3、程图如下图所示:PL/0 的编译程序采用一趟扫描方式,以语法分析程序为核心,词法分析程序和代码生成程序都作为一个独立的过程,当语法分析需要读单词时就用词法分析程序,而当语法分析正确需生成相应的目标代码时,则调用代码生成程序。此外,用表格管理程序建立变量,常量和过程标识符的说明与引用之间的信息联系。用出错处理程序对词法和语法分析遇到的错误给出在源程序中出错的位置和错误性质。2.各功能模块描述过程或函数名简要功能说明pl0主程序error出错处理,打印出错位置和错误编码getsym词法分析,读取一个单词getch漏掉空格,读取一个字符gen生成目标代码,并送入目标程序区test测试当前单词符号是否
4、合法block分程序分析处理过程enter登录名字表position(函数)查找标识符在名字表中的位置constdeclaration常量定义处理vardeclaration变量说明处理listode列出目标代码清单statement语句处理expression表达式处理term项处理factor因子处理condition条件处理interpret对目标代码的解释执行程序base(函数)通过静态链求出数据区的基地址四、主要成分描述符号表为了组成一条指令,编译程序必须知道其操作码及其参数(数或地址)。这些值是由编译程序本身联系到相应标识符上去的。这种联系是在处理常数、变量和过程说明完成的。为此,
5、标识符表应包含每一标识符所联系的属性;如果标识符被说明为常数,其属性值为常数值;如果标识符被说明成变量,其属性就是由层次和修正量(偏移量)组成的地址;如果标识符被说明为过程,其属性就是过程的入口地址及层次。常数的值由程序正文提供,编译的任务就是确定存放该值的地址。我们选择顺序分配变量和代码的方法;每遇到一个变量说明,就将数据单元的下标加一(PL/0 机中,每个变量占一个存贮单元)。开始编译一个过程时,要对数据单元的下标dx 赋初值,表示新开辟一个数据区。dx 的初值为3,因为每个数据区包含三个内部变量RA,DL 和SL。 运行时存储组织和管理对于源程序的每一个过程(包括主程序),在被调用时,首
6、先在数据段中开辟三个空间,存放静态链SL、动态链DL和返回地址RA。静态链记录了定义该过程的直接外过程(或主程序)运行时最新数据段的基地址。动态链记录调用该过程前正在运行的过程的数据段基址。返回地址记录了调用该过程时程序运行的断点位置。对于主程序来说,SL、DL和RA的值均置为0。静态链的功能是在一个子过程要引用它的直接或间接父过程(这里的父过程是按定义过程时的嵌套情况来定的,而不是按执行时的调用顺序定的)的变量时,可以通过静态链,跳过个数为层差的数据段,找到包含要引用的变量所在的数据段基址,然后通过偏移地址访问它。在过程返回时,解释程序通过返回地址恢复指令指针的值到调用前的地址,通过当前段基
7、址恢复数据段分配指针,通过动态链恢复局部段基址指针。实现子过程的返回。对于主程序来说,解释程序会遇到返回地址为0的情况,这时就认为程序运行结束。解释程序过程中的base函数的功能,就是用于沿着静态链,向前查找相差指定层数的局部数据段基址。这在使用sto、lod、stoArr、lodArr等访问局部变量的指令中会经常用到。类PCODE代码解释执行的部分通过循环和简单的case判断不同的指令,做出相应的动作。当遇到主程序中的返回指令时,指令指针会指到0位置,把这样一个条件作为终至循环的条件,保证程序运行可以正常的结束。 语法分析方法语法分析子程序采用了自顶向下的递归子程序法,语法分析同时也根据程序
8、的语义生成相应三元代码,并提供了出错处理的机制。语法分析主要由分程序分析过程(BLOCK)、参数变量分析过程(ParaDeclaration)、参数变量处理过程(ParaGetSub)、数组处理过程(ParaGetSub)、常量定义分析过程(ConstDeclaration)、变量定义分析过程(Vardeclaration)、语句分析过程(Statement)、表达式处理过程(Expression)、项处理过程(Term)、因子处理过程(Factor)和条件处理过程(Condition)构成。这些过程在结构上构成一个嵌套的层次结构。除此之外,还有出错报告过程(Error)、代码生成过程(Gen
9、)、测试单词合法性及出错恢复过程(Test)、登录名字表过程(Enter)、查询名字表函数(Position)以及列出类 PCODE代码过程(Listcode)作过语法分析的辅助过程。 中间代码表示中间代码是是源程序的一种内部表示,复杂性介于源语言和目标机语言之间。中间代码的表示方法有逆波兰式、三元式、树形、四元式等。(1) 逆波兰记号是最简单的一种中间代码表示形式,早在编译程序出现之前,它就用于表示算术表达式。后缀表示法表示表达式,其最大的优点是易于栈式计算机处理表达式。(2) 每个三元式由三个部分组成:A. 算符opB. 第一运算对象ARG1C. 第二运算对象ARG2运算对象可能是源程序中
10、的变量,也可能是某个三元式的结果,用三元式的编号表示。(3) 树形表示是三元式表示的翻版。(4) 四元式是一种比较普遍采用的中间代码形式:算符op,运算对象ARG1,运算对象ARG2,运算结果RESULT五、开发过程和完成情况1.增加单词:保留字:FOR,TO,DOWNTO,RETURN运算符 : +=,-=,+,-;新增4个保留字和4个运算符,合计8个单词。其中保留字FOR,TO,DOWNTO,RETURN 分别对应downtosym,forsym,returnsym,tosym;运算符 +=,-=,+,- 分别对应 pluseql,minuseql,plusplus,minusminus1
11、.1保留字enum symbol nul, ident, number, plus, minus, times, slash, oddsym, eql, neq,lss, leq, gtr, geq, lparen,rparen, comma, semicolon,period, becomes,beginsym, endsym, ifsym, thensym, whilesym,writesym, readsym, dosym, callsym, constsym,varsym, procsym,downtosym,forsym,returnsym,tosym,elsesym,pluseql
12、,plusplus,minuseql,minusminus/增加的语句;/*设置保留字名字,按照字母顺序,便于折半查找*/strcpy(&(word00),"begin");strcpy(&(word10),"call");strcpy(&(word20),"const");strcpy(&(word30),"do");strcpy(&(word40),"downto"); /*增加保留字DOWNTO*/strcpy(&(word50),"
13、;else"); /*增加保留字ELSE*/strcpy(&(word60),"end");strcpy(&(word70),"for"); /*增加保留字FOR*/strcpy(&(word80),"if");strcpy(&(word90),"odd");strcpy(&(word100),"procedure");strcpy(&(word110),"read");strcpy(&(word120),&q
14、uot;return"); /*增加保留字RETURN*/strcpy(&(word130),"then");strcpy(&(word140),"to"); /*增加保留字TO*/strcpy(&(word150),"var");strcpy(&(word160),"while");strcpy(&(word170),"write");/*设置保留字符号*/wsym0=beginsym;wsym1=callsym;wsym2=constsym;
15、wsym3=dosym;wsym4=downtosym; /*增加保留字符号downtosym*/wsym5=elsesym; /*增加保留字符号elsesym*/wsym6=endsym;wsym7=forsym; /*增加保留字符号forsym*/wsym8=ifsym;wsym9=oddsym;wsym10=procsym;wsym11=readsym;wsym12=returnsym; /*增加保留字符号returnsym*/wsym13=thensym;wsym14=tosym; /*增加保留字符号tosym*/wsym15=varsym;wsym16=whilesym;wsym17
16、=writesym;1.2保留字和单词的个数1),原保留字个数是14,# define norw 14。因为新增加保留字4个 ,所以 # define norw 182),原单词总数是33,#define symnum 33。因为新增加单词9个,所以#define symnum 421.3运算符在GetSym()函数中增加:else if(ch='+')/ 增加检测+和+=符号 getchdo;if(ch='+')sym=plusplus; /构成+号getchdo;else if(ch='=')sym=pluseql; /构成+=号getchd
17、o;elsesym=plus;else if(ch='-') /增加检测-和-=符号 getchdo;if(ch='-')sym=minusminus; /构成-号getchdo;else if(ch='=')sym=minuseql; /构成-=号getchdo;elsesym=minus;2.修改单词:不等号# 改为 <>(1) /ssym'#'=neq; 把这段删除(2)在GetSym()过程中把分析到的<>定义为不等号,从“<”切入修改。e if(ch='<') /*检测
18、小于或小于等于符号*/ getchdo; if(ch='=') sym=leq; getchdo; else if (ch='>')/增加这段语句 sym=neq; /构成不等号 <> getchdo; else sym=lss; 3.增加条件语句的ELSE子句,要求:写出相关文法,语法图,语义规则。(1)相关文法 G(S): Sif S else S | if S | a(2)语法图(3) 语义规则产生式语 义 规 则S®if B then M S1 backpatch(E.truelist, M.quad );S.nextlist:=merge(E.falselist, S1.nextlist) M ® M.quad := nextquad ; N ® N.nextlist:=makelist(n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 采购合同管理的改进策略与操作流程3篇
- 采购合同风险评估流程3篇
- 采购合同风险识别表3篇
- 采购合同预付款的信用管理策略3篇
- 采购合同培训课程设置3篇
- 采购合同会审制度的政策法规3篇
- 采购合同管理中的合同管理经验3篇
- 采购合同编码的编制技巧3篇
- 2024年版步行街商业租赁合同3篇
- 采购合同助力企业降低合同风险3篇
- 2024-2030年中国铝汽车紧固件行业销售规模与盈利前景预测报告
- 城市建设苗木吊装安全方案
- 中医院医生作风建设工作方案(6篇)
- DIY手工坊创业项目计划书
- (高清版)DB21∕T 1795-2021 污水源热泵系统工程技术规程
- 2024-2025学年人教版数学五年级上册期末检测试卷(含答案)
- 【MOOC】犯罪心理学-中南财经政法大学 中国大学慕课MOOC答案
- 《外盘期货常识》课件
- 2024江苏盐城港控股集团限公司招聘23人易考易错模拟试题(共500题)试卷后附参考答案
- 2024年三支一扶考试基本能力测验试题及解答参考
- 中华人民共和国统计法
评论
0/150
提交评论