ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:56.91KB ,
资源ID:26803027      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/26803027.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于C语言子系统的词法分析器计与实现.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于C语言子系统的词法分析器计与实现.docx

1、基于C语言子系统的词法分析器计与实现 毕业论文(设计)题 目:基于C语言子系统的词法分析器计与实现完 成 人: _班 级: 2008-06 _学 制: 4年 _专 业: 软件工程 指导教师: 完成日期: 2012-03-09 _基于C语言词法分析器的设计与实现 摘要:算法实现是学生学习过程中的难点,编译器是程序员使用的关键工具,程序员每天都在使用编译器,依赖于其正确性和可靠性。编译器作为广大IT从业者必须接触的系统软件,它的设计本身又是一个极其庞大的工程。首先介绍了 C 语言及 C 语言编译器的发展历程,其次对本次开发所用到的工具 Visual Studio C+2005 以及面向对象的程序设

2、计方法做一下简单介绍。最后重点介绍了编译器的详细开发过程,分为 四个部分分别阐述:词法分析器的设计,语法分析器的设计,语义分析,以及系统的用户界面部分。每个部分又分别从总体框架,详细流程,重点数据结构和函数,以及与其他部分的接口等方面予以阐述。本次设计只象征性的选择部分具有代表性的功能。在本文的第四章详细给出了此次设计所实现的功能和语法规范,同时也给出了编译器的运行方式。关键词:编译器;C语言程序;面向对象程序设计方法;VC+,引言: 词法分析是编译过程中的基础阶段。开发程序设计语言词法分析器的方法主要有两种;一种是手工编写;另一种借助与辅助工具。本文在研究基于windows平台的基础上,设计

3、并实现啦编译器的词法分析模块。绪论1.1 C语言及编译器概述C语言是在70年代初问世的。C语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。C语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作。由于C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。此外,C语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,从而形成了多种版本的C语言。编译是从源代码(通常为高阶语言)到能直接被计算

4、机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。然而,也存在从低阶语言到高阶语言的编译器,这类编译器中用来从由高阶语言生成的低阶语言代码重新生成高阶语言代码的又被叫做反编译器。也有从一种高阶语言生成另一种高阶语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。典型的编译器输出是由包含入口点的名字和地址, 以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的可执行程序。1.2 C编译器设计思想一个编译器的主要工作过程可以概括

5、为以下几个步骤:(1)词法分析词法分析器根据词法规则识别出源程序中的各个记号(token),每个记号代表一类单词(lexeme)。源程序中常见的记号可以归为几大类:关键字、标识符、字面量和特殊符号。词法分析器的输入是源程序,输出是识别的记号流。词法分析器的任务是把源文件的字符流转换成记号流。本质上它查看连续的字符然后把它们识别为“单词”。(2)语法分析语法分析器根据语法规则识别出记号流中的结构(短语、句子),并构造一棵能够正确反映该结构的语法树。(3)语义分析语义分析器根据语义规则对语法树中的语法单元进行静态语义检查,如果类型检查和转换等,其目的在于保证语法正确的结构在语义上也是合法的。(4)

6、中间代码生成中间代码生成器根据语义分析器的输出生成中间代码。中间代码可以有若干种形式,它们的共同特征是与具体机器无关。最常用的一种中间代码是三地址码,它的一种实现方式是四元式。三地址码的优点是便于阅读、便于优化。(5)中间代码优化优化是编译器的一个重要组成部分,由于编译器将源程序翻译成中间代码的工作是机械的、按固定模式进行的,因此,生成的中间代码往往在时间和空间上有很大浪费。当需要生成高效目标代码时,就必须进行优化。(6)目标代码生成目标代码生成是编译器的最后一个阶段。在生成目标代码时要考虑以下几个问题:计算机的系统结构、指令系统、寄存器的分配以及内存的组织等。编译器生成的目标程序代码可以有多

7、种形式:汇编语言、可重定位二进制代码、内存形式。(7)符号表管理符号表的作用是记录源程序中符号的必要信息,并加以合理组织,从而在编译器的各个阶段能对它们进行快速、准确的查找和操作。符号表中的某些内容甚至要保留到程序的运行阶段。(8)出错处理用户编写的源程序中往往会有一些错误,可分为静态错误和动态错误两类。所谓动态错误,是指源程序中的逻辑错误,它们发生在程序运行的时候,也被称作动态语义错误,如变量取值为零时作为除数,数组元素引用时下标出界等。静态错误又可分为语法错误和静态语义错误。语法错误是指有关语言结构上的错误,如单词拼写错、表达式中缺少操作数、begin和end不匹配等。静态语义错误是指分析

