编译原理优化器实验心得(精选2篇)
编译原理优化器实验心得 篇1
编译原理实验报告
报告完成日期 2018.5.30
一. 组内分工与贡献介绍
二. 系统功能概述;
我们使用了自动生成系统来完成我们的实验内容。我们设计的系统在完成了实验基本要求的前提下,进行了一部分的扩展。增加了声明变量类型、类型赋值判定和声明的变量被引用时作用域的判断。从而使得我们的实验结果呈现的更加清晰和易懂。
三. 分系统报告;
一、词法分析子系统
词法的正规式:
标识符
<字母>(<字母>|<数字字符>)* 十进制整数
0 |(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)* 八进制整数 0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* 十六进制整数 0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* 运算符和分隔符 +| * | / | > | < | = |(|)| <=|>=|==; 对于标识符和关键字: A5—〉 B5C5 B5—〉a | b |⋯⋯| y | z C5—〉(a | b |⋯⋯| y | z |0|1|2|3|4|5|6|7|8|9)C5|ε 综上正规文法为: S—〉I1|I2|I3|A4|A5 I1—〉0|A1 A1—〉B1C1|ε C1—〉E1D1|ε D1—〉E1C1|ε
E1—〉0|1|2|3|4|5|6|7|8|9 B1—〉1|2|3|4|5|6|7|8|9 I2—〉0A2 A2—〉0|B2 B2—〉C2D2 D2—〉F2E2|ε E2—〉F2D2|ε
C2—〉1|2|3|4|5|6|7 F2—〉0|1|2|3|4|5|6|7 I3—〉0xA3 A3—〉B3C3 B3—〉0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f C3—〉(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)|C3|ε
A4—〉+ |-| * | / | > | < | = |(|)| <=|>=|==; A5—〉 B5C5 B5—〉a | b |⋯⋯| y | z C5—〉(a | b |⋯⋯| y | z |0|1|2|3|4|5|6|7|8|9)C5|ε
状态图
流程图:
词法分析程序的主要数据结构与算法
考虑到报告的整洁性和整体观感,此处我们仅展示主要的程序代码和算法,具体的全部代码将在整体的压缩包中一并呈现
另外我们考虑到后续实验中,如果在bison语法树生成的时候推不出目标的产生式时,我们设计了报错提示,在这个词的位置出现错误提示,将记录切割出来的词在code.txt中保存,并记录他们的位置。
以下是我们的主要代码:
进制的识别:
结果展示:
二、语法分析子系统
根据选择的语法分析方法进行描述
我们使用了递归子程序发,并且对原有的产生式进行了改写,改写后的结果如下: P→LP1|L L→S
S→id=E|{P}|if C then S | if C then S
1else S2 | while C do S1 C→E1C’
C’→>E2| E→int8E’| int10E’| int16E’| idE’|T E’→+T|-T||+TE’|-TE’ T→int8T’| int10T’| int16T’| idT’|F T’→*F|/F|*FT’|/FT’ F→(E)|int8|int10|int16|id 简化的语法图: S的语法图: C的语法图: E的语法图: T的语法图: F的语法图: 流程图: 语法分析子系统的主要数据结构与算法 我们采用了自动生成技术,同样在这里也是展示主要的核心功能代码,全部的代码展示在压缩包中: 我们在设计时,实现了产生式对应的字符串同时标识产生式定义的int值 辅助程序: 生成语法树的程序: 1.树节点: 2.创建新节点 3.创建实数类型新节点 4.创建标识符类型新节点 5.输出语法树 三、三地址码生成器 算法的基本思想: 我们增加了声明变量类型、类型赋值判定和声明的变量被引用时作用域的判断。从而使得我们的实验结果呈现的更加清晰和易懂。 在报错的时候,我们会呈现类型、作用域和赋值三种的问题的报错信息。 流程图: 算法展示: 四、实验体会 这次实验其实总的来说是让我们更加清晰的理解到了我们所学的内容。有时候我们上课听讲,课下复习写作业的时候,其实看似掌握了所学内容,但实际上并没有亲身体会的操作很难让我们深刻的理解其中的相关意义。通过这次实验,我们能够从根源处了解到了我们所学的内容,并且基于我们理解之后的输出。比如词法分析不能采用空格来区分单词,因为存在加减乘除等运算符和分隔符,使用空格来区分可能会造成错误的分解。又比如我们再在程序设计中,常常体会到效率的重要性。影响词法分析的效率的主要因素是各个状态的分支如何规划。如果每个进来的单词都能在最短的时间和最少的匹配次数内找到其入口,则效率将得到很大程度上的提高。所以由此我们产生了声明变量类型、赋值和作用域的想法,将其放在最后来进行判断,这样可以提高整体的执行效率。 另外,这次小组成员彼此不在一个班级,这样从某一方面来说,也加强了我们互相快速熟识并团结协作的能力,有了这种体验,我想我们在今后的生活中,面对这种情况的时候,将会变得更加有经验。 五、源程序 词法分析器: 输入结果: 输出结果: 语义分析结果: 输入: 第二组数据的输入: 输出: 三地址码的输入: 第二组数据的输入: 输出: 因为考试的原因,所有想尽快把这个课程设计做完,所以就直接改了老师的程序,以为这样会快一些,事实证明,确实如此,但是做起来很不顺手,程序员更讨厌的是看别人的程序。不知道变量的含义,函数的作用。还有就是对vc 不是很熟,不仅开发环境不熟,就连c(其实应该说是c)的一些常用函数都忘得一干净,就好比字符转化为整型(atoi)和整型转化为字符型(itoa)这两个函数,根本不认识,还是在google上搜索到的资料。 c 确实有很多不完美的地方,我最烦的就是指针,指来指去的很让人头疼。还有就有字符串的转换等一些操作,没有java来得方便。如果自己独立编写代码的话,我会首先考虑用java,其次考虑用c#,最后才用c。 至于用什么asp,jsp来做,我也可以做,这些动态网页语 言都接触过,只可惜自己技不如人,不能在两天的时间内,把程序编出来,只能用最快的方法,用现成的改。因考虑到编译是一门考研科目,所以自己打算在考试结束以后再完完整整地做一个。 总的来说,课程设计加深了自己对编译这门课的理解,发现自己还有很多的地方要复习,甚至还有知识点的理解偏差。一定在考试把所有的漏动填平。 【编译原理优化器实验心得】推荐阅读: 编译原理实验报告总结05-09 编译原理实验报告分析05-29 编译原理课程01-12 编译原理课程教学05-26 编译原理实用论文08-22 编译原理重点总结10-09 《编译原理》课程设计要求05-26 编译原理作业标准答案09-21 编译原理教学方法论文09-01 编译原理教学方法研究12-13编译原理课程设计学习心得体会 篇2