内容摘要:
编译器是程序员使用的关键工具,程序员毎天都在使用编译器,并且非常依赖于其正确性和可靠性。本文首先介绍了C语言及C语言编译器的发展历程,其次对本次开发所用到的工具Visual Studio C++2005以及面向对象的程序设计方法做一下简单介绍。最后重点介绍了编译器的详细开发过程,分为四个部分分别阐述:词法分析器的设计;语法分析器的设计;语义分析;以及系统的用户界面部分。每个部分又分别从总体框架,详细流程,重点数据结构和函数,以及与其他部分的接口等方面予以阐述。由于C语言本身的复杂性,很难面面倶到实现所有标准定义,所以本次设计只象征性的选择部分具有代表性的功能。在本文的第四章详细给出了此次设计所实现的功能和语法规范,同时也给出了编译器的运行方式。
关键词:编译器 C源程序 VC++
The lexical analyzer’s Design and Implementation of high-level language compiler
Abstract:
The compiler is a key tool used by the programmer. Programmers every day in the compiler, and is very dependent on its accuracy and reliability. This paper first describes the C language and C language compiler development process, make a brief introduction followed by the tools used to develop Visual Studio C + + 2005 as well as object-oriented programming method. Finally, highlight the compiler development process is divided into four parts, respectively, explained: The design of lexical analyzer, parser design, semantic analysis, as well as the system's user interface part. Each part separately from the overall framework of the process, focusing on data structures and functions, as well as other parts of the interface to be elaborated. Due to the complexity of the C language itself, difficult to Powerphones Ju to all standard definition, so the wood design is only symbolic choice of representative functions. Chapter IV of this paper is given in detail the design features and syntax specification, but also gives the compiler run.
Keywords: compiler  the C source   VC + +
高级语言编译器中的词法分析器的设计与实现
1  绪论
1.1 C语言及编译器概述
C语言是一种计算机程序设计语言。它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔研究所的D.M.Ritchie1972年推出。1978后,C语言已先后被移植到大、中、小及微型机上。它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画。具体应用比如单片机以及嵌入式系统开发。
词法分析代表了一类问题的集合,即如何对输入字符串中的特定模式进行具备特定动作的匹配。解决此类问题,不仅对于编译器开发中的阶段抽象具有重要意义,更对应用领域中有关字符处理的需求具有深刻价值。
设计和实现词法分析器,要用到词素、记号、正则表达式、输入字符双缓冲区、符号表、状态转换图设计等概念。抽象地阐述这些概念往往晦涩难懂,而结合某一具体编译器的前端实
现来分析探讨,则容易使概念条理清晰,目的明确。因此,从设计一个轻量级语言开始,根据语言编译的要求设计和实现词法分析器,将原理与实践结合,将是研究此类问题的最佳途径。
编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。然而,也存在从低阶语言到高阶语言的编译器,这类编译器中用来从由高阶语言生成的低阶语言代码重新生成高阶语言代码的又被叫做反编译器。也有从一种高阶语言生成另一种高阶语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)
典型的编译器输出是由包含入口点的名字和地址,以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的可执行程序。
1.2 C编译器设计思想
一个编译器的主要工作过程可以概括为以下几个步骤:
(1)词法分析
词法分析器根据词法规则识别出源程序中的各个记号(token),每个记号代表一类单词(lexeme)。源程序中常见的记号可以归为几大类:关键字、标识符、字面量和特殊符号。词法分析器的输入是源程序,输出是识别的记号流。词法分析器的任务是把源文件的字符 流转换成记号流。本质上它查看连续的字符然后把它们识别为“单词”。
(2)语法分析
语法分析器根据语法规则识别出记号流中的结构〔短语、句子〉,并构造棵能够正确反映该结构的语法树。
(3)语义分析
语义分析器根据语义规则对语法树中的语法单元进行静态语义检查,如果类型检查和转换等,其目的在于保证语法正确的结构在语义上也是合法的。
(4)中间代码生成
中间代码生成器根据语义分析器的输出生成中间代码。中间代码可以有若干种形式,它们的共同特征是与具体机器无关。最常用的一种中间代码是三地址码,它的一种实现方 式是四元式。三地址码的优点是便于阅读、便于优化。
(5)中间代码优化
优化是编译器的个重要组成部分,由于编译器将源程序翻译成中间代码的工作是机械的、按固定模式进行的,因此,生成的中间代码往往在时间和空间上有很大浪费。当需要生成高效目标代码时,就必须进行优化。
(6)目标代码生成
目标代码生成是编译器的最后一个阶段。在生成目标代码时要考虑以下几个问题:计算机的系统结构、指令系统、寄存器的分配以及内存的组织等。编译器生成的目标程序代 码可以有多种形式:汇编语言、可重定位二进制代码、内存形式。
(7)符号表管理
符号表的作用是记录源程序中符号的必要信息,并加以合理组织,从而在编译器的各个阶段能对它们进行快速、准确的查和操作。符号表中的某些内容甚至要保留到程序的 运行阶段。
8)出错处理
用户编写的源程序中往往会有一些错误,可分为静态错误和动态错误两类。所谓动态 错误,是指源程序中的逻辑错误,它们发生在程序运行的时候,也被称作动态语义错误,如变量取值为零时作为除数,数组元素引用时下标出界等。静态错误又可分为语法错误和 静态语义错误。语法错误是指有关语言结构上的错误,如单词拼写错、表达式中缺少操作数、beginend不匹配等。静态语义错误是指分析源程序时可以发现的语言意义上的错误,如加法的俩个操作数中一个是整型变量名,而另一个是数组名等。
c语言编译器的功能