基于C语言子系统的词法分析器计与实现 毕业论文.doc_第1页
基于C语言子系统的词法分析器计与实现 毕业论文.doc_第2页
基于C语言子系统的词法分析器计与实现 毕业论文.doc_第3页
基于C语言子系统的词法分析器计与实现 毕业论文.doc_第4页
基于C语言子系统的词法分析器计与实现 毕业论文.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

毕业论文(设计)题 目:基于c语言子系统的词法分析器计与实现完 成 人: 对齐_班 级: 2008-06 _学 制: 4年 _专 业: 软件工程 指导教师: 完成日期: 2012-03-09 _基于c语言词法分析器的设计与实现 摘要注:摘要和关键词用小四号黑体,两端对齐,其内容用小四号仿宋,关键词与正文之间空小四单倍行距,摘要内容行间距固定值20磅,关键词间用分号:算法实现是学生学习过程中的难点,编译器是程序员使用的关键工具,程序员每天都在使用编译器,依赖于其正确性和可靠性。编译器作为广大it从业者必须接触的系统软件,它的设计本身又是一个极其庞大的工程。首先介绍了 c 语言及 c 语言编译器的发展历程,其次对本次开发所用到的工具 visual studio c+2005 以及面向对象的程序设计方法做一下简单介绍。最后重点介绍了编译器的详细开发过程,分为 四个部分分别阐述:词法分析器的设计,语法分析器的设计,语义分析,以及系统的用户界面部分。每个部分又分别从总体框架,详细流程,重点数据结构和函数,以及与其他部分的接口等方面予以阐述。本次设计只象征性的选择部分具有代表性的功能。在本文的第四章详细给出了此次设计所实现的功能和语法规范,同时也给出了编译器的运行方式。摘要太繁琐,明本论文的主旨及程序的简明开发过程即可。关键词:编译器;c语言程序;面向对象程序设计方法;vc+,引言: 0引言部分删除,部分可作为摘要内容词法分析是编译过程中的基础阶段。开发程序设计语言词法分析器的方法主要有两种;一种是手工编写;另一种借助与于,错别字辅助工具。本文在研究基于windows平台的基础上,设计并实现啦删除编译器的词法分析模块。绪论1绪论一级标题用小三黑号体,本行用段前段后各空1行,左顶格下雷同1.1 c语言及编译器概述1.1与1.2内容合并并缩减,只需描述编译器的总体功能,和c语言词法分析器的总体功能即可。二级标题用四号体黑体,左顶格 ,不加标点。下雷同c正文正文用四号宋体,行间距用固定值22磅语言是在70年代初问世的。c语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。c语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作。由于c语言实现了对硬件的编程操作,因此c语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。此外,c语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,从而形成了多种版本的c语言。编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。然而,也存在从低阶语言到高阶语言的编译器,这类编译器中用来从由高阶语言生成的低阶语言代码重新生成高阶语言代码的又被叫做反编译器。也有从一种高阶语言生成另一种高阶语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。典型的编译器输出是由包含入口点的名字和地址, 以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的可执行程序。1.2 c编译器设计思想一个编译器的主要工作过程可以概括为以下几个步骤:(1)词法分析三级及三级以下标题同正文,左顶格 ,不加标点词法分析器根据词法规则识别出源程序中的各个记号(token),每个记号代表一类单词(lexeme)。源程序中常见的记号可以归为几大类:关键字、标识符、字面量和特殊符号。词法分析器的输入是源程序,输出是识别的记号流。词法分析器的任务是把源文件的字符流转换成记号流。本质上它查看连续的字符然后把它们识别为“单词”。(2)语法分析语法分析器根据语法规则识别出记号流中的结构(短语、句子),并构造一棵能够正确反映该结构的语法树。(3)语义分析语义分析器根据语义规则对语法树中的语法单元进行静态语义检查,如果类型检查和转换等,其目的在于保证语法正确的结构在语义上也是合法的。(4)中间代码生成中间代码生成器根据语义分析器的输出生成中间代码。中间代码可以有若干种形式,它们的共同特征是与具体机器无关。最常用的一种中间代码是三地址码,它的一种实现方式是四元式。三地址码的优点是便于阅读、便于优化。(5)中间代码优化优化是编译器的一个重要组成部分,由于编译器将源程序翻译成中间代码的工作是机械的、按固定模式进行的,因此,生成的中间代码往往在时间和空间上有很大浪费。当需要生成高效目标代码时,就必须进行优化。(6)目标代码生成目标代码生成是编译器的最后一个阶段。在生成目标代码时要考虑以下几个问题:计算机的系统结构、指令系统、寄存器的分配以及内存的组织等。编译器生成的目标程序代码可以有多种形式:汇编语言、可重定位二进制代码、内存形式。(7)符号表管理符号表的作用是记录源程序中符号的必要信息,并加以合理组织,从而在编译器的各个阶段能对它们进行快速、准确的查找和操作。符号表中的某些内容甚至要保留到程序的运行阶段。(8)出错处理用户编写的源程序中往往会有一些错误,可分为静态错误和动态错误两类。所谓动态错误,是指源程序中的逻辑错误,它们发生在程序运行的时候,也被称作动态语义错误,如变量取值为零时作为除数,数组元素引用时下标出界等。静态错误又可分为语法错误和静态语义错误。语法错误是指有关语言结构上的错误,如单词拼写错、表达式中缺少操作数、begin和end不匹配等。静态语义错误是指分析源程序时可以发现的语言意义上的错误,如加法的两个操作数中一个是整型变量名,而另一个是数组名等。本系统的设计主要是实现了其中的词法分析、语法分析和语义分析三个部分。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类库,mfc是一个很大的c+类层次结构,其中封装了大量的类及其函数,很多windows程序所共有的标准内容可以由mfc的类来提供,mfc类为这些内容提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓,这将简化编程工作,大大的减少程序员编写的代码数量,使编程工作变得更加轻松容易。当然还有visual 2008和最新的visual 2010beta版也已经发布。visual studio 2005的成功已被证实,即开发人员偏爱一个具备对他们需要的工具提供接口的集成开发环境。下面主要介绍它的有点。通过将开发人员在开发环境中需要的测试和性能工具(例如,单元测试、代码分析和性能分析)合并在一起,visual studio 2005 team system 也期待着这种成功。这使开发人员能够在生命周期的较早阶段就改善其代码的质量,而无需中断他们的工作。通过尽早地为开发人员提供他们需要用于识别和解决质量问题的工具,更多的产品缺陷就能够在它们还未构成危害之前即被发现并解决。 visual studio 2005 team system,那么过程就不仅仅是文档了。它还能将自己体现为实际的工具行为更改。当您在项目初期选择过程时,还需要选择工作流和工作产品,它们会驱动系统的行为方式。对 sdlc 过程的支持是内置的,这使得对工作流的支持是无缝的。通过将过程集成到团队成员日常使用的基本工具中,visual studio 2005 team system 大大消除了过程采纳的障碍,并使自动收集跨职能的项目标准成为可能,而无需实施人工报告的相关开销。通过使用一个公共的跨工具集的数据仓库,visual studio 2005 team system 解决了在大多数 sdlc 工具中建立数据仓库这一问题,并启动了一个聚合的项目状态视图。团队根据能够收集到的规则来管理项目。今天,数据主要限于缺陷跟踪。visual studio team system 中集成的数据将开创一条新路 通过平衡利用贯穿于 sdlc 的大量、多样的数据来管理项目规则。visual studio 2005 team system 会收集精确的数据 不仅限于缺陷跟踪,而是包括测试结果、代码涵盖、代码生成、任务进度等这些贯穿于团队常规工作流程的数据。该数据以某些标准的报告方式呈现,客户和 microsoft 内部团队已在报告中建立了成功项目管理的关键规则。此外,团队还能够创建自定义报告。仅当以项目的大范围上下文查看数据时,团队才能够精确地报告项目状态。这些优点也是此次毕业设计选用此开发工具的主要原因。c语言词法分析器的总体分析与设计加一级标题 此段只写词法分析即可,2.3-2.6删除。说明词法分析器的输入和输出。具体给出c语言的词法,及输出时的单词符号种别编码等信息。2.1 系统设计目标与功能分析本系统的设计目标是完成一个小型的c语言编译器,由于要完成一个完美的c语言编译器是一件非常复杂的事情,不仅要考虑到c语言代码的各种灵活用法,还需要熟悉生成目标代码和生成解析可执行文件的原理,甚至是汇编语言。所以本系统只完成整个编译过程中的词法分析、语法分析、语义分析以及其中的建立符号表和类型检查几个步骤,并不生成最后的可执行文件。另外,本系统包含一个简单易用的用户界面部分,可以进行c语言代码的编写、打开、保存等功能,并且代码视图采用的是关键字高亮显示技术,使代码的阅读更加直观。而在编译过程中,下部的输出窗口实时显示编译过程中发现的错误等信息,最后显示编译结果。下面分别概括介绍编译过程中的这几个阶段。2.2 词法分析词法分析程序又称扫描器,它是编译过程的第一个阶段。其主要任务是从左到右依次描描字符串形式的源程序的各个字符,逐个识别出其中的单词,并将其转换成为内部编码形式的单词符号串输出,用于进行语法分析。通常可采用二元式(class,value)来表示一个单词符号的内部编码,其中class为一整数码,用于表示该单词的类别;value则是单词之值(如变量名在符号表中的序号,常数的二进制表示,以及运算符和分隔符的编码,等等)。概括的说,扫描器在其工作过程中,一般应完成下列的任务:(1)识别出源程序中的各个单词符号,并将其转换成内部编码形式;(2)删除无用的空白字符、回车字符以及其他非实质性字符;(3)删除注释;(4)进行词法检查,报告所发现的错误。此外,视编译工作流程的组织,一些编译程序在进行词法分析时,还要完成将所识别出的标志符登录到符号表的工作。从功能上看,词法分析上把字符串形式的源程序转换为单词串形式,然后进行语法分析。从工作方式上看,他与语法分析之间存在两种接口方式。一种方式是将词法分析的输出结果存放在一个中间文件上,后面的语法分析程序将它作为输入进行语法分析 。另一种方式是将词法分析编成一个子程序,该子程序由语法分析程序调用,当语法分析程序需要一个新的单词时,就调用该子程序,每调用一次,则从源程序字符串中读出一个具有独立意义的单词。本设计采用前一种方式。2.3 语法分析语法分析程序又称分析器,它以单词串形式的源程序作为输入或分析的对象,其基本任务是:根据程序设计语言的语法规则(即定义该语言的前后无关文法),分析源程序的语法结构,即分析如何由这些单词组成该源程序的各种语法成分(如下标变量、函数、各种表达式、各种程序语句等),并在分析过程中进行语法正确性检查,产生内部形式的中间代码,供编译程序后续阶段处理。目前,已存在多种语法分析方面的方法,但就产生语法树的方向而言,可大致把它们分为自顶向下分析和自底向上分析两大类。2.3.1自顶向下的语法分析所谓自顶向下的语法分析,只指对于给定输入串w,试图为其构造一个从文法开始符号s到w的最左推导s=w,或为w自上而下地构造一棵s为根结点的语法树。如果这一尝试得到成功,则证明w是相应文法的一个句子;反之,则不是。在进行自顶向下的语法分析时,通常有两个障碍须加以解决:(1) 由于采取了最左推导,故当相应文法g中含有左递归的非终结符号时,便会使语法分析过程陷入循环不已的状况。(2) 采用最左推导以实现对符号串w的匹配,实际上是一个用文法产生式的诸候选式反复进行试探的过程,这势必会出现大量的回溯,从而导致语法分析效率的大幅度下降。因此,欲实现自顶向下的语法分析,其首要任务是改造程序设计语言的文法,使得文法无左递归且无左公因子,以消除其中的左递归和避免回溯的出现。2.3.2自底向上的语法分析所谓自底向上的语法分析,是指从给定的输入串w=a1a2an出发,试图利用相应文法中的产生式,逐步将其归约为文法的开始符号s,即从叶结点a1,a2,an出发,试图逐步向上构造一个语法树,而其根结点恰好为s0由于上述分析过程通常采用的是最左归约,所以实现此种语法分析的关键,是在分析的每一步,如何寻找或确定当前句型的句柄,以及确定将其归约为什么非终结符号。和自顶向下的分析过程一样,实现自底向上的分析,通常也须使用一个分析栈来存放分析过程中所得的文法符号。分析开始时,在栈底放置一个界符#,然后将输入符号逐个推入栈内,一旦在分析栈的栈顶出现句柄,就用相应的产生式的左部去替换这个句柄,即进行一次归约。由于归约,便得到了新的栈顶,此时再查看栈的顶部是否形成新的句柄:若是,再进行归约;反之,则继续将后续的输入符号移入栈内,并重复上述过程。若最终能将全部输入符号(不包括右界符#)移掉,且分析栈中只留下栈底符号#及最后一步归约所得的文法开始符号,则表明对输入串的分析已经成功。但若全部输入符号已被移掉,而分析栈却不能出现上述格局,则表明输入符号串不是文法的一个句子,其中必定存在语法错误。通常将上述过程称为“移进-归约”分析,它是最基本的自底向上分析过程。在此基础上,根据寻找句柄策略的不同,便形成了不同的自底向上的语法分析方法。2.4 语义分析在完成了上述过程后编译程序将源程序变成一种内部表示形式,这种内部表示形式就叫做中间代码或中间语言,它是一种结构简单、含义明确的记号系统。有些快速编译程序几乎没有中间代码,但是为了使目标代码的优化比较容易实现,独立于机器进行,许多编译程序都采用了某种复杂性程度介于源程序语言和机器语言之间的中间语言。但是,想对于词法分析和语法分析都已有相当成熟的理论和算法,中间代码目前还没有一种公认的形式系统,比较接近形式化的方法是语法制导翻译。2.5符号表符号表的信息栏中登记了每个名字的有关性质,如类型(整、实或布尔等)、种属(简单变量、数组、过程等)、大小(长度,即所需的存储单元字数)以及相对数(指分配给该名宇的存储单元的相对地址)。不同的程序语言对于名字性质的定义各有不同。现今多数程序语言中的名字或者是用说明语句规定其性质,或者采用某种隐含约定(如fortran中凡以字符i,j,n开头的标识符代表整型变量名)。有些程序语言,如adl没有说明语句也没有隐含约定,因此,符号表的性质须到目标程序运行时才能确定下来。但编译时登记在符号表中的各名字的性质只能来自说明语句(包括隐含约定和标号定义)或其它引用情形。对于变量名、数组名和过程名而言,它们的信息栏中一般要求有下列信息:变量 类型(整、实、双实、布尔、字符、复、标号或指针等);种属(简单变量、数组或记录结构等);长度(所需的存储单元数);相对数(存储单元相对地址);若为数组,则记录其内情向量;若为记录结构,则把它与其分量按某种形式联系起来;形式参数标志;若在 common或 equvalence语句中(fortran语言),把它和有关名字连接在一起;它的说明是否已处理过(即标志位“定义否”);是否对这个变量进行过赋值(包括出现在输人名表中)的标志位。过程 是否为程序的外部过程?若为函数,类型是什么?其说明是否处理过?是否递归?形式参数是些什么?为了与实参进行比较,必须把它们的种属、类型信息同过程名联系在一起。对于那些只使用单一符号表的简单语言,对符号表填入新项的工作可由词法分析程序来完成。也就是,当扫描器碰到一个标识符时就对它查填符号表,然后回送它在符号表中的位置作为单词值。但在某些语言中,甚至在同一过程段里允许用同一标识符标识各种不同对象。例如,xyz可能既是一个实变量名又是一个标号名,或者又是某个结构型数据的一个分量名。在这种情况下,使用单一符号表或由词法分析程序负责查填符号表都是非常不方便的。因此,采用多种符号表并让语法语义分析程序负责查填工作是比较妥当的。对于词法分析程序来说,只要求它凡碰到标识符就直接送出此标识符自身即可。符号表中信息栏的具体组织和安排取决于所翻译的具体语言与目标机器(的字长和指令系统)。2.6 类型检查为了进行类型检查,编译器需要给源程序的每一个组成成分赋予一个类型表达式。然后,编译器需要确定这些类型表达式是否满足一组逻辑规则。这些规则被称为源语言的类型系统。类型检查具有发现程序中的错误的功能。原则上,如果目标代码在保存元素值的同时保存了元素类型的信息,任何检查都可以动态地进行。一个健全的类型系统可以消除对动态类型检查的需要,因为它可以帮助我们静态地确定这些错误不会在程序运行的时候发生。如果编译器可以保证它接受的程序在运行时刻不会发生类型错误,那么该语言的这个实现就被称为强类型的。系统详细设计一级标题3.1系统设计基本思路此段内容缩减,只保留与词法分析相关部分,并移至上一段。基于c语言源程序分析器的开发在可行性分析的基础上进一步全面、深入的分析,弄清c语言的编译原理及运行状况,在编译程序工作的五个阶段中,每个阶段都必须遵从功能等价的原则。词法规则与语法分析阶段依据的语法规则一同构成了一个语言的语法,而语法则是从形的角度衡量一个程序是否合法。所以在词法分析阶段,词法规则成为重要的研究对象。词法分析器所处理的对象即词法分析程序的输入数据,实际上是源程序经过编译预处理,去掉多余的符号后而形成的代码,这样给词法分析带来方便。词法分析的过程是线性的从头至尾扫描一遍,复杂度较低,易实现。最后概括出要实现的几个功能流程图如下:输入文件开始词法分析语法分析类型检查输出信息3.2词法分析模块设计理论部分移至上一段,此段说明具体实现过程。注意画出实现的状态转换图。只保留词法分析相关内容,不相关内容删除。 词法分析程序需要完成的任务如下:1) 识别出源程序的各个语法单位;2) 剔除无用的空白字符、制表符、回车字符以及其他与输入介质相关的非实质性字符 ;3) 过滤掉源程序中的注释;4) 进行词法检查,如果出现错误,记录出错信息并报告。我们将编译程序的重点放在中间代码生成阶段。词法分析器的功能是输入源程序,输出单词符号。这部分程序主要包括两个类:包括两个类:class ctokenizer:从一个字符串中(这个把一个文件看作是一个字符串,mfc中cfile-cstring)分离出一个一个token,配上简单的类型通过nexttoken()返回:#define tt_eoln#define tt_eof-1#define tt_integer-2#define tt_real-3#define tt_word-4#define tt_string#define tt_charclass cscaner:得到具体的的token类型,定义tokentype如下:enum tokentype/ reserved keyword_auto, _double, _int, _struct,_break, _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,/ operationsassign, 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,/ complex operationseq/* = */, neq/* != */, plus_plus/* + */, minus_minus/* - */,plus_assign/* += */, minus_assign/* -= */, times_assign/* *= */, div_assign/* /= */,ngt/* = */, logical_and/* & */, logical_or/* | */,/ others_eof, _id, _num, _string, _character, _label, _error, _none;cscaner通过一个cmap m_keyindex 把cstring的关键字和tokentype对应,便于查找和反向查找。c关键字表:autodoubleintstructbreakelselongswitchcaseenumregistertypedefcharexternreturnunionconstfloatshortunsignedcontinueforsignedvoiddefaultgotosizeofvolatiledoifstaticwhile标识符词法: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 9escape:n, r, b, 0-73.3 语法分析模块设计 在上一节中,实现了词法分析程序的功能。一个字符串形式的源程序经过词法分析,即被转换为一串单词符号。编译程序在完成了词法分析之后,就进入语法分析阶段。语法分析程序以单词形式的源程序作为输入或分析的对象。其基本任务是根据语言的语法规则(即描述该语言的上下文无关文法),分析源程序的语法结构(即分析如何将这些单词组成各种语法成分,如各种表达式、语句、函数或过程等),并在分析过程中,对源程序进行语法正确性检查。其分析结果是识别出无语法错误的语法成分。其输出形式也有多种。语法分析模块的核心部分设计如下:class cparser:定义ctreenode,和tiny例程类似:#define max_children 3class ctreenodepublic:ctreenode*child max_children ;/ point to child nodectreenode*father;/ point to father nodectreenode*sibling;/ point to sibling nodeintlineno;nodekindnodekind;union stmtkindstmt;expkindexp; kind;enum tokentypetype;cstringszname;cstringszscope;/ node function scopeboolbarray;/ is this an array declarationintiarraysize;/ array size;通过文法及相应规则建立语法树。grammar:program-declaration_listdeclaration_list-declaration_list declaration | declarationdeclaration-var_declaration | fun_declarationvar_declaration-type_specifier id(, .); | type_specifier id num (, .);type_specifier-int | void | char, actually this step is in declaration_list()fun_declaration-type_specifier id ( params ) compound_stmtparams-param_list | void | empty, void is thought as emptyparam_list-param_list , param | paramparam-type_specifier id | type_specifier id compound_stmt- loal_declarations statement_list | expression_stmtlocal_declarations-local_declarations var_declaration | var_declarationread ( var ) ;write ( expression ) ;printf ( string ) ;expression_stmt-expression ; | ;expression-var = expression | logic1_expressionlogic1_expression-logic1_expression | logic2_expression | logic2_expressionlogic2_expression- logic2_expression & simple_expression | simple_expressionsimple_expression-additive_expression relop additive_expression | additive_expressionrelop- = | | = | = | !=additive_expression - additive_expression addop term | termaddop- + | -term-term mulop logic3_expression | logic3_expressionmulop- * | / | %logic3_expression- ! logic3_expression | factorfactor-( expression ) | var | call | numvar-id | id expression call-id ( args )args-args_list | emptyargs_list-args_list , expression | expressionsub_compoundstmt-id : | call ; | expression_stmtif_stmt-if ( expression ) compound_stmt| if ( expression ) compound_stmt else compound_stmtwhile_stmt-while ( expression ) compound_stmtfor_stmt-for ( var = expression ; expression ; var = expression ) compound_stmtgoto_stmt-goto id ;break_stmt-break ;continue_stmt-continue ;return_stmt-return ; | return expression ;基本树形结构:if语句: if语句表达式语句语句while语句:while语句表达式语句for循环语句:表达式语句表达式for语句表达式复合语句:语句复合语句语句语句声明支持的语句及运算:1) 数据类型:int,char void,pcode里支持float,在80x86 asm里不支持2) 语句:赋值(=),if, while,for,return,break,continue3) 数学运算:+,*,/4) 关系运算:= =,=,=,!=5) 逻辑运算:&,|,!6) 支持函数的定义、调用7) 支持复合语句8) 注释语句:c类型的 /* */ 和c+类型的 /3.4 语义分析模块设计语义分析的任务是根据语义规则对识别出的各种语法成分分析其含义,进行初步翻译。具体来说,其主要任务包括以下几部分。1、确定类型。即确定标识符所对应数据对象的数据类型,这部分工作有时也由词法分析来完成。2、语义检查。动态语义检查在运行时进行,需要生成相应的目标代码;而静态语义检查则在编译时完成,它主要完成以下四个方面。3、识别含义。如果静态语义正确,则进行正真的翻译,即识别程序中各种语法成分的含义,并做相应的语义处理,生成相应的中间代码或直接生成目标代码。语义分析程序是在词法分析和语义分析之后,可以由语法分析程序直接调用相应的语义子程序进行语义处理,也可以先生成语法树的某种表示方法,再进行语义处理。编译的各个阶段都可能发现源程序中的错误。发现错误后如果立即停止编译,往往会降低调式程序的效率,所以应对出现的错误做适当的处理,从而使编译能继续进行。词法分析可以检测出源程序中的非法字符,就好比自然语言中出现的错字和错词。语法分析能够发现程序语句中的各种语法错误,如括号不匹配等。语义分析能够判断运算对象的类型是否匹配,变量是否重复声明或没有声明就使用等错误。任何时刻发现错误,都应该报告错误信息,包括错误出现的位置和错误性质等,为程序员调试程序提供方便。本程序在语义分析部分设计主要包括两方面的内容,即建立符号表和类型检查。建立符号表:辅助类:class linelistrec:主要成员是lineno,记录某个token(变量或函数名)声明或使用时的行数。class bucketlistrec:主要成员变量:cstringname;/ variable namecstringscope;/ function scopeenum tokentypetype;intmemloc;/ memory location for variableboolbarray; / for array checkinglinelistrec*lineno;bucketlistrec*next;记录每一个变量或函数名的具体情况。主要的类,建立符号表:class csymboltable:主要成员变量:bucketlistrec*hashtablesize,把class bucketlistrec类的对象通过hash函数找到位置后插入。函数printsynbaltable(lpctstr lpszpathname),输入文件名,通过一个递归函数输出符号表到文件lpszpathname。class cfunargscheck:插入函数参数的类型,以备在下一个步骤中做匹配检测。类型检测:class canalyzer:包括两个部分:类型匹配:函数或变量声明时检测是否已声明,如已声明则抛出错误;函数调用或变量使用时检测是否已声明,如未声明则抛出错误。函数调用参数检测:检测函数调用时传入参数的类型与函数声明时参数的类型是否匹配。3.5 界面设计考量 界面设计需要遵循一个基本理论,其核心内容是以已有的界面设计规范为指导原则,在不破坏已有的界面交互习惯的基础上修改创新。桌面界面的设计,在最早的个人电脑上就有实施,后来由苹果公司和微软公司反复修改和优化,如今已经逐渐演变成一套系统的设计规范,所有软件图形界面,所有面向web的指导文档,甚至许多为新型移动设备提供的设计参考都相继遵从,大多数的界面开发工具都默认支持这些规范所设定的描述语言和相关内容。 重要的是,用户交互界面在多年来透过操作系统和通用软件已经渐渐被使用者熟悉。无论是界面放置和控制方法(例如鼠标点击和快捷键操作)都已成为习惯,如果这种习惯被打破,就会引起客户的抗拒心理,因为他们需要花时间学习和掌握,甚至会降低客户的工作效率。另一方面,通用的界面规范不一定能够满足程序语言分析软件的功能要求,因为毕竟客户是软件开发者而不是普通的应用性使用者,因此,需要在界面设计上有一些修改与创新,让编译结果对于客户一目了然。系统原型测试一级标题写出一个具体的c语言程序和经过词法分析后得到的结果即可。4.1系统测试基本原则测试工作应尽量避免由原开发软件的个人或小组来承担;设计测试方案时,不仅要包括确定的输入数据,而且因包括从系统功能出发预期的测试结果;测试用例不仅要包括合理、有效的输入数据,还要包括无效的或不合理的输入数据;不仅要检验程序是否做了应该完成的事,还要检查是否同时做了不应该完成的事;软件中仍存在错误的概率和已经发现错误的个数是成正比的;而且需要保留测试用例,作为软件文档的组成部分。测试方法:对软件进行测试主要方法包括:l)人工测试:个人复查、走审和会审:2)机器测试:黑盒测试:也称功能测试,将软件看作黑盒子,在完全不考虑程序内部结构和特性的情况下,测试软件的外部特性。根据软件的需求规格说明书设计测试用例,从程序的输入、输出特性上测试是否满足所设计的功能。白盒测试:也称结构测试,将软件看作一个透明的白盒子,按照程序的内部结构和处理逻辑来选定测试用例,对软件的逻辑路径及过程进行测试,检查它与设计是否相符。4.2 系统测试的步骤系统的测试步骤一般有以下四个步骤:单元测试、组装测试、确认测试和系统测试,每一步都是在前一步的基础之上进行。首先进行的是单元测试,它是对程序

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论