东北大学编译原理课程设计报告

上传人:第*** 文档编号:55644350 上传时间:2018-10-03 格式:DOC 页数:60 大小:500.51KB
返回 下载 相关 举报
东北大学编译原理课程设计报告_第1页
第1页 / 共60页
东北大学编译原理课程设计报告_第2页
第2页 / 共60页
东北大学编译原理课程设计报告_第3页
第3页 / 共60页
东北大学编译原理课程设计报告_第4页
第4页 / 共60页
东北大学编译原理课程设计报告_第5页
第5页 / 共60页
点击查看更多>>
资源描述

《东北大学编译原理课程设计报告》由会员分享,可在线阅读,更多相关《东北大学编译原理课程设计报告(60页珍藏版)》请在金锄头文库上搜索。

1、1 课课 程程 设设 计计 报报 告告 设计题目:简单文法的编译器的设计与实 现 班 级:XX 组长学号:XXX 组长姓名:XX 指导教师:XX 设计时间:2017 年 1 月 2 设计分工 组长学号及姓名: 20143710 李万 分工:语法分析,生成符号表,语义分析,中间代码 生成(四元式),汇编代码生成 组员 1 学号及姓名:20143724 张太 分工:部分语法分析 组员 2 学号及姓名:20143725 张天宝 分工:部分语义分析 组员 3 学号及姓名:20143722 张俊杰 3 摘摘 要要 编译原理是计算机科学与技术专业一门重要的专业课, 它具有很强 的理论性与实践性,目的是系统

2、地向学生介绍编译系统的结构、工作原 理以及编译程序各组成部分的设计原理和实现技术,在计算机本科教学 中占有十分重要的地位。计算机语言之所以能由单一的机器语言发展到 现今的数千种高级语言,就是因为有了编译技术。编译技术是计算机科 学中发展得最迅速、最成熟的一个分支,它集中体现了计算机发展的成 果与精华。 本课设是词法分析、语法分析、语义分析的综合,外加上扩展任务 中间代码的优化和目标代码的生成,主要是锻炼学生的逻辑思维能力, 进一步理解编译原理的方法和步骤。 关键词关键词:编译原理,前端,目标代码,后端 4 目目 录录 摘要摘要.3.3 1.1. 概述概述66 2.2. 课程设计任务及要求课程设

3、计任务及要求77 2.1 设计任务7 2.2 设计要求8 3.3. 算法及数据结构算法及数据结构.9.9 3.1 算法的总体思想10 3.2 词法分析器模块11 3.2.1 功能11 3.2.2 数据结构11 3.2.3 算法12 3.3 语法分析器模块14 3.3.1 功能14 3.3.2 数据结构14 3.3.3 算法15 3.4 语义分析中间代码生成18 3.4.1 功能18 3.4.2 数据结构18 3.4.3 算法20 3.5 目标代码生成器模块23 3.5.1 功能.23 3.5.2 数据结构.23 3.5.3 算法.25 4.4. 程序设计与实现程序设计与实现.26.26 4.1

4、 程序流程图.26 4.2 程序说明.27 4.3 实验结果.32 5 5.5. 结论结论.59.59 6.6. 参考文献参考文献.60.60 7.7. 收获、体会和建议收获、体会和建议. . .61.61 6 1 1 概述概述 编译程序(compiler)是把某一种高级语言程序等价地转换成另 一种低级语言程序(如汇编语言或机器语言程序)的程序。几乎所有形式 的计算都要用到编译器。程序运行的过程图如下图所示: 高级语言 程序 机器语言程序 编译程序 翻译运行 结果 程序运行过程 编译程序的工作一般分为以下几个阶段:词法分析、语法分析、语 义分析、中间代码产生、代码优化、目标代码产生。 语法分析

5、器 语义分析与中间代码生成器 优化段目标代码生成器 词法分析器 语法单位 四元式四元式 目标代码 单词符号 7 2 2 课程设计任务及要求课程设计任务及要求 2.12.1 设计任务设计任务 任务内容:1.定义一个简单程序设计语言文法(包括变量说明语句、 算术运算表达式、赋值语句;If 语句、While 语句等)支持函数调用, 函数递归,支持传参和传值 2.扫描器设计实现;3.语法分析器设计实现; 4.中间代码设计;5.中间代码生成器设计实现;6.生成目标代码。 文法:给出的文法具有左递归,消除左递归后得到的文法如下所示: 1. p ro g r a m d e c l a r a t i o

6、n - l i s t 2. d e c l a r a t i o n - l i s t d e c l a r a t i o n d e c l a r a t i o n 3. d e c l a r a t i o n v a r- d e c l a r a t i o n | f u n - d e c l a r a t i o n 4. v a r- d e c l a r a t i o n t y p e - s p e c i f i e r I DNUM 5. t y p e - s p e c i f i e r i n t | v o i d 6. f u n

