目 录
1 选题背景 1
1.1 总体任务 1
1.2 目标 1
1.3 主要技术 1
2 实验一 词法分析和语法分析 2
2.1 词法的文法描述 2
2.2 语法的文法描述 3
2.3 词法分析器设计 5
2.4 语法分析器设计 8
2.5 词法及语法分析器运行截图 12
2.6 小结 3
3 实验二 语义分析 5
3.1 语义子程序描述 5
3.2 符号表的设计 7
3.3 语义错误类型定义 9
3.4 语义分析实现技术 10
3.5 语义分析结果 12
3.6小结 16
4 实验三 中间代码生成 18
4.1 中间代码格式定义 18
4.2 中间代码生成规则定义 19
4.3 中间代码生成过程 21
4.4 中间代码生成结果 24
4.5 小结 26
5 实验四 目标代码生成 27
5.1 指令集选择 27
5.2 寄存器分配算法 27
5.3 目标代码生成算法 28
5.4 目标代码生成结果 32
5.5 目标代码运行结果 36
5.6 小结 38
6 总结 39
参考文献 42
1 选题背景
1.1 总体任务
根据密码学编程时的某个函数(例如计算最大公约数函数)需要完成的程序功能,运用编译原理课程中的知识,设计一个类C语言程序设计语言相应的词法及语法,并实现该语言的编译器,将源码翻译为能在模拟器上运行的目标代码。
1.2 目标
通过资料查阅、分析设计、编程实现等步骤,逐步培养学生解决工程问题的能力,提高独立思考、灵活运用理论知识以解决实际问题的能力;
通过构造简化编译器的过程,了解编译器各部分的理论知识,找出理论与实践中的差异;灵活运用第三方工具协助解决工程问题;综合运用数据结构、算法、汇编语言、C语言编程等前序课程的知识和技能。
1.3 主要技术
开发环境:Ubantu 18.04.5虚拟机系统,Visual Studio 2019编辑器。
关键技术:Flex、Bison工具,老师所给的关键代码段,C语言知识,以及Linux
系统下的相关终端操作。
运行环境:Ubantu 18.04.5虚拟机系统
2 实验一 词法分析和语法分析
2.1 词法的文法描述
词法分析器的构造技术线路,首选一个就是设计能准确表示各类单词的正则表达式。用正则表达式表示的词法规则等价转化为相应的有穷自动机FA,确定化、最小化,最后依据该FA,编写对应的词法分析程序。
词法分析分为三个部分:定义部分,规则部分,用户子程序定义部分。
1.定义部分
第一个部分为定义部分,其中可以有一个%{到%}的区间部分,主要包含c语言的一些宏定义,如文件包含、宏名定义,以及一些变量和类型的定义和声明。会直接被复制到词法分析器源程序lex.yy.c中。%{到%}之外的部分是一些正规式宏名的定义,这些宏名在后面的规则部分会用到。
2.规则部分
第二个部分为规则部分,一条规则的组成为:
正规表达式 动作
表示词法分析器一旦识别出正规表达式所对应的单词,就执行动作所对应的操作,返回单词的种类码。在这里可写代码显示(种类编码,单词的自身值),观察词法分析每次识别出来的单词,作为实验检查的依据。
词法分析器识别出一个单词后,将该单词对应的字符串保存在yytext中,其长度为yyleng,
3.用户子程序部分
第三个部分为用户子程序部分,这部分代码会原封不动的被复制到词法分析器源程序lex.yy.c中。
高级语言的词法分析器,需要识别的单词有五类:关键字(保留字)、运算符、界符、常量和标识符。本文转载自http://www.biyezuopin.vip/onews.asp?id=16987依据mini-c语言的定义,在此给出各单词的种类码和相应符号说明:

#include "def.h"
#include <stdio.h>struct node *mknode(int kind,struct node *first,struct node *second, struct node *third,int pos ){struct node *tempnode = (struct node*)malloc(sizeof(struct node));tempnode->kind = kind;tempnode->ptr[0] = first;tempnode->ptr[1] = second;tempnode->ptr[2] = third;tempnode->pos = pos;return tempnode;
}void display(struct node* T,int indent){if(T){switch (T->kind){case EXT_DEF_LIST:  display(T->ptr[0],indent);display(T->ptr[1],indent);break;case EXT_VAR_DEF:printf("%*c%s\n",indent,' ',"外部变量定义:");     display(T->ptr[0],indent+5);printf("%*c%s\n",indent+5,' ',"变量名:");display(T->ptr[1],indent+5);break;case FUNC_DEF:printf("%*c%s\n",indent,' ',"函数定义:");display(T->ptr[0],indent+5);display(T->ptr[1],indent+5);display(T->ptr[2],indent+5);break;case ARRAY_DEF:printf("%*c%s\n",indent,' ',"数组定义:");display(T->ptr[0],indent+5);display(T->ptr[1],indent+5);break;case FUNC_DEC:printf("%*c%s%s\n",indent,' ',"函数名:",T->type_id);printf("%*c%s\n",indent,' ',"函数型参:");display(T->ptr[0],indent+5);break;case ARRAY_DEC:printf("%*c%s%s\n",indent,' ',"数组名:",T->type_id);printf("%*c%s\n",indent,' ',"数组大小:");display(T->ptr[0],indent+5);break;case EXT_DEC_LIST:display(T->ptr[0],indent+5);if(T->ptr[1]->ptr[0]==NULL)display(T->ptr[1],indent+5);elsedisplay(T->ptr[1],indent);break;case PARAM_LIST:display(T->ptr[0],indent);display(T->ptr[1],indent);break;case PARAM_DEC:display(T->ptr[0],indent);display(T->ptr[1],indent);break;case VAR_DEF:display(T->ptr[0],indent+5);display(T->ptr[1],indent+5);break;case DEC_LIST:printf("%*c%s\n",indent,' ',"变量名:");display(T->ptr[0],indent+5);display(T->ptr[1],indent);break;case DEF_LIST:printf("%*c%s\n",indent+5,' ',"LOCAL VAR_NAME:");display(T->ptr[0],indent+5);display(T->ptr[1],indent);break;case COMP_STM:printf("%*c%s\n",indent,' ',"复合语句:");printf("%*c%s\n",indent+5,' ',"复合语句的变量定义:");display(T->ptr[0],indent+5);printf("%*c%s\n",indent+5,' ',"复合语句的语句部分:");display(T->ptr[1],indent+5);break;case STM_LIST:display(T->ptr[0],indent+5);display(T->ptr[1],indent);break;case EXP_STMT:printf("%*c%s\n",indent,' ',"表达式语句:");display(T->ptr[0],indent+5);break;case IF_THEN:printf("%*c%s\n",indent,' ',"条件语句(if-else):");printf("%*c%s\n",indent,' ',"条件:");display(T->ptr[0],indent+5);printf("%*c%s\n",indent,' ',"IF语句:");display(T->ptr[1],indent+5);break;case IF_THEN_ELSE:printf("%*c%s\n",indent,' ',"条件语句(if-else-if):");display(T->ptr[0],indent+5);display(T->ptr[1],indent+5);break;case WHILE:printf("%*c%s\n",indent,' ',"循环语句(while):");printf("%*c%s\n",indent+5,' ',"循环条件:");display(T->ptr[0],indent+5);printf("%*c%s\n",indent+5,' ',"循环体:");display(T->ptr[1],indent+5);break;case FOR:printf("%*c%s\n",indent,' ',"循环语句(for):");printf("%*c%s\n",indent+5,' ',"循环条件:");display(T->ptr[0],indent+5);printf("%*c%s\n",indent+5,' ',"循环体:");display(T->ptr[1],indent+5);break;case FUNC_CALL:printf("%*c%s\n",indent,' ',"函数调用:");printf("%*c%s%s\n",indent+5,' ',"函数名:",T->type_id);printf("%*c%s\n",indent+5,' ',"第一个实际参数表达式:");display(T->ptr[0],indent+5);break;case ARGS:display(T->ptr[0],indent+5);display(T->ptr[1],indent+5);break;case ID:printf("%*cID: %s\n",indent,' ',T->type_id);//控制新的一行输出的空格数,indent代替%*c中*break;case INT:printf("%*cINT: %d\n",indent,' ',T->type_int);  break;case FLOAT:printf("%*cFLOAT: %f\n",indent,' ',T->type_float);  break;case CHAR:printf("%*cCHAR: %c\n",indent,' ',T->type_char);case ARRAY:printf("%*c数组名称: %s\n",indent,' ',T->type_id);  break;case TYPE:if(T->type==INT)printf("%*c%s\n",indent,' ',"类型:int");else if(T->type==FLOAT)printf("%*c%s\n",indent,' ',"类型:float");else if(T->type==CHAR)printf("%*c%s\n",indent,' ',"类型:char");else if(T->type==ARRAY)printf("%*c%s\n",indent,' ',"类型:char型数组");break;case ASSIGNOP:case OR:case AUTOADD_L:case AUTOSUB_L:case AUTOADD_R:case AUTOSUB_R:case AND:case RELOP:case PLUS:case MINUS:case STAR:case DIV:case COMADD:case COMSUB:printf("%*c%s\n",indent,' ',T->type_id);display(T->ptr[0],indent+5);display(T->ptr[1],indent+5);break;case RETURN:printf("%*c%s\n",indent,' ',"返回语句:");display(T->ptr[0],indent+5);break;  }}
}























miniC语言编译器设计与实现(编译原理实验课程)相关推荐

  1. c语言词法分析器实验原理,词法分析器的设计与实现 编译原理实验报告.doc

    词法分析器的设计与实现 编译原理实验报告 中北大学软件学院 实 验 报 告 专 业 软件工程 课程名称 编译原理 学 号 姓 名 辅导教师 张静 成绩 实验日期2015.5.19实验时间14:00~1 ...

  2. c 语言编译器 论文,毕业论文--C语言编译器设计与实现.doc

    太原理工大学毕业设计(论文)用纸 太 原 理 工 大 学 毕业设计(论文)任务书 第1页 毕业设计(论文)题目: C语言编译器设计与实现 毕业设计(论文)要求及原始数据(资料): 1.C语言简介和国内 ...

  3. c语言编译器2017,2016-2017年本科C语言编译器设计与实现毕业论文设计.doc

    北京邮电 大 学 毕业设计(论文)任务书 第1页 毕业设计(论文)题目: C语言编译器设计与实现 毕业设计(论文)要求及原始数据(资料): 1.C语言简介和国内外编译器技术研究现状: 2.深入了解编译 ...

  4. 编译原理实验c语言cfg文法,编译原理

    地址在符号表中引入指针previous,来连接上一个符号的首地址运行时存储空间组织活动记录用于管理函数变量的信息栈式存储过程进入和返回通过变更top和sp指针,实现活动记录的栈式处理静态链实现局部变量 ...

  5. 毕业设计 c语言编译器的设计开发-字节代码格式设计与实现 开题报告,C语言编译器设计与实现...

    C语言编译器设计与实现(任务书,外文翻译,毕业论文20000字,答辩PPT) 摘 要 随着计算机的广泛应用,计算机程序设计语言也从初期的机器语言发展为汇编语言,以及现在的各种高级程序设计语言.而编译技 ...

  6. 编译实验 lr c语言代码,编译原理-实验5-LR(1)分析法

    <编译原理-实验5-LR(1)分析法>由会员分享,可在线阅读,更多相关<编译原理-实验5-LR(1)分析法(6页珍藏版)>请在人人文库网上搜索. 1.编译原理实验报告项目名称 ...

  7. 编译原理上机实习c语言小子集编译程序的实现报告,合肥工业大学编译原理实验报告(完整代码版)...

    <合肥工业大学编译原理实验报告(完整代码版)>由会员分享,可在线阅读,更多相关<合肥工业大学编译原理实验报告(完整代码版)(58页珍藏版)>请在人人文库网上搜索. 1.计算机与 ...

  8. 最严谨的计算机语言p,用于PLC的华P语言编译器设计及实现.pdf

    2009年10月 沈阳理工大学学报 V01.28No.5 OFSHENYANGUGONGUNIVERSITYOct.2 第28卷第5期 TRANSACTIONS 0 09 文章编号:1003-1251 ...

  9. 太原理工 编译原理 c语言,太原理工大学编译原理实验

    <太原理工大学编译原理实验>由会员分享,可在线阅读,更多相关<太原理工大学编译原理实验(19页珍藏版)>请在人人文库网上搜索. 1.本科实验报告课程名称: 编译原理 实验项目: ...

  10. 词法分析程序的设计(编译原理实验一)

    词法分析程序的设计(编译原理实验一) 一.实验内容 ​ 编制一个能够分析三种整数.标识符.主要运算符和主要关键字的词法分析程序. 二.实验要求 编写程序,识别如下单词符号 标识符 <字母> ...

最新文章

  1. Django:模型model和数据库mysql(一)
  2. CIPAddressCtrl类的使用(IP地址与CString的互相转化)
  3. 线段树-Mex-洛谷P4137
  4. atm取款机的简单程序代码_LeNet:一个简单的卷积神经网络PyTorch实现
  5. 《The One!团队》第八次作业:ALPHA冲刺(三)
  6. 如何实现手动指定AOP实现JDK代理模式到CGLIB的更改?
  7. 07《基于深度学习的车标识别方法研究》学习总结
  8. LaTeX中插入文本框并且设置文本框底色(填充色)的方法
  9. The BTest labyrinth
  10. java地铁售票机系统_Java_地铁购票系统
  11. matlab保存pgm图形,pgm格式文件及其在matlab中的读取存储方法(1)
  12. AI-语音处理理论与应用-语音处理简介
  13. [翻译] Oracle Database 12c 新特性Multitenant - Cheney Shue
  14. spoj2142 Arranging Flowers
  15. 皇甫懒懒 Java 学习笔记 第一章
  16. FCFS和SJF算法
  17. 阿里云CDN全站加速,说说动态加速那些事
  18. MySQL客户端连接网络不稳定解决办法
  19. Python ELM模型预测美国10个商店3049个商品销售量 ANN人工神经网络
  20. 从网课安全到多场景挑战,网易云信构建全方位安全合规屏障

热门文章

  1. 云联惠认证身份_在秘乐短视频上实名认证了,输入了手机号,身份证号码,姓名,人脸识别,会被网贷吗?...
  2. GFlags使用文档
  3. Esxi 6.7安装教程
  4. Xshell 发送文本到当前Xshell窗口的全部会话
  5. 计算机没有打字键盘显示不出来,电脑无法打字键盘没有反应怎么办 win10电脑屏幕键盘怎么打开...
  6. 腾讯云数据迁移工具解决方案:阿里云迁移到腾讯云
  7. 锐捷长ping_锐捷交换机命令
  8. 2021暑期实习:网易互娱游戏测试最新面经!
  9. Buck电源设计和电感电容参数介绍
  10. 单页面动画 html5,9款惊艳的HTML5/CSS3动画应用赏析