8、源程序时可以发现的语言意义上的错误,如加法的两个操作数中一个是整型变量名,而另一个是数组名等。本系统的设计主要是实现了其中的词法分析、语法分析和语义分析三个部分。1.3 开发工具的选用及介绍软件环境使用Windows2000/XP操作系统,用Visual C+ .NET为开发平台,在开发此软件时用的是VC+中的MFC框架。Visual C+.NET2005是微软公司推出的开发Win32应用程序(Windows 95/98/2000/XP/NT)的面向对象的可视化集成工具。从原来的Visual C+6.0/ Visual C+.Net 2005升级而来,它的最大优点就是提供了功能强大的MFC类库

9、,MFC是一个很大的C+类层次结构,其中封装了大量的类及其函数,很多Windows程序所共有的标准内容可以由MFC的类来提供,MFC类为这些内容提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓,这将简化编程工作,大大的减少程序员编写的代码数量,使编程工作变得更加轻松容易。当然还有Visual 2008和最新的Visual 2010beta版也已经发布。Visual Studio 2005的成功已被证实,即开发人员偏爱一个具备对他们需要的工具提供接口的集成开发环境。下面主要介绍它的有点。通过将开发人员在开发环境中需要的测试和性能工具(例如,单元

10、测试、代码分析和性能分析)合并在一起,Visual Studio 2005 Team System 也期待着这种成功。这使开发人员能够在生命周期的较早阶段就改善其代码的质量,而无需中断他们的工作。通过尽早地为开发人员提供他们需要用于识别和解决质量问题的工具,更多的产品缺陷就能够在它们还未构成危害之前即被发现并解决。 Visual Studio 2005 Team System,那么过程就不仅仅是文档了。它还能将自己体现为实际的工具行为更改。当您在项目初期选择过程时,还需要选择工作流和工作产品,它们会驱动系统的行为方式。对 SDLC 过程的支持是内置的,这使得对工作流的支持是无缝的。通过将过程集

11、成到团队成员日常使用的基本工具中,Visual Studio 2005 Team System 大大消除了过程采纳的障碍,并使自动收集跨职能的项目标准成为可能,而无需实施人工报告的相关开销。通过使用一个公共的跨工具集的数据仓库,Visual Studio 2005 Team System 解决了在大多数 SDLC 工具中建立数据仓库这一问题,并启动了一个聚合的项目状态视图。团队根据能够收集到的规则来管理项目。今天,数据主要限于缺陷跟踪。Visual Studio Team System 中集成的数据将开创一条新路 通过平衡利用贯穿于 SDLC 的大量、多样的数据来管理项目规则。Visual S

12、tudio 2005 Team System 会收集精确的数据 不仅限于缺陷跟踪,而是包括测试结果、代码涵盖、代码生成、任务进度等这些贯穿于团队常规工作流程的数据。该数据以某些标准的报告方式呈现,客户和 Microsoft 内部团队已在报告中建立了成功项目管理的关键规则。此外,团队还能够创建自定义报告。仅当以项目的大范围上下文查看数据时,团队才能够精确地报告项目状态。这些优点也是此次毕业设计选用此开发工具的主要原因。C语言词法分析器的总体分析与设计2.1 系统设计目标与功能分析本系统的设计目标是完成一个小型的C语言编译器,由于要完成一个完美的C语言编译器是一件非常复杂的事情,不仅要考虑到C语言

13、代码的各种灵活用法,还需要熟悉生成目标代码和生成解析可执行文件的原理,甚至是汇编语言。所以本系统只完成整个编译过程中的词法分析、语法分析、语义分析以及其中的建立符号表和类型检查几个步骤,并不生成最后的可执行文件。另外,本系统包含一个简单易用的用户界面部分,可以进行C语言代码的编写、打开、保存等功能,并且代码视图采用的是关键字高亮显示技术,使代码的阅读更加直观。而在编译过程中,下部的输出窗口实时显示编译过程中发现的错误等信息,最后显示编译结果。下面分别概括介绍编译过程中的这几个阶段。2.2 词法分析词法分析程序又称扫描器,它是编译过程的第一个阶段。其主要任务是从左到右依次描描字符串形式的源程序的

