C语言小型编译器的设计与实现 内容来自www.paper51.com 摘要 http://www.paper51.com 编译器是程序员使用的关键工具,程序员每天都在使用编译器,并且非常依赖于其正确性和可靠性。编译器作为广大IT从业者必须接触的系统软件,它的设计本身又是一个极其庞大的工程。编译器相关的各项技术经过近几十年的发展,已经日臻成熟,然而编译器构造原理和技术依然是计算机科学中理论与实践相结合的最好典范。 copyright paper51.com 本文首先介绍了C语言及C语言编译器的发展历程,其次对本次开发所用到的工具Visual Studio C++2005以及面向对象的程序设计方法做一下简单介绍。最后重点介绍了编译器的详细开发过程,分为四个部分分别阐述:词法分析器的设计,语法分析器的设计,语义分析,以及系统的用户界面部分。每个部分又分别从总体框架,详细流程,重点数据结构和函数,以及与其他部分的接口等方面予以阐述。由于C语言本身的复杂性,很难面面俱到实现所有标准定义,所以本次设计只象征性的选择部分具有代表性的功能。在本文的第四章详细给出了此次设计所实现的功能和语法规范,同时也给出了编译器的运行方式。 内容来自论文无忧网 www.paper51.com 关键词:编译器、C源程序、面向对象程序设计方法、VC++ 内容来自www.paper51.com ABSTRACT 内容来自论文无忧网 www.paper51.com Compiler is an important tool for programmers. They useit almost every day, and very dependent on its accuracy and reliability. As system software, compiler is known tomajority of IT practitioners, and its design itself is an extremely largeproject. Though through the development of recent decades, the relevanttechnology about compiler started to daily mature, still the theory andtechnology about compiler tectonic can be said as an extremely excellentexample of combining computer science theory with practice. 内容来自论文无忧网 www.paper51.com This paper first introduces the development of C languageand C compiler. Later, it gives a brief introduction of the tools Visual StudioC++2005 and object-oriented programming used in this design. At last, the paperfocuses on the detail of compiler design. It is divided into four sections todescribe respectively: the design of lexical analyzer, the design of parser,semantic analysis and the GUI of the system. Each part is described elaboratelyand separately from the following aspects: overall framework, detailed design,the function of data structure and function, the interface with other parts,and so on. Because of the complexity of C language, it is difficult to achieveall of the standard definition of C language; here we only choose some representativefunctions to implement. The fourth chapter of this paper describes the functionof the complier and the grammar norms, at the same time it gives the way how torun this compiler. 内容来自www.paper51.com Keywords: compiler, C source codes, object-oriented programming, VC++ copyright paper51.com 目录 内容来自www.paper51.com 摘要... I 内容来自www.paper51.com
ABSTRACT. II paper51.com 第一章 绪论... 1 paper51.com 1.1 C语言及编译器概述... 1 内容来自www.paper51.com 1.2 C编译器设计思想... 2 copyright paper51.com 1.3 开发工具的选用及介绍... 3 paper51.com 1.4 论文组织结构... 5 paper51.com 第二章 小型C编译器总体分析与设计... 6 http://www.paper51.com
2.1 系统设计目标与功能分析... 6 copyright paper51.com 2.2 词法分析... 6 http://www.paper51.com 2.3 语法分析... 7 http://www.paper51.com
2.3.1自顶向下的语法分析... 7 内容来自www.paper51.com 2.3.2自底向上的语法分析... 8 paper51.com 2.4 语义分析... 8 http://www.paper51.com
2.5 符号表... 9 paper51.com 2.6 类型检查... 10 paper51.com 第三章 系统详细设计... 12 http://www.paper51.com
3.1 系统设计基本思路... 12 copyright paper51.com
3.2 词法分析模块设计... 13 内容来自论文无忧网 www.paper51.com 3.3 语法分析模块设计... 15 copyright paper51.com 3.4 语义分析模块设计... 19 http://www.paper51.com 3.5 界面设计考量... 21 内容来自www.paper51.com 3.5.1 可用性原则... 21 copyright paper51.com 3.5.2 可视性原则... 22 内容来自www.paper51.com 3.5.3 系统主要界面组成... 23 paper51.com 第四章 系统原型测试... 26 paper51.com 5.1系统测试基本原则... 26 http://www.paper51.com
5.2 系统测试的步骤... 26 内容来自论文无忧网 www.paper51.com 5.3 测试结果... 27 内容来自www.paper51.com 第五章 结束语... 28 copyright paper51.com 致谢... 29 copyright paper51.com 参考文献... 30 内容来自www.paper51.com
http://www.paper51.com 第一章 绪论1.1 C语言及编译器概述 内容来自www.paper51.com C语言是在70年代初问世的。一九七八年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。同时由B.W.Kernighan和D.M.Ritchit合著了著名的“THE C PROGRAMMING LANGUAGE”一书。通常简称为《K&R》,也有人称之为《K&R》标准。但是,在《K&R》中并没有定义一个完整的标准C语言,后来由美国国家标准学会在此基础上制定了一个C 语言标准,于一九八三年发表。通常称之为ANSI C。C语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。C语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作。由于C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。此外,C语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,从而形成了多种版本的C语言。 内容来自论文无忧网 www.paper51.com
编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。然而,也存在从低阶语言到高阶语言的编译器,这类编译器中用来从由高阶语言生成的低阶语言代码重新生成高阶语言代码的又被叫做反编译器。也有从一种高阶语言生成另一种高阶语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。 http://www.paper51.com 典型的编译器输出是由包含入口点的名字和地址, 以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的可执行程序。 内容来自www.paper51.com
1.2 C编译器设计思想 paper51.com
一个编译器的主要工作过程可以概括为以下几个步骤: paper51.com 1. 词法分析 内容来自www.paper51.com 词法分析器根据词法规则识别出源程序中的各个记号(token),每个记号代表一类单词(lexeme)。源程序中常见的记号可以归为几大类:关键字、标识符、字面量和特殊符号。词法分析器的输入是源程序,输出是识别的记号流。词法分析器的任务是把源文件的字符流转换成记号流。本质上它查看连续的字符然后把它们识别为“单词”。 copyright paper51.com 2. 语法分析 内容来自论文无忧网 www.paper51.com 语法分析器根据语法规则识别出记号流中的结构(短语、句子),并构造一棵能够正确反映该结构的语法树。 http://www.paper51.com 3. 语义分析 http://www.paper51.com
语义分析器根据语义规则对语法树中的语法单元进行静态语义检查,如果类型检查和转换等,其目的在于保证语法正确的结构在语义上也是合法的。 内容来自论文无忧网 www.paper51.com 4. 中间代码生成 内容来自论文无忧网 www.paper51.com 中间代码生成器根据语义分析器的输出生成中间代码。中间代码可以有若干种形式,它们的共同特征是与具体机器无关。最常用的一种中间代码是三地址码,它的一种实现方式是四元式。三地址码的优点是便于阅读、便于优化。 paper51.com
5. 中间代码优化 内容来自论文无忧网 www.paper51.com 优化是编译器的一个重要组成部分,由于编译器将源程序翻译成中间代码的工作是机械的、按固定模式进行的,因此,生成的中间代码往往在时间和空间上有很大浪费。当需要生成高效目标代码时,就必须进行优化。 内容来自论文无忧网 www.paper51.com 6. 目标代码生成 http://www.paper51.com 目标代码生成是编译器的最后一个阶段。在生成目标代码时要考虑以下几个问题:计算机的系统结构、指令系统、寄存器的分配以及内存的组织等。编译器生成的目标程序代码可以有多种形式:汇编语言、可重定位二进制代码、内存形式。 copyright paper51.com 7 符号表管理 paper51.com 符号表的作用是记录源程序中符号的必要信息,并加以合理组织,从而在编译器的各个阶段能对它们进行快速、准确的查找和操作。符号表中的某些内容甚至要保留到程序的运行阶段。 内容来自论文无忧网 www.paper51.com 8 出错处理 http://www.paper51.com 用户编写的源程序中往往会有一些错误,可分为静态错误和动态错误两类。所谓动态错误,是指源程序中的逻辑错误,它们发生在程序运行的时候,也被称作动态语义错误,如变量取值为零时作为除数,数组元素引用时下标出界等。静态错误又可分为语法错误和静态语义错误。语法错误是指有关语言结构上的错误,如单词拼写错、表达式中缺少操作数、begin和end不匹配等。静态语义错误是指分析源程序时可以发现的语言意义上的错误,如加法的两个操作数中一个是整型变量名,而另一个是数组名等。 copyright paper51.com 本系统的设计主要是实现了其中的词法分析、语法分析和语义分析三个部分。 paper51.com 1.3 开发工具的选用及介绍 内容来自论文无忧网 www.paper51.com 软件环境使用Windows2000/XP操作系统,用Visual C++ .NET为开发平台,在开发此软件时用的是VC++中的MFC框架。 http://www.paper51.com Visual C++.NET2005是微软公司推出的开发Win32应用程序(Windows 95/98/2000/XP/NT)的面向对象的可视化集成工具。从原来的VisualC++6.0/ Visual C++.Net 2005升级而来,它的最大优点就是提供了功能强大的MFC类库,MFC是一个很大的C++类层次结构,其中封装了大量的类及其函数,很多Windows程序所共有的标准内容可以由MFC的类来提供,MFC类为这些内容提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓,这将简化编程工作,大大的减少程序员编写的代码数量,使编程工作变得更加轻松容易。当然还有Visual 2008和最新的Visual 2010beta版也已经发布。 内容来自www.paper51.com |