当前位置:文档之家› 编译原理课程设计报告(一个完整的编译器)

编译原理课程设计报告(一个完整的编译器)

编译原理程序设计报告一个简单文法的编译器的设计与实现专业班级:计算机1406班组长姓名:宋世波组长学号: ******** 指导教师:肖桐2016年12月设计分工组长学号及姓名:宋世波20143753 分工:文法及数据结构设计词法分析语法分析(LL1)基于DAG的中间代码优化部分目标代码生成组员1学号及姓名:黄润华20143740 分工:中间代码生成(LR0)部分目标代码生成组员2学号及姓名:孙何奇20143754 分工:符号表组织部分目标代码生成摘要编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。

编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。

一.编译器的概述1.编译器的概念编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。

编译器将原始程序作为输入,翻译产生使用目标语言的等价程序。

源代码一般为高阶语言如Pascal、C++、Java 等,而目标语言则是汇编语言或目标机器的目标代码,有时也称作机器代码。

2.编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。

另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。

交叉编译器在生成新的硬件平台时非常有用。

“源码到源码编译器”是指用一种高阶语言作为输入,输出也是高阶语言的编译器。

例如: 自动并行化编译器经常采用一种高阶语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语言构造进行注释(如FORTRAN的DOALL指令)。

3.本编译器概述编译程序的工作过程一般可以分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。

每一个阶段在功能上是相对独立的,它一方面从上一个阶段获取分析的结果来进行分析,另一方面由将结果传递给下一个阶段。

由编译程序的五个阶段就对应了编译系统的结构,这五个对应阶段分为编译器的前段,中间代码以及后端。

其中词法分析器利用超前搜索、状态转换等方法,将源程序转化成为一个一个的单词符号二元式。

一般程序语言的单词符号包括关键字、运算符、常数、标识符和界符。

语法分析器将这些单词符号作为输入,对它进行语法分析。

语法分析采用LL1分析法,语法分析器把语法单元作为输入供语义分析器使用。

在语法分析的同时进行语法分析,并产生一定的语义动作,来生成中间代码。

优化和目标代码生成是针对某一种处理器而言的。

代码优化是将语义分析生成的中间代码进行优化,产生执行效率更高的代码。

目标代码生成最终生成可以在某种机器上运行的机器语言或者汇编语言。

还要有符号表可供查询。

在整个编译过程中还包括对表格的操作和对错误的处理,这些也都是非常重要的环节。

环境:编译器整体全部使用visual studio2015编写目标代码在8086指令集机器上运行关键词:编译原理,前端,中间代码生成,后端,目录设计分工 (2)摘要 (3)1. 概述 (7)2. 课程设计任务及要求 (9)2.1 设计任务 (9)2.2 设计要求 (10)2.3设计的文法结构 (11)3. 算法及数据结构 (17)3.1 算法的总体思想(流程) (17)3.2 词法分析器模块 (18)3.2.1 功能 (18)3.2.2 数据结构 (19)3.2.3 流程图 (20)3.2.4 算法 (20)3.2.5 运行截图 (22)3.3 语法分析器模块 (23)3.3.1 功能 (23)3.3.2 数据结构 (24)3.3.3 流程图 (25)3.3.4 算法 (26)3.3.5 运行截图 (33)3.4符号表生成模块 (34)3.4.1 功能 (34)3.4.2 数据结构 (35)3.4.3 流程图 (37)3.4.4 算法 (38)3.4.5 运行截图 (39)3.5中间代码生成模块 (39)3.5.1 功能 (40)3.5.2 数据结构 (40)3.5.3 流程图 (43)3.5.4 算法 (43)3.5.5 运行截图 (44)3.6中间代码优化模块 (44)3.6.1 功能 (44)3.6.2 数据结构 (45)3.6.3 流程图 (46)3.6.4 算法 (47)3.6.5运行截图 (49)3.7目标代码生成模块 (50)3.7.1 功能 (50)3.7.2 数据结构 (51)3.7.3 流程图 (51)3.7.4 算法 (52)3.7.5 运行截图 (54)这里不得不提到目标代码生成中存在的一些问题, (55)4. 程序设计与实现 (58)4.1 程序说明 (58)4.2 实验结果 (61)5. 结论 (63)5.1组长:宋世波 (63)5.2组员:孙何奇 (64)5.3组员:黄润华 (64)6. 收获、体会和建议。

(66)6.1组长:宋世波 (66)6.2组员:孙何奇 (66)6.3组员:黄润华 (67)7.附录 (69)源代码: (69)7.1可执行文件链接 (69)8、参考文献 (70)1. 概述本程序实现的数据类型有整型(int)、浮点型(float)、char(字符型)、字符串型(string),同时在最后的目标代码生成部分允许出现布尔(bool)类型,实现的操作有if,else以及while循环,和输入输出语句,能做到直接生成目标代码并运行。