14、各个字符,逐个识别出其中的单词,并将其转换成为内部编码形式的单词符号串输出,用于进行语法分析。通常可采用二元式(CLASS,VALUE)来表示一个单词符号的内部编码,其中CLASS为一整数码,用于表示该单词的类别;VALUE则是单词之值(如变量名在符号表中的序号,常数的二进制表示,以及运算符和分隔符的编码,等等)。概括的说,扫描器在其工作过程中,一般应完成下列的任务:(1)识别出源程序中的各个单词符号,并将其转换成内部编码形式;(2)删除无用的空白字符、回车字符以及其他非实质性字符;(3)删除注释;(4)进行词法检查,报告所发现的错误。此外,视编译工作流程的组织,一些编译程序在进行词法分析时,

15、还要完成将所识别出的标志符登录到符号表的工作。从功能上看,词法分析上把字符串形式的源程序转换为单词串形式,然后进行语法分析。从工作方式上看,他与语法分析之间存在两种接口方式。一种方式是将词法分析的输出结果存放在一个中间文件上,后面的语法分析程序将它作为输入进行语法分析 。另一种方式是将词法分析编成一个子程序,该子程序由语法分析程序调用,当语法分析程序需要一个新的单词时,就调用该子程序,每调用一次,则从源程序字符串中读出一个具有独立意义的单词。本设计采用前一种方式。2.3 语法分析语法分析程序又称分析器,它以单词串形式的源程序作为输入或分析的对象,其基本任务是:根据程序设计语言的语法规则(即定义

16、该语言的前后无关文法),分析源程序的语法结构,即分析如何由这些单词组成该源程序的各种语法成分(如下标变量、函数、各种表达式、各种程序语句等),并在分析过程中进行语法正确性检查,产生内部形式的中间代码,供编译程序后续阶段处理。目前,已存在多种语法分析方面的方法,但就产生语法树的方向而言,可大致把它们分为自顶向下分析和自底向上分析两大类。2.3.1自顶向下的语法分析所谓自顶向下的语法分析,只指对于给定输入串w,试图为其构造一个从文法开始符号S到w的最左推导S=w,或为w自上而下地构造一棵S为根结点的语法树。如果这一尝试得到成功,则证明w是相应文法的一个句子;反之,则不是。在进行自顶向下的语法分析时

17、,通常有两个障碍须加以解决:(1) 由于采取了最左推导,故当相应文法G中含有左递归的非终结符号时,便会使语法分析过程陷入循环不已的状况。(2) 采用最左推导以实现对符号串w的匹配,实际上是一个用文法产生式的诸候选式反复进行试探的过程,这势必会出现大量的回溯,从而导致语法分析效率的大幅度下降。因此,欲实现自顶向下的语法分析,其首要任务是改造程序设计语言的文法,使得文法无左递归且无左公因子,以消除其中的左递归和避免回溯的出现。2.3.2自底向上的语法分析所谓自底向上的语法分析,是指从给定的输入串w=a1a2an出发,试图利用相应文法中的产生式,逐步将其归约为文法的开始符号S,即从叶结点a1,a2,

18、an出发,试图逐步向上构造一个语法树,而其根结点恰好为S0由于上述分析过程通常采用的是最左归约,所以实现此种语法分析的关键,是在分析的每一步,如何寻找或确定当前句型的句柄,以及确定将其归约为什么非终结符号。和自顶向下的分析过程一样,实现自底向上的分析,通常也须使用一个分析栈来存放分析过程中所得的文法符号。分析开始时,在栈底放置一个界符#,然后将输入符号逐个推入栈内,一旦在分析栈的栈顶出现句柄,就用相应的产生式的左部去替换这个句柄,即进行一次归约。由于归约,便得到了新的栈顶,此时再查看栈的顶部是否形成新的句柄:若是,再进行归约;反之,则继续将后续的输入符号移入栈内,并重复上述过程。若最终能将全部

19、输入符号(不包括右界符#)移掉,且分析栈中只留下栈底符号#及最后一步归约所得的文法开始符号,则表明对输入串的分析已经成功。但若全部输入符号已被移掉,而分析栈却不能出现上述格局,则表明输入符号串不是文法的一个句子,其中必定存在语法错误。通常将上述过程称为“移进-归约”分析,它是最基本的自底向上分析过程。在此基础上,根据寻找句柄策略的不同,便形成了不同的自底向上的语法分析方法。2.4 语义分析在完成了上述过程后编译程序将源程序变成一种内部表示形式,这种内部表示形式就叫做中间代码或中间语言,它是一种结构简单、含义明确的记号系统。有些快速编译程序几乎没有中间代码,但是为了使目标代码的优化比较容易实现,

20、独立于机器进行,许多编译程序都采用了某种复杂性程度介于源程序语言和机器语言之间的中间语言。但是,想对于词法分析和语法分析都已有相当成熟的理论和算法,中间代码目前还没有一种公认的形式系统,比较接近形式化的方法是语法制导翻译。2.5符号表符号表的信息栏中登记了每个名字的有关性质,如类型(整、实或布尔等)、种属(简单变量、数组、过程等)、大小(长度,即所需的存储单元字数)以及相对数(指分配给该名宇的存储单元的相对地址)。不同的程序语言对于名字性质的定义各有不同。现今多数程序语言中的名字或者是用说明语句规定其性质,或者采用某种隐含约定(如FORTRAN中凡以字符I,J,N开头的标识符代表整型变量名)。

21、有些程序语言,如ADL没有说明语句也没有隐含约定,因此,符号表的性质须到目标程序运行时才能确定下来。但编译时登记在符号表中的各名字的性质只能来自说明语句(包括隐含约定和标号定义)或其它引用情形。对于变量名、数组名和过程名而言,它们的信息栏中一般要求有下列信息:变量 类型(整、实、双实、布尔、字符、复、标号或指针等);种属(简单变量、数组或记录结构等);长度(所需的存储单元数);相对数(存储单元相对地址);若为数组,则记录其内情向量;若为记录结构,则把它与其分量按某种形式联系起来;形式参数标志;若在 COMMON或 EQUVALENCE语句中(FORTRAN语言),把它和有关名字连接在一起;它的

22、说明是否已处理过(即标志位“定义否”);是否对这个变量进行过赋值(包括出现在输人名表中)的标志位。过程 是否为程序的外部过程?若为函数,类型是什么?其说明是否处理过?是否递归?形式参数是些什么?为了与实参进行比较,必须把它们的种属、类型信息同过程名联系在一起。对于那些只使用单一符号表的简单语言,对符号表填入新项的工作可由词法分析程序来完成。也就是,当扫描器碰到一个标识符时就对它查填符号表,然后回送它在符号表中的位置作为单词值。但在某些语言中,甚至在同一过程段里允许用同一标识符标识各种不同对象。例如,XYZ可能既是一个实变量名又是一个标号名,或者又是某个结构型数据的一个分量名。在这种情况下,使用

23、单一符号表或由词法分析程序负责查填符号表都是非常不方便的。因此,采用多种符号表并让语法语义分析程序负责查填工作是比较妥当的。对于词法分析程序来说,只要求它凡碰到标识符就直接送出此标识符自身即可。符号表中信息栏的具体组织和安排取决于所翻译的具体语言与目标机器(的字长和指令系统)。2.6 类型检查为了进行类型检查,编译器需要给源程序的每一个组成成分赋予一个类型表达式。然后,编译器需要确定这些类型表达式是否满足一组逻辑规则。这些规则被称为源语言的类型系统。类型检查具有发现程序中的错误的功能。原则上,如果目标代码在保存元素值的同时保存了元素类型的信息,任何检查都可以动态地进行。一个健全的类型系统可以消

24、除对动态类型检查的需要,因为它可以帮助我们静态地确定这些错误不会在程序运行的时候发生。如果编译器可以保证它接受的程序在运行时刻不会发生类型错误,那么该语言的这个实现就被称为强类型的。系统详细设计3.1系统设计基本思路基于C语言源程序分析器的开发在可行性分析的基础上进一步全面、深入的分析,弄清C语言的编译原理及运行状况,在编译程序工作的五个阶段中,每个阶段都必须遵从功能等价的原则。词法规则与语法分析阶段依据的语法规则一同构成了一个语言的语法,而语法则是从形的角度衡量一个程序是否合法。所以在词法分析阶段,词法规则成为重要的研究对象。词法分析器所处理的对象即词法分析程序的输入数据,实际上是源程序经过

25、编译预处理,去掉多余的符号后而形成的代码,这样给词法分析带来方便。词法分析的过程是线性的从头至尾扫描一遍,复杂度较低,易实现。最后概括出要实现的几个功能流程图如下:3.2词法分析模块设计 词法分析程序需要完成的任务如下:1) 识别出源程序的各个语法单位; 2) 剔除无用的空白字符、制表符、回车字符以及其他与输入介质相关的非实质性字符 ;3) 过滤掉源程序中的注释;4) 进行词法检查,如果出现错误,记录出错信息并报告。我们将编译程序的重点放在中间代码生成阶段。词法分析器的功能是输入源程序,输出单词符号。这部分程序主要包括两个类:包括两个类:Class CTokenizer:从一个字符串中(这个把

26、一个文件看作是一个字符串,MFC中CFile-CString)分离出一个一个token,配上简单的类型通过NextToken()返回:#define TT_EOL n#define TT_EOF -1#define TT_INTEGER -2#define TT_REAL -3#define TT_WORD -4#define TT_STRING #define TT_CHAR Class CScaner:得到具体的的token类型,定义TokenType如下:enum TokenType / reserved Keyword _AUTO, _DOUBLE, _INT, _STRUCT, _B

