




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、. . . . 师大学本科毕业设计高级语言编译器中词法分析器的设计与实现学生彪院系名称物理与电子工程学院专业名称通信工程班 级2008级 4 班学 号2008070468指导教师 万川完成时间2012年 5月 12日高级语言编译器中的词法分析器的设计与实现学生:彪 指导老师:万川容摘要:编译器是程序员使用的关键工具,程序员毎天都在使用编译器,并且非常依赖于其正确性和可靠性。本文首先介绍了C语言与C语言编译器的发展历程,其次对本次开发所用到的工具Visual Studio C+2005以与面向对象的程序设计方法做一下简单介绍。最后重点介绍了编译器的详细开发过程,分为四个部分分别阐述:词法分析器的
2、设计;语法分析器的设计;语义分析;以与系统的用户界面部分。每个部分又分别从总体框架,详细流程,重点数据结构和函数,以与与其他部分的接口等方面予以阐述。由于C语言本身的复杂性,很难面面倶到实现所有标准定义,所以本次设计只象征性的选择部分具有代表性的功能。在本文的第四章详细给出了此次设计所实现的功能和语法规,同时也给出了编译器的运行方式。关键词:编译器 C源程序 VC+The lexical analyzers Design and Implementation of high-level language compilerAbstract: The compiler is a key tool
3、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 wel
4、l 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 systems user interface part. Each part separately from the overall framew
5、ork 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. Cha
6、pter IV of this paper is given in detail the design features and syntax specification, but also gives the compiler run.Keywords: compilerthe C source VC + +20 / 24目 录1 绪论11.1 C语言与编译器概述11.2 C编译器设计思想11.3开发工具的选用与介绍21.4论文组织结构32 C语言词法分析器的总体分析与设计42.1系统设计目标与功能分析42.2词法分析42.3语法分析42.3.1自顶向下的语法分析52.3.2自底向上的语法分
7、析52.4语义分析52.5符号表62.6类型检查73 系统详细设计73.1系统设计基本思路73.2词法分析模块设计83.3语法分析模块设计103.4语义分析模块设计133.5界面设计考量153.5.1可用性原则153.5.2可视性原则163.5.3系统主要界面组成174 系统原型测试194.1系统测试基本原则194.2系统测试的步骤194.3测试结果205 结束语20致21参考文献21高级语言编译器中的词法分析器的设计与实现1 绪论1.1 C语言与编译器概述C语言是一种计算机程序设计语言。它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔研究所的D.M.Ritchie于1972年推出。
8、1978后,C语言已先后被移植到大、中、小与微型机上。它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。它的应用围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画。具体应用比如单片机以与嵌入式系统开发。词法分析代表了一类问题的集合,即如何对输入字符串中的特定模式进行具备特定动作的匹配。解决此类问题,不仅对于编译器开发中的阶段抽象具有重要意义,更对应用领域中有关字符处理的需求具有深刻价值。设计和实现词法分析器,要用到词素、记号、正则表达式、输入字符双缓冲区、符号表、状态
9、转换图设计等概念。抽象地阐述这些概念往往晦涩难懂,而结合某一具体编译器的前端实现来分析探讨,则容易使概念条理清晰,目的明确。因此,从设计一个轻量级语言开始,根据语言编译的要求设计和实现词法分析器,将原理与实践结合,将是研究此类问题的最佳途径。编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。然而,也存在从低阶语言到高阶语言的编译器,这类编译器中用来从由高阶语言生成的低阶语言代码重新生成高阶语言代码的又被叫做反编译器。也有从一种高阶语言生成另一种高阶语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。典型的编译器输
10、出是由包含入口点的名字和地址,以与外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以在一起并生成可以由用户直接执行的可执行程序。1.2 C编译器设计思想一个编译器的主要工作过程可以概括为以下几个步骤:(1)词法分析词法分析器根据词法规则识别出源程序中的各个记号(token),每个记号代表一类单词(lexeme)。源程序中常见的记号可以归为几大类:关键字、标识符、字面量和特殊符号。词法分析器的输入是源程序,输出是识别的记号流。词法分析器的任务是把源文件的字符流转换成记号流。本质上它查看连续的字符然后
11、把它们识别为“单词”。(2)语法分析语法分析器根据语法规则识别出记号流中的结构短语、句子,并构造一棵能够正确反映该结构的语法树。(3)语义分析语义分析器根据语义规则对语法树中的语法单元进行静态语义检查,如果类型检查和转换等,其目的在于保证语确的结构在语义上也是合法的。(4)中间代码生成中间代码生成器根据语义分析器的输出生成中间代码。中间代码可以有若干种形式,它们的共同特征是与具体机器无关。最常用的一种中间代码是三地址码,它的一种实现方式是四元式。三地址码的优点是便于阅读、便于优化。(5)中间代码优化优化是编译器的个重要组成部分,由于编译器将源程序翻译成中间代码的工作是机械的、按固定模式进行的,
12、因此,生成的中间代码往往在时间和空间上有很大浪费。当需要生成高效目标代码时,就必须进行优化。(6)目标代码生成目标代码生成是编译器的最后一个阶段。在生成目标代码时要考虑以下几个问题:计算机的系统结构、指令系统、寄存器的分配以与存的组织等。编译器生成的目标程序代码可以有多种形式:汇编语言、可重定位二进制代码、存形式。(7)符号表管理符号表的作用是记录源程序中符号的必要信息,并加以合理组织,从而在编译器的各个阶段能对它们进行快速、准确的查找和操作。符号表中的某些容甚至要保留到程序的运行阶段。(8)出错处理用户编写的源程序中往往会有一些错误,可分为静态错误和动态错误两类。所谓动态错误,是指源程序中的
13、逻辑错误,它们发生在程序运行的时候,也被称作动态语义错误,如变量取值为零时作为除数,数组元素引用时下标出界等。静态错误又可分为语法错误和静态语义错误。语法错误是指有关语言结构上的错误,如单词拼写错、表达式中缺少操作数、begin和end不匹配等。静态语义错误是指分析源程序时可以发现的语言意义上的错误,如加法的俩个操作数中一个是整型变量名,而另一个是数组名等。本系统的设计主要是实现了其中的词法分析、语法分析和语义分析三个部分。1.3开发工具的选用与介绍软件环境使用Window2000/XP操作系统,用Visual C+.Net为开发平台,在开发此软件时用的是VC+中的MFC框架。VisualC+
14、.Net2005是微软公司推出的开发Win32应用程序(Windows95/98/2000/XP/NT)的面向对象的可视化集成工具。从原来的Visual C+6.0/Visual C+.Net 2005升级而来,它的最大优点就是提供了功能强大的MFC类库,MFC是一个很大的类层次结构,其中封装了大量的类与其函数,很多Windows程序所共有的标准容可以由MFC的类来提供,MFC类为这些容提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接门把具体应用程序特有的东西填入这个轮廓,这将简化编程工作,大大的减少程序员编写的代码数量,使编程工作变得更加轻松容易。当然还有Visual 2008
15、 和最新的Visual 2010beta版也已经发布。Visual Studio2005的成功已被证实,即开发人员偏爱一个具备对他们需要的工具提供接口的集成开发环境。下面主要介绍它的特点。通过将开发人员在开发环境中需要的测试和性能工具(例如,单元测试、代码分析和性能分析)合并在一起,Visual Studio 2005 Team System也期待着这种成功。这使开发人员能够在生命周期的较早阶段就改善其代码的质量,而无需中断他们的工作。通过尽早地为开发人员提供他们需要用于识别和解决质量问题的工具,更多的产品缺陷就能够在它们还未构成危害之前即被发现并解决。Visual Studio 2005 T
16、eam System,那么过程就不仅仅是文档了。它还能将自己体现为实际的工具行为更改。当您在项目初期选择过程时,还需要选择工作流和工作产品,它们会驱动系统的行为方式。对SDL过程的支持是置的,这使得对工作流的支持是无缝的。通过将过程集成到团队成员日常使用的基本工具中,Visual Studio 2005 Team System加大消除了过程釆纳的障碍,并使自动收集跨职能的项目标准成为可能,而无需实施人工报告的相关开销。通过使用一个公共的跨工具集的数据仓库,Visual Studio 2005 Team System解决了在大多数SDLC工具中建立数据仓库这一问题,并启动了一个聚合的项月状态视图
17、。团队根据能够收集到的规则来管理项目。今天,数据主要限于缺陷跟踪。Visual Studio 2005 Team System中集成的数据将开创一条新路通过平衡利用贯穿于SDLC的大量、多样的数据来管理项目规则。Visual Studio 2005 Team System会收集精确的数据不仅限于缺陷跟踪,而是包括测试结果、代码涵盖、代码生成、任务进度等这些贯穿于团队常规工作流程的数据。该数据以某些标准的报告方式呈现,客户和Mcrosoft部团队已在报告中建立了成功项目管理的关键规则。此外,团队还能够创建自定义报告。仅当以项目的大围上下文查看数据时,才能够精确地报告项目状态。这些优点也是此次毕业
18、设计选用此开发工具的主要原因。1.4论文组织结构全文共由四部分组成:第一章 绪论简述了C语言的发展以与一般编译器的工作原理,并介绍了本系统开发的主要平台和工具与其特点。第二章 C语言词法分析器的总体分析与设计简单的介绍了系统的设计目标与系统要实现的功能。简单的介绍了几个要实现的编译步骤的概念和要完成的任务。第三章 系统的详细设计介绍了系统的基本流程,各个模块的设计思想和核心代码部分。第四章 系统原型的测试对原型系统进行了测试。2 C语言词法分析器的总体分析与设计2.1系统设计目标与功能分析本系统的设计同标是完成一个小型的C语言编译器,由于要完成一个完美的C语言编译器是一件非常复杂的事情,不仅要
19、考虑C语言代码的各种灵活用法,还需要熟悉生成目标代码和生成解析可执行文件的原理,甚至是汇编语言。所以本系统只完成整个编译过程中的词法分析、语法分析、语义分析以与其中的建立符号表和类型检查几个步骤,并不生成最后的可执行文件。另外,本系统包含一个简单易用的用户界面部分,可以进行C语言代码的编写、打开、保存等功能,并且代码视图釆用的是关键字高亮显示技术,使代码的阅读更加直观。而在编译过程中,下部的输出窗门实时显示编译过程中发现的错误等信息,最后显示编译结果。下面分别概括介绍编译过程中的这几个阶段。2.2词法分析词法分析程序又称扫描器,它是编译过程的第一个阶段。其主要任务是从左到右依次描述字符中形式的
20、源程序的各个字符,逐个识别出其中的单词,并将其转换成为部编码形式的单词符号串输出,用于进行语法分析。通常可釆用二元式(CLASS,VALUE)来表示一个单词符号的部编码,其中CLASS为一整数码,用于表示该单词的类别;VALUE则是单词之值(如变量名在符号表中的序号,常数的二进制表示,以与运算符和分隔符的编码,等等。概括的说,扫描器在其工作过程中,一般应完成下列的任务:(1)识别出源程序中的各个单词符号,并将其转换成部编码形式;(2)删除无用的空白字符、回车字符以与其他非实质性字符;(3)删除注释;(4)进行词法检查,报告所发现的错误。此外,视编译工作流程的组织,一些编译程序在进行词法分析时,
21、还要完成将所识别出的标志符登录到符号表的工作。从功能上看,词法分析上把字符币形式的源程序转换为单词形式,然后进行语法分析。从工作方式上看,与语法分析之间存在两种接口方式。一种方式是将词法分析的输出结果存放在一个中间文件上,后面的语法分析程序将它作为输入进行语法分析。另一种方式是将词法分析编成一个子程序,该子程序由语法分析程序调用,当语法分析程序需要一个新的单词时,就调用该子程序,每调用一次,则从源程序字符中中读出一个具有独立意义的单词。本设计釆用前一种方式。2.3语法分析语法分析程序又称分析器,它以单词串形式的源程序作为输入或分析的对象,其基本任务是:报据程序设计语言的语法规则(即定义该语言的
22、前后无关文法,分析源程序的语法结构,即分析如何由这些单词组成该源程序的各种语法成分如下标变量、函数、各种表达式、各种程序语句等,并在分析过程中进行语确性检查,产生部形式的中间代码,供编译程序后续阶段处理。目前,已存在多种语法分析方面的方法,但就产生语法树的方向而言,可大致把它们分为自顶向下分析和自底向上分析两大类。2.3.1自顶向下的语法分析所谓自顶向下的语法分析,只指对于给定输入串w,试图为其构造一个从文法开始符号S到W的最左推导S=W或为自上而下地构造一棵S为报结点的语法树。如果这一尝试得到成功,则证明w是相应文法的一个句子;反之,则不是。在进行自顶向下的语法分析时,通常有两个障碍须加以解
23、决:(1) 由于釆取了最左推导,故当相应文法G中含有左递归的非终结符号时,便会使语法分析过程陷入循环不已的状态;(2)采用最左推导以实现对符号串双的匹配,实际上是一个用文法产生式的诸候选式反复进行试探的过程,这势必会出现大量的回溯,从而导致语法分析效率的大幅度下降。因此,欲实现自顶向下的语法分析,其首要任务是改造程序设计语言的文法,使得文法无左递归且无左公因子,以消除其中的左递归和避免回溯的出现。2.3.2自底向上的语法分析所谓自底向上的语法分析,是指从给定的输入串w=a1a2出发,试图利用相应文法中的产生式,逐步将其归纳为文法的开始符号S,即从叶结点a1,a2,an出发,试图逐步向上构造一个
24、语法树,而其报结点恰好为S0由于上述分析过程通常釆用的是最左归纳,所以实现此种语法分析的关键,是在分析的每一步,如何寻找或确定当前句型的句柄,以与确定将其归纳为什么非终结符号。在自顶向下的分析过程一样,实现自底向上的分析,通常也须使用一个分析栈来存放分析过程中所得的文法符号。分析开始时,在栈底放置一个界符#,然后将输入符号逐个推入栈,一旦在分析栈的栈顶出现句柄,就用相应的产生式的左部去替换这个句柄,即进行一次归纳。由于归纳,便得到了新的桟顶,此时再查看桟的顶部是否形成新的句柄:若是,再进行归纳;反之,则继续将后续的输入符号移入栈,并重复上述过程。若最终能将全部输入符号不包括右界符#移掉,且分析
25、桟中只留下栈底符号#与最后一步归纳所得的文法开始符号,则表明对输入串的分析已经成功。但若全部输入符号已被移掉,而分析栈却不能出现上述格局,则表明输入符号串不是文法的一个句子,其中必定存在语法错误。通常将上述过程称为“移进-归纳”分析,它是最基本的自底叫上分析过程。在此基础上,根据寻找句柄策略的不同,便形成了不同的自底向上的语法分析方法。2.4语义分析在完成了上述过程后编译程序将源程序变成一种部表示形式,这种部表示形式就叫做中间代码或中间语言,它是一种结构简单、含义明确的记号系统。有些快速编译程序几乎没有中间代码,但是为了使目标代码的优化比较容易实现,独立于机器进行,许多编译程序都采用了某种复杂
26、性程度介于源程序语言和机器语言之间的中间语言。2.5符号表符号表的信息栏中登记了每个名字的有关性质,如类型(整、实或布尔等、种属(简单变量、数组、过程等、大小(长度,即所需的存储单元字数)以与相对数(指分配给该名字的存储单元的相对地址)。不同的程序语言对于名字性质的定义各有不同。现今多数程序语言中的名字或者是用说明语句规定其性质,或者采用某种隐含约定(如FORTRAN中凡以字符I,J,N开头的标识符代表整型变量名。有些程序语言,如ADL没有说明语句也没有隐含约定,因此,符号表的性质须到目标程序运行时才能确定下来。但编译时登记在符号表中的各名字的性质只能来自说明语句(包括隐含约定和标号定义或其它
27、引用情形。对于变量名、数组名和过程名而言,它们的信息栏中一般要求有下列信息:种属(简单变量、数组或记录结构等);长度(所需的存储单元数);相对数(存储单元相对地址);若为数组,则记录其情向量);若为记录结构,则把它与其分量按某种形式联系起来;形式参数标志;若在COMMON或EQUVALENCE语句中(FORTRAN语言),把它和有关名字连接在一起;它是否已处理过(即标志位“定义否”);是否对这个变量进行过赋值(包括出现在输人名表中)的标志位;过程是否为程序的外部过程;若为函数,类型是什么;其说明是否处理过;是否递归;形式参数是些什么;为了与实参进行比较,必须把它们的种属、类型信息间过程名联系在
28、一起。对于那些只使图单一符号表的简单语言,对符号表填入新项的工作可由词法分析程序来完成。也就是,当扫描器碰到一个标识符时就对它查填符号表,然后回送它在符号表中的位置作为单词值。但在某些语言中,甚至在同一过程段里允许不同一标识符标识各种不同对象。例如,XYZ既是一个实变量名又是一个标号名,或者又是某个结构型数据的一个分量名。在这种情况下,使用单一符号表或由词法分析程序负责查填符号表都是非常不方便的。因此,釆用多种符号表并让语法语义分析程序负责查填工作是比较妥当的。对于词法分析程序来说,只要求它凡碰到标识符就直接送出此标识符自身即可。符号表息栏的具体组织和安排取决于所翻译的具体语言与目标机器(的字
29、长和指令系统。2.6类型检查为了进行类型检査,编译器需要给源程序的每一个组成成分赋予一个类型表达式。然后,编译器需要确定这些类型表达式是否满足一组逻辑规则。这些规则被称为源语言的类型系统。类型检查具有发现程序中的错误的功能。原则上,如果目标代码在保存元素值的同时保存了元素类型的信息,任何检查都可以动态地进行。一个健全的类型系统可以消除对动态类型检查的需要,因为它可以帮助我们静态地确定这些错误不会在程序运行的时候发生。如果编译器可以保证它接受的程序在运行时刻不会发生类型错误,那么该语言的这个实现就被称为强类型的。3 系统详细设计3.1系统设计基本思路基于C语言源程序分析器的开发在可行性分析的基础
30、上进一步全面、深入的分析,弄清C语言的编译原理与运行状况,在编译程序工作的五个阶段中,每个阶段都必须遵从功能等价的原则。词法规则与语法分析阶段依据的语法规则一同构成了一个语言的语法,而语法则是从形”的角度衡量一个程序是否合法。所以在词法分析阶段,词法规则成为重要的研究对象。词法分析器所处理的对象即词法分析程序的输入数据,实际上是源程序经过编译预处理,去掉多余的符号后而形成的代码,这样给词法分析带来方便。词法分析的过程是线性的从头至尾扫描一遍,复杂度较低,易实现。最后概括出要实现的几个功能流程图如下:图1 功能流程图3.2词法分析模块设计词法分析程序需要完成的任务如下:1识别出源程序的各个语法单
31、位;2剔除无用的空白字符、制表符、回车字符以与其他与输入介质相关的非实质性字符;3过滤掉源程序中的注释;4进行词法检查,如果出现错误,记录出错信总并报告。我们将编译程序的重点放在中间代码生成阶段。词法分析器的功能是输入源程序,输出单词符号。这部分程序主要包括两个类: Class CTlkenizer从一个字符串中(这个把一个文件看作是一个字符串,MFC中Cfile-CString)分离出 一个一个token,配上简单的类型通过NextToken( )返回:#define TT_EOL n#define TT_EOF -1#define TT_INTEGER -2#define TT_REAL
32、-3#define TT_WORD -4#define TT_STRING #define TT_CHAR 得到具体的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, _SI
33、GNED, _VOID, _DEFAULT, _GOTO, _SIZEOF, _VOLATILE, _DO, _IF, _STATIC, _WHILE, _READ, _WRITE, _PRINTF, / operations ASSIGN, PLUS, MINUS, TIMES, DIV, MOD, BITWISE_AND, BITWISE_OR, BITWISE_NOT, LOGICAL_NOT, LT, GT, / interpunctions LPARAN, RPARAN, LBRACE, RBRACE, LSQUARE, RSQUARE, COMMA, DOT, SEMI, / op
34、erations ASSIGN, PLUS, MINUS, TIMES, DIV, MOD, BITWISE_AND, BITWISE_OR, BITWISE_NOT, LOGICAL_NOT, LT, GT, / interpunctions LPARAN, RPARAN, LBRACE, RBRACE, LSQUARE, RSQUARE, COMMA, DOT, SEMI, COLON, / complex operations 11 EQ/* = */, NEQ/* != */, PLUS_PLUS/* + */, MINUS_MINUS/* - */, PLUS_ASSIGN/* +=
35、 */, 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对应,便于查找和反向查找。表1 C关键字表标识符词法:identifier :nondigitidentifier non
36、digitidentifier 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-7 3.3语法分析模块设计在上一节中,实现了词法分析程序的功能。一个字符串形式的源程序经过词法分析,即被转换为一串单词符号。编译程序在完成了词法分析之后,就进入语法分析阶段。语法分析程序以单词形式的源程序作为输入或
37、分析的对象。其基本任务是根据语言的语法规则(即描述该语言的上下文无关文法),分析源程序的语法结构即分析如何将这些单 词组成各种语法成分,如各种表达式、语句、函数或过程等,并在分析过程中,对源程序进行语确性检查。其分析结果是识别出无语法错误的语法成分。其输出形式也有多种。 语法分析模块的核心部分设计如下:Class Cparser:定义CTreeNode,和Tiny例程类似: #define MAX_CHILDREN 3 class CTreeNode public: CTreeNode* child MAX_CHILDREN ; / point to child node CTreeNode*
38、 father; / point to father node CTreeNode* sibling; / point to sibling node int lineno; NodeKind nodekind; union StmtKind stmt; ExpKind exp; kind; enum TokenType type; CString szName; CString szScope; / node function scope BOOL bArray; / is this an array declaration int iArraySize; / array size ; 通过
39、文法与相应规则建立语法树。 Grammar: program-declaration_list declaration_list-declaration_list declaration | declaration declaration-var_declaration | fun_declaration var_declaration-type_specifier ID(, .); | type_specifier ID NUM (, .); type_specifier-int | void | char, actually this step is in declaration_list
40、() fun_declaration-type_specifier ID ( params ) compound_stmt params-param_list | void | empty, void is thought as empty param_list-param_list , param | param param-type_specifier ID | type_specifier ID compound_stmt- loal_declarations statement_list | expression_stmt local_declarations-local_declar
41、ations var_declaration | var_declaration read ( var ) ; write ( expression ) ; printf ( STRING ) ; expression_stmt-expression ; | ; expression-var = expression | logic1_expression logic1_expression-logic1_expression | logic2_expression | logic2_expression logic2_expression- logic2_expression & simpl
42、e_expression | simple_expression simple_expression-additive_expression relop additive_expression | additive_expression relop- = | | = | = | != additive_expression - additive_expression addop term | term addop- + | - term-term mulop logic3_expression | logic3_expression mulop- * | / | % logic3_expres
43、sion- ! logic3_expression | factor factor-( expression ) | var | call | NUM var-ID | ID expression call-ID ( args ) args-args_list | empty args_list-args_list , expression | expression sub_compoundstmt-ID : | call ; | expression_stmt if_stmt-if ( expression ) compound_stmt | if ( expression ) compou
44、nd_stmt else compound_stmt while_stmt-while ( expression ) compound_stmt for_stmt-for ( var = expression ; expression ; var = expression ) compound_stmt goto_stmt-goto ID ; break_stmt-break ; continue_stmt-continue ; return_stmt-return ; | return expression ;基本树形结构:图2 if语句基本树形结构图图3 while语句基本树形结构图图4
45、for语句基本树形结构图图5 合语句基本树形结构图支持的语句与运算: 1)数据类型:int,char void,PCode里支持float,在80x86 ASM里不支持 2)语句:赋值(=),if, while,for,return,break,continue 3)数学运算:+,*,/ 4)关系运算:= =,=,=,!= 5)逻辑运算:&,|,! If6)支持函数的定义、调用7)支持复合语句 8)注释语句:C类型的/* */ 和C+类型的/3.4语义分析模块设计语义分析的任务是根据语义规则对识别出的各种语法成分分析其含义,进行初步翻译。具体来说,其主要任务包括以下几部分:1、确定类型。即确定
46、标识符所对应数据对象的数据类型,这部分工作有时也由词法分析来完成。2、语义检查。动态语义检查在运行时进行,需要生成相应的目标代码;而静态语义检查则在编译时完成,它主要完成以下四个方而。3、识别含义。如果静态语义正确,则进行正真的翻译,即识别程序中各种语法成分的含义,并做相应的语义处理,生成相应的中间代码或直接生成目标代码。语义分析程序是在词法分析和语义分析之后,可以由语法分析程序直接调用相应的语义子程序进行语义处理,也可以先生成语法树的某种表示方法,再进行语义处理。编译的各个阶段都可能发现源程序中的错误。发现错误后如果立即停止编译,往往会降低调式程序的效率,所以应对出现的错误做适当的处理,从而
47、使编译能继续进行。词法分析可以检测出源程序中的非法字符,就好比自然语言中出现的错字和错词。语法分析能够发现程序语句中的各种语法错误,如括号不匹配等。语义分析能够判断运算对象的类型是否匹配,变量是否重复声明或没有声明就使用等错误。任何时刻发现错误,都应该报告错误信息,包括错误出现的位置和错误性质等,为程序员调试程序提供方便。本程序在语义分析部分设计主要包括两方而的容,即建立符号表和类型检查。 建立符号表: 辅助类:Class BucketListRec:主要成员是lineno,记录某个Token(变量或函数名)声明或使用时的行数。主要成员变量:CString name; / variable n
48、ame CString scope; / function scope enum TokenType type; int memloc;/ memory location for variable BOOL bArray; / for array checking LineListRec* lineno; BucketListRec* next;记录每一个变量或函数名的具体情况。主要的类:建立符号表:Class CsymbolTable:主要成员变量:BucketListRec* hashTableSIZE,把Class BucketListRec类的对象通过:函数PrintSynbalTab
49、le(LPCTSRT lpszPathName),输入文件名,通过个递归函数输 出符号表到文件lpszPathName。Class CfunArgsCheck:插入函数参数的类型,以备在下一个步骤中做匹配检测。类型检测:Class CAnalyzer包括两个部分:(1)类型匹配:函数或变量声明时检测是否已声明,如已声明则拋出错误;函数调用或变量使用时检测是否已声明,如未声明则抛出错误。(2)函数调用参数检测:检测函数调用时传入参数的类型与函数声明时参数的类型是否匹配。3.5界面设计考量界面设计需要遵循一个基本理论,其核心容是以已有的界面设计规为指导原则,在不破坏已有的界面交互习惯的基础上修改创
50、新。桌面界面的设计,在最早的个人电脑上就有实施,后来由苹果公司和微软公司反复修改和优化,如今已经逐渐演变成一套系统的设计规,所有软件图形界面,所有而向的指导文档,甚至许多为新型移动设备提供的设计参考都相继遵从,大多数的界面开发工具都默认支持这些规所设定的描述语言和相关容。最重要的是,用户交互界面在多年来透过操作系统和通用软件已经渐渐被使用者熟悉。无论是界面放置和控制方法(例如鼠标点击和快捷键操作)都已成为习惯,如果这种习惯被打破,就会引起客户的抗拒心理,因为他们需要花时间学习和掌握,甚至会降低客户的工作效率。另一方而,通用的界面规不一定能够满足程序语言分析软件的功能要求,因为毕竟客户是软件开发
51、者而不是普通的应用性使用者,因此,需要在界面设计上有一些修改与创新,让编译结果对于客户一目了然。3.5.1可用性原则可用性是源代码分析器设计的根本目的,其概念包含三个方面的容。首先,有用性和有效性,即系统能否实现一定的功能以与交互界面能否有效支持产品功能。其次是交互效率,包括交互过程的安全性、用户绩效、出错频率与严重性、易学性和易记性等因素。最后,用户对交互界面的满意度。(1)可视性可视性是建立目标操作和实际操作之间的对应。用户在对某个对象进行操作时,需要始终能在屏幕上看得见该对象,并与时呈现执行结果。这样“直接”的操作可以使用户避免处理一些琐碎流程。此外,在界面设计时利用隐喻方法,将日常生活
52、中具体、熟悉的概念具像化,使其清晰、明显,更能便于用户对于界面的理解和使用。(2)反馈适当的反馈能令用户随时掌握分析器所处的运行状态。系统的反馈按形式可以分为两类,一类是非文字反馈,另一类是文字反馈。如利用不同颜色的源代码来区分关键字,利用背景的变化或是字体的前景色。反馈必须是直接、简单的。(3)一致性保持界面的一致性能够帮助用户迅速熟悉系统的功能,包括部一致性和外部一致性,体现在字体、图标、色彩、版式、质感、指令音等多个方面。一方面在系统各部分之间保持外观、用词、布局的一致性,另一方面与其它系统、传统习惯与标准之间也需保持一致。界面的设计在很大程度上还要遵循以往的经验与传统,最大限度地与用户
53、预期达成一致。(4)容错性错误是和用户对系统的理解以与使用的熟练程度有关的。系统通过允许犯错机制,鼓励用户勇于尝试。同时使用帮助信息,帮助他们在解决问题的过程中建立对系统的正确理解。此外,界面表达清楚并能适时提供反馈也将有助于避免错误状况的发生。3.5.2可视性原则视觉是人类获取信息的主要途径。可视设计即利用构图原则、对比原则等来科学合理地组织屏幕的色彩、字体、图标等要素,以便引导用户操作。而可视性往往受到显示设备的影响和限制,成为设计中的不确定因素。(1)布局合理一些传统的平面设计理论、公认的优良格式与版面安排在界面设计中同样有效。如利用黄金分割原则设计界面、保持视觉平衡、适当的留白、通过线
54、条或图形引导用户等视觉设计原则,妥善有效地组织界面信总,令用户即使长时间盯着屏幕也可以愉悦地使用。(2)图形简洁在设计中应保持图形的单纯性,除非图形的运纠能够有助于提升界面的使用性。对图 标、窗口、对话框等界面基本组成要素在设计时都应遵循此原则,避免在屏幕上堆积过多窗口、添加过复杂的图标或在对话框中放置过多按钮,使用户产生混淆与困扰。 (3)语义明确图形自身所具有的特殊语义功能可快速地帮助用户理解和使用系统界面,因此在设计时要避免令同一图形产生不同语义。此外,对于加入菜单、对话框或其它界面要素中的非标准符号,其意义需要经过反复确认,使其与用户所期望的代表行为尽可能一致。 (4)色彩协调色彩是设计师向用户传递特定信息的一种方式。通过不同色彩间的有机搭配,可以令界面赏心悦目,但过多的色彩反而会使信息混乱不堪。此外,利用约定俗成的色彩编码效果,如红色代表警告、禁止,灰色代表无作用等,可以令用户使用起来更加方便熟悉。3.5.3系统主要界面组成主程序窗口主要包括菜单栏、工具栏、多文档窗口、状态栏和一个信总输出窗口,如下图:图6系统主要界面图其中的多文档窗口可以同时打开多个C语言源码文件进行编辑,并且编辑界面釆用关键字高亮显示技术,并且输入光标位置实时显示在状态栏上,如下图:图7 编辑界面图信总输出窗口主要显示编译过程中的实时信总,并且错误信总釆用红色字体显示,如
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 四川工业科技学院《国际酒店管理基础中英双语》2023-2024学年第二学期期末试卷
- 贵州体育职业学院《机械产品拆装绘实训》2023-2024学年第二学期期末试卷
- 2025年广东省深圳实验、珠海一中高三下学期周练物理试题含解析
- 新疆理工学院《临床医学整合案例》2023-2024学年第一学期期末试卷
- 北京市密云县名校2025年五月适应考试物理试题含解析
- 2024-2025学年江苏苏州高新区第一中学高三(承智班)上-期中考试物理试题试卷含解析
- 2025全职经纪人合同范本
- 租赁经营地块外墙户外广告牌合同(2025年版)
- 2025BEC指导合同英语特色介绍:掌握合同条款的秘诀
- Unit 3Amazing animals Part B Start to read 第6课时(教学设计)-2024-2025学年人教PEP版(2024)英语三年级上册
- DB32-T 339-2007中华绒螯蟹 一龄蟹种培育
- 大学生职业发展与就业指导(仁能达教育科技公司)学习通测试及答案
- 2025年境外投资融资顾问服务合同范本3篇
- 2024-2025学年人教新目标英语八年级下册期末综合检测卷(含答案)
- 331金属晶体课件高二化学人教版选择性必修2
- 矿山矿石采购合同模板
- 2024年浪潮数字企业技术有限公司社会招聘(105人)笔试核心备考题库及答案解析
- 第47届世界技能大赛江苏省选拔赛竞赛技术文件-混凝土建筑项目
- 国开2024年《数据库运维》形考1-3
- 劳动合同(模版)4篇
- 137案例黑色三分钟生死一瞬间事故案例文字版
评论
0/150
提交评论