编译原理实验报告分析.pdf

上传人:白大夫 文档编号:5421878 上传时间:2020-05-05 格式:PDF 页数:9 大小:337.71KB
返回 下载 相关 举报
编译原理实验报告分析.pdf_第1页
第1页 / 共9页
编译原理实验报告分析.pdf_第2页
第2页 / 共9页
编译原理实验报告分析.pdf_第3页
第3页 / 共9页
编译原理实验报告分析.pdf_第4页
第4页 / 共9页
编译原理实验报告分析.pdf_第5页
第5页 / 共9页
点击查看更多>>
资源描述

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

1、学年第学期 编译原理实验报告 学院(系):计算机科学与工程学院 班级:11303070A 学号:11303070* 姓名:无名氏 指导教师:保密式 时间:2016 年7 月 目录 1实验目的 1 2实验内容及要求 1 3实验方案设计 1 3.1 编译系统原理介绍 . 1 3.1.1 编译程序介绍 2 3.1.2 对所写编译程序的源语言的描述 2 3.2 词法分析程序的设计 . . 3 3.3 语法分析程序设计 . . 4 3.4 语义分析和中间代码生成程序的设计 4 4. 结果及测试分析 4 4.1 软件运行环境及限制 4 4.2 测试数据说明 5 4.3 运行结果及功能说明 5 5总结及心得

2、体会 7 1 1实验目的 根据 Sample语言或者自定义的某种语言,设计该语言的编译前端。包括词 法分析,语法分析、语义分析及中间代码生成部分。 2实验内容及要求 (1)词法分析器 输入源程序,输出对应的token 表,符号表和词法错误信息。按规则拼单词, 并转换成二元形式;滤掉空白符,跳过注释、换行符及一些无用的符号;进行行 列计数,用于指出出错的行列号,并复制出错部分;列表打印源程序;发现并定 位词法错误; (2)语法分析器 输入 token串,通过语法分析,寻找其中的语法错误。要求能实现Sample 语言或自定义语言中几种最常见的、基本的语法单位的分析: 算术表达式、 布尔 表达式、赋

3、值语句、 if 语句、 for 语句、 while 语句、 do while 语句等。 (3)语义分析和中间代码生成 输入 token串,进行语义分析,修改符号表,寻找其中的语义错误,并生 成中间代码。要求能实现Sample语言或自定义语言中几种最常见的、基本的语 法单位的分析:算术表达式、布尔表达式、赋值语句、if 语句、 for 语句、 while 语句、 do while 语句等。 实验要求:功能相对完善,有输入、输出描述,有测试数据,并介绍不足。 3实验方案设计 3.1 编译系统原理介绍 编译器逐行扫描高级语言程序源程序,编译的过程如下: (1). 词法分析 识别关键字、字面量、标识符

4、(变量名、数据名 )、运算符、注释行 (给人看 的,一般不处理 )、特殊符号 (续行、语句结束、数组 )等六类符号,分别归类等待 处理。 (2). 语法分析 一个语句看作一串记号(Token)流,由语法分析器进行处理。按照语言的文 法检查判定是否是合乎语法的句子。如果是合法句子就以内部格式保存,否则报 错。直至检查完整个程序。 (3). 语义分析 语义分析器对各句子的语法做检查:运算符两边类型是否相兼容; 该做哪些 类型转换(例如,实数向整数赋值要 “取整“);控制转移是否到不该去的地方;是 2 否有重名或者使语义含糊的记号,等等。如果有错误,则转出错处理,否则可以 生成执行代码。 (4).

5、中间代码生成 中间代码是向目标码过渡的一种编码,其形式尽可能和机器的汇编语言相 似,以便下一步的代码生成。 但中间码不涉及具体机器的操作码和地址码。采用 中间码的好处是可以在中间码上做优化。 (5). 优化 对中间码程序做局部优化和全局(整个程序 )优化,目的是使运行更快,占 用空间最小。局部优化是合并冗余操作,简化计算,例如x:=0 可用一条 “清零“ 指令替换。全局优化包括改进循环、减少调用次数和快速地址算法等。 (6). 代码生成 由代码生成器生成目标机器的目标码(或汇编 )程序,其中包括数据分段、 选定寄存器等工作,然后生成机器可执行的代码。 3.1.1 编译程序介绍 编译程序是指把用

6、高级程序设计语言书写的源程序,翻译成等价的机器语 言格式目标程序的翻译程序。编译程序属于采用生成性实现途径实现的翻译程 序。它以高级程序设计语言书写的源程序作为输入,而以汇编语言或机器语言 表示的目标程序作为输出。编译出的目标程序通常还要经历运行阶段,以便在 运行程序的支持下运行,加工初始数据,算出所需的计算结果。 3.1.2 对所写编译程序的源语言的描述 Sample语言是一种类 PASCAL 语言,他以赋值语句为基础,包括顺序、条 件和循环三种结构。有变量说明和常量说明,有多种数据类型、如整型、实型、 字符型等。它包括如下一些语法成分: (1). 数据类型:整型、布尔型、实型和字符类型。

7、(2). 表达式:可进行算术、布尔表达式的运算。 (3). 说明语句:常量说明(用const定义) 、变量说明(用 var 定义) 。 (4). 赋值语句。 (5). 控制语句: if 语句、while 语句, repeat语句和 for 循环语句。 (6). Begin end复合语句。 (7). 程序( program)语句和结束( end.)语句。 3 3.2 词法分析程序的设计 初始化 打开源文件 源程序结束 结束 一行一行地处 理 用stri存储 读到的每个单 词 根据第一个字符 进行分类 字母 识别标识符 / 关键字 处理注释和除 号 识别运算符 isoperator(stri)