做到了类型检查和重定义的判断,同时也有优化部分。

词法分析部分构建得到的词法序列为二元式,二元式由两部分组成,其种别码和类型组成,其中关键字和界符记录其数字,用到时只需查其对应的关键字表和界符表即可,而字符类型、字符串类型、数字类型、以及标识符类型的值一律用字符串存储,其中数字类型存储时对其使用atoi 和itoa函数进行数字转字符串即可,要使用到其数字时只需要将对其使用字符串转数字函数再获得即可。

语法分析部分采用的是LL1分析方法,这是一种自上而下的语法分析法,又称为预测分析法,语法分析器部分实现了自动求first集合和follow集合,采用的是递归程序获得select集合,在实现对产生式完全扫描以后,便可以获得一张完整的分析表,表中标注了是否为预测以及对应的产生式序列,而后进行语法分析,通过于获得的分析表进行比对,进行入栈出栈,匹配到相同的则认为匹配成果,当文法匹配成功,同时单词也匹配成功的时候,认为语法分析完成,语法无错误,否则报错。

在符号表生成部分,程序对获取的单词序列中的标识符进行再分析,确定每一个标识符的存储范围,同时从此之中获取函数的参数表,函数表部分,构建出编译器全局可用的活动记录表,以供目标代码生成使用,同时也为编译器增添新内容做准备。

中间代码生成部分,在此之前需注意到,由于再语法分析部分已经生成了一个具体可理解的动作序列,所以中间代码生成部分的所用方法并非语法制导,其本身也与语法分析相割裂开来,中间代码生成采取的是自底向上进行分析,不过是基于单词序列进行的分析,其操作等于是使用已获得的伪动作序列,与源程序去作比较,找出伪动作序列的实际含义,将其顺序填好,最后便完成了整个中间代码(四元式)的生成,并将其重新输出到文件中。

中间代码优化部分是对填装完毕的中间代码的再处理,也就是减少无用式子,给目标代码的生成提供便利,先进行基本块划分,而后采取的是DAG图优化,即无环有向图优化,顺序是构建DAG图(无环有向图),减少无用分支,或删改部分同义分支,完成DAG图改造后便又重新由树组装四元式,组装好的四元式又再次重新输出到文件中。

目标代码生成部分较长,也并不仅仅包含目标代码生成部分,在这个部分文件中,同时需要对前述获得的符号表,中间代码进行再处理,以得到符号目标代码生成所用的符号表和中间代码,再进行预处理完成之后,具体为根据四元式动作,按顺序依次生成目标代码,需要依据不同的四元式动作每个采取不同的操作方法,生成相应目标代码。

测试部分采用的emu8086软件,这个软件支持的指令集为8086指令集,由于64位机器上对汇编的支持并不算好,所以在8086机上最后进行的是对目标代码的正确性检验以及运行,运行通过且符合源程序实际操作即认为编译器任务完成。

2. 课程设计任务及要求2.1 设计任务1.一个简单文法的编译器前端的设计与实现①定义一个简单程序设计语言文法(包括变量说明语句、算术运算表达式、赋值语句;扩展包括逻辑运算表达式、If语句、While语句等);②扫描器设计实现;③语法分析器设计实现;④中间代码设计;⑤中间代码生成器设计实现。

2.难度相当的自选题目, 如:①一个简单文法的编译器后端的设计与实现。

②一个简单文法的编译器的设计与实现。

③自选一个感兴趣的与编译原理有关的问题加以实现以下为本组选择部分:一个简单文法的编译器的设计与实现。

1.定义一个简单程序设计语言文法(包括变量说明语句、算术运算表达式、赋值语句;扩展包括逻辑运算表达式、If语句、While语句等);2.扫描器设计实现3.语法分析器设计实现;4.符号表设计5.符号表生成器设计实现6.中间代码设计;7.中间代码生成器设计实现。

8.中间代码优化9.中间代码优化实现10.目标代码设计11.目标代码生成器设计实现2.2 设计要求1、在深入理解编译原理基本原理的基础上,对于选定的题目,以小组为单位,先确定设计方案;2、设计系统的数据结构和程序结构,设计每个模块的处理流程。

要求设计合理;3、编程序实现系统,要求实现可视化的运行界面,界面应清楚地反映出系统的运行结果;4、确定测试方案,选择测试用例,对系统进行测试;5、运行系统并要通过验收,讲解运行结果,说明系统的特色和创新之处,并回答指导教师的提问;6、提交课程设计报告。

