MiniC编译器设计与实现.docx
《MiniC编译器设计与实现.docx》由会员分享,可在线阅读,更多相关《MiniC编译器设计与实现.docx(23页珍藏版)》请在冰豆网上搜索。
《编译原理课程设计》报告
MiniC编译器设计与实现
分组序号:
13
设计地点:
微301、文理楼110
电子邮件:
分组成绩:
任课教师:
李村合
专业班级姓名
学号
计算机
12-
班
成绩比例(%)
16
20
17
17 15 15
成绩
2014年12 月19日
word文档可自由复制编辑
目录
1课程设计目的 1
2课程设计内容 1
3课程设计原理 1
4系统需求分析 4
4.1MiniC编译器总体流程图 4
4.2功能需求 4
4.3用到的主要关键词 5
4.4汇编成可执行文件 5
4.5MiniC语言的文法 5
5系统设计与实现 8
5.1BY13编译器的主要功能模块 8
5.2词法分析子程序 8
5.3语法语义分析子程序 8
6系统测试与运行结果分析 9
6.1测试程序1 9
6.2 测试程序2 9
6.3 测试程序3 9
6.4 测试结果1 10
6.5 测试结果2 13
6.6 测试结果3 16
7心得体会 19
1课程设计目的
(1)根据所掌握的编译原理课程的基本知识,编写出一个MiniC编译器;
(2)增强阅读和编写程序的能力;
(3)理解词法分析、语法分析和语义分析在编译程序中的作用;
(4)掌握词法分析、语法分析和语义分析程序的实现方法;
(5)实现MiniC编译器的编辑、编译、连接和运行。
2课程设计内容
用MFC编写一个可视化的MiniC编译器,要求界面美观,使用方便,能够实现自定义MiniC语言的编译。
支持的语句和运算:
(1)数据类型:
int,char,void,float
(2)语句:
赋值(=),if,while,for
(3)数学运算:
+,-,*,/
(4)关系运算:
==,>,<,>=,<=,!
=
(5)逻辑运算:
&&,||,!
(6)支持函数的定义、调用
(7)支持复合语句,即{}包含的语句
(8)注释:
C类型的多行注释/**/和C++类型的单行注释//
3课程设计原理
MiniC语言可以看成C语言的子集,它的编译程序是一个编译执行环境。
MiniC的编译程序和目标程序的执行程序都是用C++语言编写的,因此MiniC语言可在配备
C语言的任何机器上实现。
它的编译过程采用从左到右扫描输入符号串,进行最左推导,再向右看一个符号的方式,以语法分析程序为核心,词法分析和汇编代码生成程序都是独立的过程。
当语法分析需要读取输入符号串时就调用词法分析程序;而当语法分析正确后,需要生成相应的目标代码
(老师只要求到汇编代码,在本程序中则更进一步,是目标文件.obj文件和可执行的目标文件.exe
文件)时,则调用汇编代码生成程序和创建EXE文件程序。
用表格管理程序建立变量、常量和过程标识符的说明与引用之间的信息联系。
当源程序编译正确时,编译程序自动调用执行程序,对目标代码进行执行,并按用户程序的要求输入数据和输出运行结果。
(1)运行BY13程序,打开Exp.mc文件。
(2)选择菜单编译(C)->生成汇编代码(G)。
(3)选择菜单编译(C)->创建EXE文件(B),生成可执行的目标文件。
(4)选择菜单编译(C)->运行(R),出现如下图所示的结果。
4系统需求分析
MiniC语言编译过程采用从左到右扫描输入符号串,进行最左推导,再向右看一个符号的方式,对源程序分别进行词法分析、语法分析、语义分析、中间代码生成、目标代码生成和可执行程序生成,此外,用表格管理程序建立变量、常量和过程标识符的说明与引用之间的信息联系.用出错处理程序对词法和语法分析研究遇到的错误给出在源程序中出错的位置和错误性质,它的工作过程如下所示:
输入源代码->词法分析->语法分析->汇编代码生成->exe文件生成->运行
4.1MiniC编译程序总体介绍
该编译器的运行过程是编辑源文件保存后,生成汇编代码时使用汇编代码生成程序CAsmCodeGenerator类,调用该类的成员函数genCodeSeg()来生成代码段和genPreSeg()来生成数据段,最后调用emitCode();当然我们在汇编代码生成时应该使用语义分析子程序CAnalyzer类对词法和文法出现的各种情况进行展开分析。
4.2功能需求
(1)用C++语言实现了类C语言,叫做MiniC语言;
(2)使用LL
(1)文法,从左到右扫描输入符号串,进行最左推导,再向右看一个符号;采用递归子程序法实现语法分析,并用C++语言实现了词法分析器、语法分析器、汇编代码生成器,能直接生成intel80x86汇编代码。
(3)在声明中实现了对静态常量、变量和函数声明的支持;赋值语句的=,基本的数学运算+、-、
*、/;
(4)使用函数实现了对过程的调用;
(5)使用{}实现复合语句;
(6)使用函数read()来同时读入一个或多个数据,使用函数write()来同时输出一个或多个数据,而函数printf()只能用来输出字符串;
(7)在循环分支语句中实现了if语句,if……else……语句,for(…,……,……)…语句,
while……语句;
(8)关系表达式包括==(等于)、!
=(不等于)、<、<=、>、>=。
4.3用到的主要关键词:
关键字等用枚举类型囊括:
enumTokenType
{
// 关键字
_DOUBLE,_INT,_ELSE,_CASE,_ENUM,_REGISTER,_TYPEDEF,_CHAR,_CONST,_FLOAT,
_FOR,_SIGNED,_VOID,_SIZEOF,_VOLATILE,_IF,_WHILE,_READ,_WRITE,_PRINTF,
//操作符
ASSIGN,PLUS,MINUS,TIMES,DIV,MOD,
BITWISE_AND,BITWISE_OR,BITWISE_NOT,LOGICAL_NOT,LT,GT,
*/,
};
//界符
LPARAN,RPARAN,LBRACE,RBRACE,LSQUARE,RSQUARE,COMMA,DOT,SEMI,COLON,
//(){}[],.;:
//复杂操作符
EQ/*==*/,NEQ/*!
=*/,PLUS_PLUS/*++*/,MINUS_MINUS/*--*/,
PLUS_ASSIGN/*+=*/,MINUS_ASSIGN/*-=*/,TIMES_ASSIGN/**=*/,DIV_ASSIGN/*/=NGT/*<=*/,NLT/*>=*/,LOGICAL_AND/*&&*/,LOGICAL_OR/*||*/,
//其他
_EOF,_ID,_NUM,_STRING,_CHARACTER,_LABEL,_ERROR,_NONE
4.4汇编成可运行文件
采用intel80x86汇编语言,然后调用MASM汇编成可执行文件(.exe),可在相应机型的机器上运行。
4.5MiniC语言的文法
1.<程序>→<声明列表>
2.<声明列表>→<声明列表><声明>|<声明>
3.<声明>→<变量声明>|<函数声明>
4.<变量声明>→<类型分类符>ID(,...)';'|<类型分类符>ID'['<数字>']'(,...)';'
5.<数字>→0|1|2|3|4|5|6|7|8|9|...
6.<类型分类符>→"int"|"void"|"char"|"float"
7.<函数声明>→<类型分类符>ID'('<参数>')'<复合声明>
8.<参数>→<参数列表>|"void"
9.<参数列表>→<参数列表>','<参数>|<参数>
10.<参数>→<类型分类符>ID|<类型分类符>ID'['']'
11.<复合声明>→'{'<局部声明><声明列表>'}'|<表达式声明>
12.<局部声明>→<局部声明><变量声明>|<变量声明>13.<输入函数>→"read"'('<变量>')'';'
14.<输出函数>→"write"'('<表达式>')'';'
15.<显示函数>→"printf"'('`"`<字符串>`"`')'';'
16.<表达式声明>→<表达式>';'|';'
17.<表达式>→<变量>`=`<表达式>|<逻辑表达式1>18.<变量>→a|b|c|...|z |A|B|C|...|Z...
19.<逻辑表达式1>→<逻辑表达式1>"||"<逻辑表达式2>|<逻辑表达式2>
20.<逻辑表达式2>→<逻辑表达式2>"&&"<简单表达式>|<简单表达式>
21.<简单表达式>→<添加的表达式><关系操作><添加的表达式>|<添加的表达式>22.<关系操作>→"<="|'<'|'>'|">="|"=="|"!
="
23.<添加的表达式>→<添加的表达式><加法操作>|24.<加法操作>→'+'|'-'
25.→<乘法操作><逻辑表达式3>|<逻辑表达式3>26.<乘法操作>→'*'|'/'|'%'
27.<逻辑表达式3>→'!
'<逻辑表达式3>|<因子>
28.<因子>→'('<表达式>')'|<变量>|<调用>|<数字>
29.<变量>→ID|ID'['<表达式>']'
30.<调用>→ID'('<形式参数>')'';'
31.<形式参数>→<形式参数表列>|ε
32.<形式参数表列>→<形式参数表列>','<表达式>|<表达式>33:
<子复合声明>→ID':
'|<调用>|<表达式声明>
34:
→"if"'('<表达式>')'<复合声明>|"if"'('<表达式>')'<复合声明>"else"<
复合声明>
35.→"while"'('<表达式>')'<复合声明>
36.→"for"'('<变量>'='<表达式>';'<表达式>';'<变量>'='<表达式>')'<
复合声明>
37