好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

编译原理--综合性实验.docx

13页
  • 卖家[上传人]:大米
  • 文档编号:515409765
  • 上传时间:2023-10-06
  • 文档格式:DOCX
  • 文档大小:123.72KB
  • / 13 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 华北科技学院计算机学院综合性实验实验报告课程名称 编译原理 实验学期 至 学年第—学期学生所在系部 年级 专业班级 学生姓名 学号 任课教师 实验成绩 计算机学院制开课实验室:基础实验 年 月日实验题目 分析中间代码生成程序―、实验目的分析PL/O编译程序的总体结构、代码生成的方法和过程;具体写出一条语句的 中间代码生成过程二、 设备与环境PC兼容机、Windows操作系统、Turbo Pascal软件等三、 实验内容1. 分析PL/0程序的Block子程序,理清PL/0程序结构和语句格式画出Block 子程序的流程图,写出至少两条PL/0程序语句的语法格式2. 分析PL/0程序的Block子程序和Gen子程序,了解代码生成的方法和过程 使用概要算法来描述语句的代码生成过程3. 自己编写一个简单的PL/0程序,能够正确通过编译,得到中间代码列出 自己编写的源程序和编译后得到的中间代码4. 从中选择一个语句或表达式,写出代码生成的过程要求从自己的源程序中 选择一条语句,结合这条语句写出语义分析和代码生成过程在描述这个过 程中,要说清楚每个功能有哪个子程序的哪条语句来完成,说清楚语句和参 数的含义和功能。

      四、 实验结果及分析(一)程序标注levmax = 3; { max depth of block nesting } {最大允许的块嵌套层数}{语法分析过程block }{参数:lev:这一次语法分析所在的层次}{ tx:符号表指针}{ fsys:用于出错恢复的单词集合}procedure block(lev, tx: integer; fsys: symset); vardx: integer; { data allocation index } {数据段内存分配指针,指向下一个被分配 空间在数据段中的偏移位置}txO: integer; { initial table index } {记录本层开始时符号表位置} cx0: integer; { initial code index } {记录本层开始时代码段分配位置}{登陆符号表过程enter }procedure enter(k: objectl);begin { enter object into table } {参数:k:欲登陆到符号表的符号类型}tx := tx + 1; {符号表指针指向一个新的空位}with table[tx] do {开始登录}beginname := id; { name是符号的名字,对于标识符,这里就是标识符的名字} kind := k; {符号类型,可能是常量、变量或过程名}case k of {根据不同的类型进行不同的操作}constant: {如果是常量名}begin讦num > amax then {在常量的数值大于允许的最大值的情况下}beginerror(31); {抛出31号错误}num := 0; {实际登陆的数字以0代替}end;val := num {如是合法的数值,就登陆到符号表}end;variable: {如果是变量名}beginlevel := lev; {记下它所属的层次号}adr := dx; {记下它在当前层中的偏移量}dx := dx+1; {偏移量自增一,为下一次做好准备}end;procedur: {如果要登陆的是过程名}level := lev {记录下这个过程所在层次}EndEndend { enter };{登录符号过程没有考虑到重复的定义的问题。

      如果出现重复定义,则以最后一 次的定义为准}{在符号表中查找指定符号所在位置的函数position }{参数:id:要找的符号}{返回值:要找的符号在符号表中的位置,如果找不到就返回0 } function position (id: alfa): integer;vari: integer;begin { find identifier in table }table[0].name := id; {先把id放入符号表0号位置}i := tx; {从符号表中当前位置也即最后一个符号开始找}while table[i].name <> id do {如果当前的符号与要找的不一致} i := i - 1; {找前面一个}position := i {返回找到的位置号,如果没找到则一定正好为0 } end{ position };(二)过程说明说明入口参数,返回值和过程的功能{语法分析过程block }{参数:lev:这一次语法分析所在的层次}{ t x:符号表指针}{ fsys:用于出错恢复的单词集合}{登陆符号表过程ent er}{参数:k:欲登陆到符号表的符号类型}procedure enter(k: objectl);{在符号表中查找指定符号所在位置的函数position }{参数:id:要找的符号}{返回值:要找的符号在符号表中的位置,如果找不到就返回0}(三)程序静态结构图PL / 0 遞程序目栋程序(四)PLO文法描述〈程序>::=<分程序〉.〈分程序>:: = [<常量说明部分);][<变量说明部分〉;]{< 过程说明部分>;}<语句部分〉〈常量说明部分>::=cons t〈常量定义>{,〈常量定义>}〈常量定义>::=〈标识符> =〈无符号整数〉〈无符 号整数 >::二〈数字>{<数字>}〈变量说明部分 >::二var<标识符>{<标识 符>}〈标识符>::二〈字母>{<字母>|<数字>}〈过程说明部分>::=<过程 首部 >< 分程序〉〈过程首部 >::二procedure<标识符〉〈语句部分 >::=< 语句>|<复合语句〉〈复合语句>::=begin<语句>{;〈语句>}end〈语句 >::=〈赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|〈读语句>|<写语句>|<复合语句>|<空语句〉〈赋值语句 >::二〈标识 符 >:=< 表达式〉〈条件 >::=< 表达式〉〈关系运算符 >< 表达式>|odd〈表 达式〉〈表达式>::=[+|-]<项>|<表达式 >< 加法运算符〉〈项〉〈项 >::=< 因子>|<项〉〈乘法运算符〉〈因子〉〈因子 >::=<标识符>|<常量>|(<表达式〉)〈常量 >::=< 无符号整数〉〈加法运算符>::=+|-〈乘法运算符 >::二*1/〈关系运算符 >::=<|>|<>|>=|<=|二〈条件语句 >::二if〈条件>t hen<语句〉〈过程调用语句 >::二call<标识符〉〈当型循环语句 >::二wh ile〈条件>do<语句〉〈读语句>::二read(<标识符>{,〈标识符>})〈写语句>::二write(<表达式>{,〈表达式>})〈字母 >::=a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s| t|u|v|w|x|y|z〈数字 >::=0|1|2|3|4|5|6|7|8|9(五)代码生成程序说明①对分程序体人口的处理(见程序文本block的过程体)begin (*block*)dx:=3;txO:= tx; (*保留当前table表指针值,实际为过程名在table 表中的位置*)table]tx].adr:二ex; (*保留当前code指针值到过程名的adr 域*)gen(jmp,0,0);记录过程在code的入口到table中的adr域如下表所示:CONST Ar35,氏4% code(cx)VAR C, D, E; (O)jmpOOPKTEBURE P; CX一 (1)jmpOOVAR G■SHE: AEW> OO1STAITYAL: 35I11E: BKUDt OO1STAITVAL: 49CIUD VARIABLELEVEL: LEVAHR= Di/HUE: DKUDt VARIABLELETEL: LEVADR: D*1EEW> VARIABLELEVEL: LEVA£R= DI+23I/IE: PKIIDt FROdDURLETEL: LETADR: 1!SIZE: 4GKBIQ VWOELE1EL: I£m皿DX・・・■・・ 名字 类臺 层越值 地址 存幡空祠(*生成转向过程体入口的指令,该指令的地址为cx已保留在过程名的adr域,真 正的过程体入口地址,等生成过程体入口的指令时,再由table]tx].adr中取出cx 将过程体入口返填到cx所指目标代码,即:(jmp,0,0)的第3区域,同时填到 table]tx].adr 中*)②过程体入口时的处理code]table]txO].adr].a:二cx; (cx 为过程入口地址,填写在 code 中)with table] txO] dobeginadr:=cx;(过程的入口填写在table表的过程名中) size:=dx;(过程需要的空间填写在table中)end;cxo:=cx;(保留过程在code中的入口地址在输出目标代码 时用)gen(int,O,dx);(生成过程入口指令)table表格管理CONST Af35, 、imi n eVAR C, D, Ei 过程的入口地±L填ITOCEDURE Pi 写在s"利俎皿中VAR G3 mp(0) (1)HUE:直HUE: EHUE: CHUE; DHUE; EHUE; rEIHCb COffSTiHT EIBEb COffSTUrrEIHEb VAEIAELEEIHEt ViRIAELE EIHEt VARIABLEEIHEt FR.OCEDUR7AL: 35 7AL: 49 LEVEL: LEV LEVEL; LEV LEVEL; LEV LEVEL; LEVADE= d]ADIL DxLlADIL DXl 2ADE^ 1 gjlSIZE: 4NLIE: GEIHEt VARIABLELEVEL: LET*1ADEz DX名宁 黄聲(六)代码生成程序实例地址给出pio源程序,中间代码和过程说明程序:并以1.PAS保存;const x=1; var a,b; procedure try;begin b:=a+x;end;begina:=9;call try;end.通过PL/O运行程序1.PAS之后如图:Turbo Pascal 7.Dlurbu Hd^util Vcr^iun Uopvnylil tel iytJJ.92 Burldnd IriturnaLiuiidlrlease innut source 口广oq广日m file n^me:F:\T。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.