失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > miniC语言编译器设计与实现(编译原理实验课程)

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

时间:2023-09-07 22:57:22

相关推荐

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

目 录

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 编辑器。

关键技术: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语言编译器设计与实现(编译原理实验课程)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。