以下为本组设计要求:给出一个源程序文件,作为编译器前端的输入,输出相关编译阶段的运行结果。

词法分析阶段:Token序列;关键字表、界符表、符号表系统。

语法分析阶段:LL1型产生式、分析表、语法分析所用栈符号表生成阶段:符号表系统中间代码生成阶段:四元式序列;符号表系统。

中间代码优化阶段:四元式序列、DAG图、优化完成的四元式序列目标代码生成阶段:符号表系统、四元式序列、目标代码(8086指令集) 2.3设计的文法结构产生式中文对照:1. <函数定义> -> <类型> <标识符> ( <参数声明> ) { <函数块> }2. <类型> ->int|float|char|void|$3. <因式> -> ( <表达式> ) | <标识符> | <数字> |<字符>4. <表达式> -> <因子> <项>5. <因子> -> <因式> <因式递归>6. <因式递归> -> * <因式> <因式递归> | / <因式> <因式递归> | $7. <项> -> + <因子> <项> | - <因子> <项> | $8. <参数声明> -> <声明> <声明闭包> | $9. <声明> -> <类型> <标识符> <赋初值> |<标识符><赋初值>10. <赋初值> -> = <右值> | $11. <右值> -> <表达式>12. <声明闭包> -> , <声明> <声明闭包> | $13. <函数块> -> <声明语句闭包> <函数块闭包>14. <声明语句闭包> -> <声明语句> <声明语句闭包> | $15. <声明语句> -> <声明> ;16. <函数块闭包> -> <赋值函数> <函数块闭包> | <while循环> <函数块闭包> | <条件语句> <函数块闭包> | <函数返回> <函数块闭包> |<cout语句><函数块闭包>|<cin语句><函数块闭包>| $17. <赋值函数> -> <标识符> <赋值或函数调用>18. <赋值或函数调用> -> = <右值> ; | ( <参数列表> ) ;19. <参数列表> -> <参数> <参数闭包>20. <参数闭包> -> , <参数> <参数闭包> | $21. <参数> -> <标识符> | <数字> | <字符串>22. <While循环>->while(<逻辑表达式>){<函数块>}23. <逻辑表达式> -> <表达式> <逻辑运算符> <表达式>24. <逻辑运算符> -> < | > | == |>=|<=25. <条件语句> -> if ( <逻辑表达式> ) { <函数块> } <否则语句>26. <否则语句> -> else { <函数块> } | $27. <函数返回> -> return <因式> ;28. <cout语句>->cout<< <标识符>;|cout<< <数字>;|cout<< <字符>;29. <cin语句>->cin>><标识符>;产生式如下:funcdef%type&id&(&parastate&)&{&funcblock&}&#type%int|float|char|void&#factor%(&exp&)|id|number|ch&#exp%divi&item&#divi%factor&faccycle&#faccycle%*&factor&faccycle|/&factor&faccycle|$&#item%+&divi&item|-&divi&item|$&#parastate%state&stateclo|$&#state%type&id&init|id&init&#init%=&rvalue|$&#rvalue%exp&#stateclo%,&stateclo|$&#funcblock%staclo&funcbloclo&#staclo%statement&staclo|$&#statement%state&;&#funcbloclo%opera&funcbloclo|whilecycle&funcbloclo|condistate &funcbloclo|funcend&funcbloclo|coutstate&funcbloclo|cinstate &funcbloclo|$&#opera%id&callstate&#callstate%=&rvalue&;|(&paralist&)&;&#paralist%para&paraclo&#paraclo%,&para&paraclo|$&#para%id|number|string&#whilecycle%while&(&logicexp&)&do&{&funcblock&}&we&# logicexp%exp&logicopera&exp&#logicopera%>|<|==|>=|<=&#condistate%if&(&logicexp&)&{&funcblock&}&nor&ie&#nor%else&{&funcblock&}|$&#funcend%return&factor&;&# coutstate%cout&<&<&id&;&# cinstate%cin&>&>&id&;&# do%$&#we%$&#ie%$&#词法分析序列表:标识符表i常数表 C关键字表K IntFloatCharStringVoidIfElseSwitchCaseForDo 1 2 3 4 5 6 7 8 91011While Continue Break Default Sizeof Return Cout Cin 1213141516171819界符表P >=<====><+-*/{},;() 1 2 3 4 5 6 7 8 910111213141516[ ] 1718字符表Ch 字符串表st3. 算法及数据结构3.1 算法的总体思想(流程)开始词法分析语法分析(LL1)符号表生成中间代码生成(LR0)中间代码优化目标代码生成结束算法总体思想文字解释如下:1.从文件中读取代码,调入词法分析,生成词法序列。

相关主题