8、识别数值常数 isdigit(stri) 识别界符 isbound(stri) 是关键字? 在符号表 中? N N 插入到符号表 中 在界符表中? N 出错处理 error 注释号 Y Y Y 图 1 词法分析总流程 词法分析将源程序读入一个个的字符,根据一定的构词规则,识别出各类 有用的单词。 当输入字母时, 开始识别标识符或关键宇, 边拼写边从缓冲区读入 下一符号,当读入一非字母数字符号时, 标识符识别完成, 但已多读入一个符号, 所以列记数回退。 然后查关键字表, 判断拼出的符号串是否为关键字。若是关键 字,输出其种别码。否则识别的单词就是标识符,同时输出标识符及其种别码。 当输入数字时

9、,开始识别整数或实数。边拼写边读入下一符号,当遇到“. ”时, 还要继续拼写该常数 ( 实数情况 ) 。如果遇到 E,要识别带指数的常数,当遇到其 它非数字符号时,数字常数拼写完毕,列计数也要退1。输出常数及其种别码。 当输入“ / ”时,开始识别注解或除号,若是注解时,最后两个连续读出的符号 是“*/ ” ,不需再读下一符号,列计数不变。当判定是除号“/ ”时,已多读入一 字符,列计数 1,输出“ / ”的种别码。 4 3.3 语法分析程序设计 Token 文件 处理程序头 部 处理常量说 明 处理变量说 明 根据读取的 前导字对语 句进行分类 处理赋值语 句 处理 for 语句 处理 if

10、语句 处理 while 语 句 处理程序结 束部分 输出文件 end 其他 Program 标识符 For if while var const begin begin var begin 图 2 语法分析总流程 不断地读入 token文件中的单词, 根据不同的语句, 使用不同的方法进行分 析,直到 token 文件的结束。程序头部以program 开头,变量说明以var 开头, 常量说明是以 const 开头的,从 begin 开始就是可执行语句,可执行语句分为五 种: for 语句(以 for 语句开头 ), while 语句(以 while 开头), if 语句(以 if 开头), re

11、peat 语句(以 repeat开头),赋值语句 (以标识符开头 ) 。每当读到前导词,表明一个新 的语法结构的开始,以此识别该语法单位是否符合定义。 3.4 语义分析和中间代码生成程序的设计 4. 结果及测试分析 4.1 软件运行环境及限制 程序是使用 C#语言编写的,开发软件是VS2013。VS 是一个基本完整的开 发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML 工具、 代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所 有平台。使用 VS 调试程序会很方便,可以实时观察程序的运行状态。用VS 制 作界面会显得非常地简单,但是也存在一定的缺点。VS

12、 的集成度比较高,所以 要修改封装好的一些函数不会太简单。 5 4.2 测试数据说明 输入数据: program example1; const a:=1;b:=3;c:=fasdf; var a,b,c:integer; x:char; begin a:=3; b:=12; if(a+3*cb) then c:=3; while ab do c:=5; repeat a:=10; until a+3b; for x:=1+2 to 3 do b:=100; end. 这是 sample语言的一个比较简单的测试程序,它有着sample语言最基本的 格式,如函数头部、 常量说明、变量说明、 执行

13、语句、 条件语句,循环语句等等。 用这个测试程序来观察程序的效果。 4.3 运行结果及功能说明 图 3 词法分析结果 图 3 是正常词法分析的结果,可以看出,程序会将每个单词显示到token 文 件显示区,同时显示单词在源文件的位置。 并且会将标识符和常量添加到符号表 6 并显示到符号表显示区。下面的图4 是当测试程序有错误时的情况。 图 4 词法分析有错误的程序 可以看到当我在b:=12;后面加上一个“”后,会出现报错。并且if 语 句位置上少了个“)”也会出现报错,实现了词法分析的相关功能。 图 5 语法分析结果 7 从图 5 看到,语法分析能够正确地处理token 串,并分析出各类语句,

14、 直到 程序的结束。 输出结果的显示层次感不强,没有按照一级级地缩进, 这里是语法 分析的一点问题。下面的图6 是语法分析处理错误的功能演示。 图 6 语法分析错误处理 我修改了程序的部分地方, 通过语法分析就能够检测到错误的地方,并显示 出错误可能的原因, 并且能够在错误的前提下继续执行后面的程序,直到语法分 析结束。 5总结及心得体会 通过编译原理实验课,我掌握了什么是编译程序,编译程序工作的基本过 程及其各阶段的基本任务, 熟悉了编译程序总流程框图, 了解了编译程序的生成 过程、构造工具及其相关的技术对课本上的知识有了更深的理解,课本上的知识 是机械的,表面的。通过把该算法的内容,算法的

15、执行顺序在计算机上实现,把 原来以为很深奥的书本知识变的更为简单,对实验原理有更深的理解。 然而,我认为自己在实验课上做的并不够好。首先,在总体实验内容来说, 我没能够完成所有的内容, 只完成了词法分析和语法分析的程序;其次,就完成 的两个实验来说,功能上还是不够完善,有一些bug。最后,运行界面上过于简 陋,不够美观。由于时间的有限性,这些不足是无法继续改善了。这也让我意识 到对于做每一件事, 你的付出时间和你的成果是成正比的。所以,对于做一件事, 要舍得花时间,肯花时间,这样最后的效果才会更好。对于编译原理,整体看下 来自己做得不算好。 意识到不足, 我更加地明白自己能力不够强。在今后的学习 里,需要更加地努力才行,能力越强,自己的提升空间就会越大,完成一件事的 效率也才会更高。争取在以后做一个高效率,强能力的人。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1