7、- d e c l a r a t i o n t y p e - s p e c i f i e r I D( p a r a m s ) | c o m p o u n d - s t m t 7. p a r a m s p a r a m s-l i s t | v o i d 8. p a r a m - l i s t p a r a m, p a r a m 9. p a r a m t y p e - s p e c i f i e r I D 10. compound - s t m t l o c a l-d e c l a r a t i o ns s t a t e m

8、 e n t-l i s t 11. l o c a l-d e c l a r a t i o ns empty v a r- d e c l a r a t i o n 12. s t a t e m e n t-l i s t emptys t a t e m e n t 13. s t a t e m e n t e x p re s s i o n-s t m t | c o m p o u n d - s t m t | s e l e c t i o n - s t m t| i t e r a t i o n-s t m t | re t u r n-s t m t 14. e

9、 x p re s s i o n-s t m t e x p re s s i o n ; 15. s e l e c t i o n - s t m t i f ( e x p re s s i o n ) s t a t e m e n t e l s e s t a t e m e n t 16. i t e r a t i o n -s t m t w h i l e ( e x p re s s i o n ) s t a t e m e n t 17. re t u r n -s t m t r e t u r n e x p re s s i o n; 18. e x p re

10、 s s i o n v a r = e x p re s s i o n | s i m p l e-e x p re s s i o n 8 19. v a r I D e x p re s s i o n 20. s i m p l e-e x p re s s i o n a d d i t i v e-e x p re s s i o n re l o p a d d i t i v e-e x p re s s i o n 21. re l o p | = | = = | ! = 22. add i t i v e-e x p re s s i o n termaddop te r

11、 m 23. add p + | - 24. t erm f a c t o r m u l o p f a c t o r 25. mulop * | / 26. f a c t o r ( e x p re s s i o n ) | v a r | c a l l | N U M 27. c a l l I D ( a rg s ) 28. a rg s a rg - l i s t | e m p t y 29. a rg-l i s t e x p re s s i o n , e x p re s s i o n 2.22.2 设计要求设计要求 通过设计 C-语言的编译器,了解编译

12、器在程序设计中的功能,以 及编译过程中的翻译步骤,对编译原理的各个部分有一个深入的了解和学习。 9 3 3 算法及数据结构算法及数据结构 3.13.1 算法的总体思想算法的总体思想 如下流程图: 源程序 单词符号 语法单位 中间代码 中间代码 目标代码 词法分析器 语法分析器 语义分析及中间代码产生器 目标代码生成器 符 号 表 出 错 处 理 10 3.23.2 词法分析器模块词法分析器模块 3.2.1 功能 根据给出的 C-语言词法、语法和语义,设计一个编译器。 1. 下面是语言的关键字: else if int return void while ,write,read. 所有的关键字都

13、是保留字,并且必须是小写。 2. 下面是专用符号: + - * / = = != = ; , ( ) /* */ 3. 其他标记是I D和N U M,通过下列正则表达式定义: ID = letter letter* NUM = digit digit* letter = a|z|A|Z digit = 0|9 小写和大写字母是有区别的。 4. 空格由空白、换行符和制表符组成。空格通常被忽略,除了它 必须分开I D、N U M关键字。 5. 注释用通常的C语言符号/ * . . . * /围起来。注释可以放在 任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。注 释不能嵌套。 3.2

14、.2 数据结构 定义了一个枚举类型TokenType,枚举了一些关键字和其他一些词 法中的符号。 typedef enum TokenType IF,ELSE,ID,NUM,PLUS,MINUS,. 11 TokenType; 记号有若干种,其中包括保留字,如 IF 和 THEN;特殊符号,如算 术符号加(PLUS)和减(MINUS);多字符串的记号,如 NUM 和 ID。作 为逻辑项的记号必须与它们所表示的字符串完全区分开来。 函数 getToken():它消耗输入字符并根据构造的 DFA 返回下一个被 识别的记号。这个实现利用了双重嵌套情况分析,以及一个有关状态的 大型情况列表。在大列表中的是基于当前输入字符的单独列表。扫描程 序的状态也被定义为一个枚举类型 StateType。 扫描程序还需总地计算出每个符号的特性,并且有时会采取其他动 作。在此扫描程序中,所需计算的唯一特性是词法或是被识别的记号的 串值,它位于变量 tokenString 之中,并一同提供给编译器其他部分。 reservedLookup():实现识别的标识符之后保留字的查找。标志变 量 save 用来指示是否将一个字符增加到 tokenString 之上。 getNextChar(): 读取程序

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

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

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