一个简单文法的编译器前端的设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告
设计题目:一个简单文法的编译器前端的设计与实现
班级:计算机1208班
组长学号:********
组长姓名:樊荣
指导教师:**
设计时间:2014年12月
设计分工
组长学号及姓名:20124016 樊荣
分工:四元式生成、语义分析(未定义、重定义等)、整体设计组员1学号及姓名:20124020 李鑫
分工:符号表建立及其输入输出设计
组员2学号及姓名:20124032 杨学良
分工:词法分析
组员3学号及姓名:20124018 焦通
分工:语法分析
组员4学号及姓名:201240 陈凤
分工:简单C语言文法设计及部分简单函数编写
摘要
编译器是程序员使用的关键工具,程序员每天都在使用编译器,并且非常依赖于其正确性和可靠性。编译器作为广大IT从业者必须接触的系统软件,它的设计本身又是一个极其庞大的工程。编译器相关的各项技术经过近几十年的发展,已经日臻成熟,然而编译器构造原理和技术依然是计算机科学中理论与实践相结合的最好典范。本文重点介绍了编译器前端的详细开发过程,分为四个部分分别阐述:文法设计,词法分析器的设计,语法分析器的设计,语义分析部分。每个部分又分别从功能,数据结构和算法三个方面进行详尽阐述,。由于C语言本身的复杂性,很难面面俱到实现所有标准定义,所以本次设计只象征性的选择部分具有代表性的功能。在本文的第四章详细给出了此次设计所实现的功能和语法规范,同时也给出了编译器的运行方式。
关键词:编译原理,编译器前端,C源程序……
目录
摘要 (1)
1 概述 (2)
2 课程设计任务及要求 (3)
2.1 设计任务 (3)
2.2 设计要求 (3)
3 算法与数据结构 (4)
3.1算法的总体思想(流程) (4)
3.2词法分析模块 (5)
3.2.1 功能 (7)
3.2.2 数据结构 (8)
3.2.3 算法 (9)
3.3 语法分析模块 (10)
3.3.1功能 (11)
3.3.2 数据结构 (12)
3.3.3算法 (13)
3.4 符号表模块 (13)
3.4.1功能 (13)
3.4.2 数据结构 (14)
4序设计与实现 (14)
4.1 程序流程图 (14)
4.2 程序说明 (15)
4.3 实验结果 (15)
5. 结论 (16)
6. 参考文献。 (17)
7. 收获、体会和建议。 (17)
1.概述
经过一段时间的学习,我们在初步掌握了编译器的基本原理以后,设计了一个具有基本编译功能的编译器前端。该编译器前端接受类C语言语法的源代码输入,输出结果是四元式组。本编译器实现了基本高级语言所必须的语法要素,包括简单变量声明、条件判断语句和循环语句及跳转语句、基本代数运算、赋值等。由于编译程序本身涉及到词法分析、语法分析、中间代码生成等诸多模块,要在实验中做到面面俱到不太可能,所以本编译器不可避免的会存在各种问题,但作为一个具有基本功能的、可扩充的系统,完全达到了巩固编译原理的理论知识,并将其运用于实践的目的。
2.课程设计任务及要求
2.1设计任务
在下列内容中任选其一:
1、一个简单文法的编译器前端的设计与实现。
2、基本块的划分及中间代码优化程序设计与实现。
3、LL(1)、LR分析表的自动生成算法的设计实现。
4、自选一个感兴趣的与编译原理有关的问题加以实现,要求难度相当。
我们组由于人数较多,且综合代码编写能力不强,经多方面考虑选择了简单类C文法的编译前端设计与实现任务。
2.2设计要求
1.给出一个源程序文件,作为编译器前端的输入
2.输出相关编译阶段的运行结果
词法分析阶段:
Token序列;
关键字表、界符表、符号表系统。
中间代码生成阶段:
四元式序列;
符号表系统。
3. 算法及数据结构
3.1算法的总体思想(流程)
程序整体上遵从上图所示流程图,源代码通过词法分析器,录入token 序列,并纠察词法错误,接下来根据token 序列进行语法分析,采用递归下降法对程序语法进行验证检查,在这过程中,建立和完善符号表,并进行语义差错(主要是类型检查、未定义和重定义),通过前面过程后,才能生成中间代码,并输出有关信息。
3.2词法分析模块 3.2.1功能
词法分析程序又称扫描器,它是编译过程的第一个阶段。其主要任务是从左到右依次描描字符串形式的源程序的各个字符,逐个识别出其中的单词,
并
将其转换成为内部编码形式的单词符号串输出,用于进行语法分析。概括的说语法分析器在工作中完成以下几项任务:
(1)识别出源程序中的各个单词符号,并将其转换成内部编码形式;
(2)删除无用的空白字符、回车字符以及其他非实质性字符;
(3)进行词法检查,报告所发现的错误;
(4)填写符号表。
3.2.2 数据结构
struct TokenType
{ int code,value;}token[100];//token序列
string bsfwords[20];//标示符数组,code = 0
int bsf = 0;
char zifwords[20];//字符数组,code = 1
int zif = 0;
string zfcwords[20];//字符串数组,code = 2
int zfc = 0;
float numwords[30];//数字常量数组,code = 3
int num =0;
3.2.3 算法
识别器算法流程图设计: