编译原理实验报告.

上传人:我** 文档编号:113788335 上传时间:2019-11-09 格式:DOC 页数:93 大小:869.60KB
返回 下载 相关 举报
编译原理实验报告._第1页
第1页 / 共93页
编译原理实验报告._第2页
第2页 / 共93页
编译原理实验报告._第3页
第3页 / 共93页
编译原理实验报告._第4页
第4页 / 共93页
编译原理实验报告._第5页
第5页 / 共93页
点击查看更多>>
资源描述

《编译原理实验报告.》由会员分享,可在线阅读,更多相关《编译原理实验报告.(93页珍藏版)》请在金锄头文库上搜索。

1、编译原理实验报告 PL/0 语言编译器分析 词法分析实验 递归下降语法分析实验 LL(1)分析法语法分析实验 教师: 姓名: 班级: 学号:PL/0 语言编译器分析实验报告一、实验目的 通过阅读与解析一个实际编译器(PL/0语言编译器)的源代码, 加深对编译阶段(包括词法分析、语法分析、语义分析、中间代 码生成等)和编译系统软件结构的理解,并达到提高学生学习兴趣的目的。 二、实验要求 (1)要求掌握基本的程序设计技巧(C语言)和阅读较大规模程序 源代码的能力; (2)理解并掌握编译过程的逻辑阶段及各逻辑阶段的功能; (3)要求能把握整个系统(PL/0语言编译器)的体系结构,各功能 模块的功能,

2、各模块之间的接口; (4)要求能总结出实现编译过程各逻辑阶段功能采用的具体算法与技术。 三、实验步骤 (1) 根据PL/0语言的语法图,理解PL/0语言各级语法单位的结构,掌握PL/0语言合法程序的结构; (2)从总体上分析整个系统的体系结构、各功能模块的功能、各模块之间的调用关系、各模块之间的接口; (3)详细分析各子程序和函数的代码结构、程序流程、采用的主要算法及实现的功能; (4)撰写分析报告,主要内容包括系统结构框图、模块接口、主要算法、各模块程序流程图等。四、报告内容1、 PL/0 语言语法的 BNF 表示-1,对语法描述图的解析 . 变量说明部分 const ,; = var ,;

3、 | ; procedure ; | := begin end ; | odd +|- |() +|- *|/ =|= if then call while do a|b|.|x|y|z 0|1|2|.|8|92、PL/0编译程序的总体设计 其编译过程采用一趟扫描方式以语法、语义分析程序为核心词法分析程序和代码生成程序都作为一个过程,当语法分析需要读单词时就调用词法分析程序,而当语法、语义分析正确,需要生成相应的目标代码时,则调用代码生成程序。表格管理程序实现变量,常量和过程标识符的信息的登录与查找。出错处理程序, 对词法和语法、语义分析遇到的错误给出在源程序中出错的位置和与错误性质有关的编号

4、,并进行错误恢复。3、PL/0编译程序结构 词法分析程序语法语义分析程序代码生成程序表格管理程序出错处理程序PL/0源程序目标程序4、编译程序总体流程图 4、详细分析4.1 主要函数功能4.2 语法调用关系图 程序 pl0分程序block语句statement条件condition表达式项 term因子 factorPl/0词法分析程序Getsym识别的单词: (类别,值) 保留字:如:BEGIN、 END、 IF、 THEN等 运算符: 如:+、-、*、/、:=、#、=、=等 标识符: 用户定义的变量名、常数名、过程名 常数: 如:10、25、100等整数 界符: 如:,、. 、; 、( 、

5、)等 Getsym用到三个单元: SYM:存放单词类别 ID:存放标识符的值 NUM:存放整数的值 词法分析过程GETSYM 所要完成的任务: 滤空格 识别保留字 识别标识符 拼数 识别单字符单词(等) 拼双字符单词(=,等) 输出源程序 读字符子程序(getch) PL/0编译程序语法分析的设计与实现 自顶向下的语法分析 递归子程序法:对于每个非终结符,编写一个子程序,由该子程序负责识别该语法单位是否正确。 递归子程序法递归子程序法:对应每个非终结符语法单元,编一个独立的处理过程(或子程序)。语法分析从读入第一个单词开始,由非终结符(即开始符)出发,沿语法描述图箭头所指出的方向进行分析。当遇

6、到非终结符时,则调用相应的处理过程,从语法描述图看,也就进入了一个语法单元,再沿当前所进入的语法单元所指箭头方向继续进行分析。当遇到描述图中是终结符时,则判断当前读入的单词是否与图中的终结符相匹配,若匹配,再读取下一个单词继续分析。遇到分支点时,将当前的单词与分支点上多个终结符逐个相比较,若都不匹配时可能是进入下一个非终结符语法单位或是出错。 表达式的递归子程序实现 procedure expr; begin if sym in plus, minus then begin getsym; term; end else term; while sym in plus, minus do beg

7、in getsym; term; end end;因子=标识符|无符号整数|(表达式) 因子的递归子程序实现procedure factor;begin if sym ident then begin if sym number then begin if sym = ( then begin getsym; expr; if sym = ) then getsym else error end else error end else getsym end else getsym end;说明部分的分析与处理 对每个过程(含主程序)说明的对象(变量,常量和过程)造符号表, 登录标识符的属性。标

8、识符的属性:种类,所在层次,值和分配的相对位置。登录信息由ENTER过程完成。 常量定义语句的处理语法:: := const , ;: := =: := if sym = constsym then begin getsym; (* 获取下一个token,正常应为用作常量名的标识符 *) repeat (* 反复进行常量声明 *) constdeclaration; (* 声明以当前token为标识符的常量 *) while sym = comma do (* 如果遇到了逗号则反复声明下一常量*) begin getsym; (* 获取下一个token,这里正好应该是标识符 *) constd

9、eclaration (* 声明以当前token为标识符的常量 *) end; if sym = semicolon then (* 如果常量声明结束,应遇到分号 *) getsym (* 获取下一个token,为下一轮循环做好准备 *) else error(5) (*提示5号错误 *) until sym ident (* 如果遇到非标识符,则常量声明结束 *) end; 常量说明处理 procedure constdeclaration; begin if sym = ident then begin getsym; if sym in eql, becomes then (* 如果是等

10、号或赋值号 *) if sym = becomes then (* 如果是赋值号(常量生明中应该是等号) *) error(1); (* 提示1号错误 *) getsym; (* 获取下一个token,等号或赋值号后应接上数字 *) if sym = number then (* 如果的确是数字 *) begin enter(constant); (* 把这个常量登陆到符号表 *) getsym (* 获取下一个token,为后面作准备 *) end else error(2) (* 如果等号后接的不是数字,提示2号错误 *) else error(3)(* 如常量标识符后不是等号或赋值号,提示3号错误 *) end else error(4) end(* constdeclaration *);变量定义语句的处理语法:: := var , ; if sym=varsym then begin getsym; repeat vardeclaration;(*变量说明处理*) while sym=comma do begin getsym; vardeclaration end; if

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号