27、REAK, _ELSE, _LONG, _SWITCH, _CASE, _ENUM, _REGISTER, _TYPEDEF, _CHAR, _EXTERN, _RETURN, _UNION, _CONST, _FLOAT, _SHORT, _UNSIGNED, _CONTINUE, _FOR, _SIGNED, _VOID, _DEFAULT, _GOTO, _SIZEOF, _VOLATILE, _DO, _IF, _STATIC, _WHILE, _READ, _WRITE, _PRINTF, / operations ASSIGN, PLUS, MINUS, TIMES, DIV, M

28、OD, BITWISE_AND, BITWISE_OR, BITWISE_NOT, LOGICAL_NOT, LT, GT, LPARAN, RPARAN, LBRACE, RBRACE, LSQUARE, RSQUARE, COMMA, DOT, SEMI, COLON, / complex operations EQ/* = */, NEQ/* != */, PLUS_PLUS/* + */, MINUS_MINUS/* - */, PLUS_ASSIGN/* += */, MINUS_ASSIGN/* -= */, TIMES_ASSIGN/* *= */, DIV_ASSIGN/* /

29、= */, NGT/* = */, LOGICAL_AND/* & */, LOGICAL_OR/* | */, / others _EOF, _ID, _NUM, _STRING, _CHARACTER, _LABEL, _ERROR, _NONE;CScaner通过一个CMap m_KeyIndex 把CString的关键字和TokenType对应,便于查找和反向查找。C关键字表:autodoubleintstructbreakelselongswitchcaseenumregistertypedefcharexternreturnunionConstfloatshortunsignedC

30、ontinueforsignedvoidDefaultgotosizeofvolatileDoifstaticwhile标识符词法:identifier :nondigitidentifier nondigitidentifier digitnondigit : one of_ a b c d e f g h i j k l m n o p q r s t u v w x y zA B C D E F G H I J K L M N O P Q R S T U V W X Y Zdigit : one of0 1 2 3 4 5 6 7 8 9 escape: n, r, b, 0-73.3

31、语法分析模块设计 在上一节中,实现了词法分析程序的功能。一个字符串形式的源程序经过词法分析,即被转换为一串单词符号。编译程序在完成了词法分析之后,就进入语法分析阶段。语法分析程序以单词形式的源程序作为输入或分析的对象。其基本任务是根据语言的语法规则(即描述该语言的上下文无关文法),分析源程序的语法结构(即分析如何将这些单词组成各种语法成分,如各种表达式、语句、函数或过程等),并在分析过程中,对源程序进行语法正确性检查。其分析结果是识别出无语法错误的语法成分。其输出形式也有多种。语法分析模块的核心部分设计如下:Class CParser:定义CTreeNode,和Tiny例程类似:#define MAX_CHILDREN 3class CTreeNodepublic: CTreeNode* child MAX_CHILDREN ; / point to child node CTreeNode* father; / point to f

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1