为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

编译原理实验

2022-06-26 4页 doc 222KB 3阅读

用户头像 个人认证

is_817155

本人有着多年的设备维修经验,愿和大家分享

举报
编译原理实验编译原理实验————————————————————————————————作者:————————————————————————————————日期:ﻩ华北科技学院计算机学院综合性实验实验报告课程名称  编译原理        实验学期2015 至  2016 学年第二 学期学生所在院部 计算机学院  年级2013  专业班级  计科B学生姓名    学号201307014  任课教师   王养廷 实验成绩        计算机学院制开课实验室:软件开发实验室           2016年5月18日实验题目分析中间代码生...
编译原理实验
编译原理实验————————————————————————————————作者:————————————————————————————————日期:ﻩ华北科技学院计算机学院综合性实验实验课程名称  编译原理        实验学期2015 至  2016 学年第二 学期学生所在院部 计算机学院  年级2013  专业班级  计科B学生姓名    学号201307014  任课教师   王养廷 实验成绩        计算机学院制开课实验室:软件开发实验室           2016年5月18日实验题目分析中间代码生成程序一、实验目的分析PL/0编译程序的总体结构、代码生成的方法和过程;具体写出一条语句的中间代码生成过程。二、设备与环境PC兼容机、Windows操作系统、Turbo Pascal软件等。三、实验内容分析PL/0程序的Block子程序,理清PL/0程序结构和语句格式。画出Block子程序的图,写出至少两条PL/0程序语句的语法格式。分析PL/0程序的Block子程序和Gen子程序,了解代码生成的方法和过程。使用概要算法来描述语句的代码生成过程。自己编写一个简单的PL/0程序,能够正确通过编译,得到中间代码。列出自己编写的源程序和编译后得到的中间代码。从中选择一个语句或表达式,写出代码生成的过程。要求从自己的源程序中选择一条语句,结合这条语句写出语义分析和代码生成过程。在描述这个过程中,要说清楚每个功能有哪个子程序的哪条语句来完成,说清楚语句和参数的含义和功能。四、实验结果及分析(一)程序标注(常量声明处理过程constdeclaration *) procedureconstdeclaration;beginifsym =identthen//常量声明过程开始遇到的第一个符号必然应为标识符  begingetsym;  ifsymin[eql,becomes]then//如果是等号或赋值号   beginifsym=becomes//如果是赋值号(常量生明中应该是等号)then error(1);  getsym;//获取下一个token, 等号或赋值号后应接上数字 ifsym=number then//如果的确是数字       beginenter(constant);// 把这个常量登陆到符号表getsym//获取下一个token,为后面作准备   end    elseerror(2)// 如果等号后接的不是数字,抛出2号错误    endelseerror(3)// 如果常量标识符后接的不是等号或赋值号,抛出3号错误   endelse error(4)//如果常量声明过程遇到的第一个符号不为标识符,抛出4号错误  end{constdeclaration};(*变量声明过程vardeclaration*)  procedurevardeclaration;beginifsym=identthen// 变量声明过程vardeclaration   beginenter(varible);将标识符登陆到符号表中//getsym     endelse error(4)//如果变量声明过程遇到的第一个符号不是标识符,抛出4号错误   end{vardeclaration};(二)过程说明说明入口参数,返回值和过程的功能1、入口参数:过程体入口时的处理code[table[tx0].adr].a:=cx;(cx为过程入口地址,填写在code中) with table[tx0]do begin   adr:=cx;(过程的入口填写在table表的过程名中)  size:=dx;(过程需要的空间填写在table中)  end;  cxo:=cx;(保留过程在code中的入口地址在输出目标代码时用) gen(int,0,dx);(生成过程入口指令)2、返回值:(* 通过静态链求出数据区基地址的函数base*)(* 参数说明:l:要求的数据区所在层与当前层的层差*)(* 返回值:要求的数据区基址*) functionbase(l:integer): integer;varb1:integer; begin b1 :=b;(*find base1 leveldown*) (*首先从当前层开始 *)whilel>0do(*如果l大于0,循环通过静态链往前找需要的数据区基址 *) begin  b1:= s[b1];(*用当前层数据区基址中的内容(正好是静态链SL数据,为上一层的基址)的作为新的当前层,即向上找了一层*)l := l-1(*向上了一层,l减一*)end; base:=b1(*把找到的要求的数据区基址返回*) end(*base *);(三)程序静态结构图(四)PL0文法描述在计算机科学中,文法是编译原理的基础,是描述一门程序设计语言和实现其编译器的方法。文法的描述多用BNF(巴克斯范式),而另一个重要的概念:正则表达式,也是文法的另一种形式。PL/0文法的表示:<程序>::=<分程序>.<分程序>::= [<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句><常量说明部分>::=const<常量定义>{,<常量定义>};<常量定义>::=<标识符>=<无符号整数><无符号整数>::=<数字>{<数字>}<标识符>::=<字母>{<字母>|<数字>}<变量说明部分>::= var<标识符>{,<标识符>};<过程说明部分>::=<过程首部><分程序>{;<过程说明部分>}<过程首部>::=procedure<标识符>;<语句>ﻩ::=<赋值语句>|<条件语句>|<当循环语句>|<过程调用语句>|<复合语句>|<读语句>|<写语句>|<空><赋值语句>::= <标识符>:=<表达式><表达式>::= [+|-]<项>{<加法运算符><项>}<项>::=<因子>{<乘法运算符><因子>}<因子>::= <标识符>|<无符号整数>|‘ (’<表达式>‘ ) ’<加法运算符>::= +|-<乘法运算符>::=*|/<条件>::=<表达式><关系运算符><表达式>|odd<表达式><关系运算符>::==|<>|<|<=|>|>=<条件语句>::=if<条件>then<语句><当循环语句>::=while<条件>do<语句><过程调用语句>::=call<标识符><复合语句>::=begin<语句>{;<语句>}end<读语句>::=read ‘( ’<标识符>{,<标识符>}‘) ’<写语句>::=write ‘(’<表达式>{,<表达式>} ‘)’<字母>::=a|b|c|d…..x|y|z<数字>::=0|1|2|3…...8|9(五)代码生成程序说明对分程序体入口的处理(见程序文本block的过程体)   begin(*block*)   dx:=3; tx0:=tx;(*保留当前table表指针值,实际为过程名在table表中的位置*)   table[tx].adr:=cx;(*保留当前code指针值到过程名的adr域*)  gen(jmp,0,0);(*生成转向过程体入口的指令,该指令的地址为cx已保留在过程名的adr域,真正的过程体入口地址,等生成过程体入口的指令时,再由table[tx].adr中取出cx将过程体入口返填到cx所指目标代码,即:(jmp,0,0)的第3区域,同时填到table[tx].adr中*)②过程体入口时的处理code[table[tx0].adr].a:=cx;(cx为过程入口地址,填写在code中) with table[tx0]do   begin     adr:=cx;(过程的入口填写在table表的过程名中)   size:=dx;(过程需要的空间填写在table中)   end; cxo:=cx; (保留过程在code中的入口地址在输出目标代码时用)   gen(int,0,dx);(生成过程入口指令)table表格管理(六)代码生成程序实例给出pl0源程序,中间代码和过程说明编写代码:constx=4;vara,b;proceduretry;begin b:=a*x-x;end;begin  a:=5;  calltry;end.运行程序如图:五、实验这次实验让我学到了许多,通过运行THPL0CAI程序,掌握了符号表的建立过程,及运行过程中运行栈的变化过程。了解了PL/0语言是PASCAL语言的子集和指令功能表.但是在编码过程中暴露的问题是我们今后需要改进的地方,我相信认识到了问题所在,今后努力的方向才会更明确,才会更好的提高自己的水平。实践出真知,平时学习的仅限于书本知识,只会做几道题目,只有真的应用于实践中,才明白原来它的原理是这样的,而这些细节也在一步一步的调试过程中明了。教师 评定项目ABCD评定项目ABCD算法正确流程图正确语句语法格式正确源程序正确中间代码正确分析过程正确报告规范回答问题正确实验结果正确题解正确其他:评价教师签名:年月 日
/
本文档为【编译原理实验】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索