当前位置:文档之家› 词法分析器的设计与实现

词法分析器的设计与实现

目录一.设计题目 (2)二.设计要求 (2)1. 词法分析器的定义 (2)2. 设计要求 (2)3. 本程序自行规定: (3)三.设计作用与目的 (4)1. 设计作用 (4)2. 设计目的 (4)四.运行环境及工具软件 (4)五.系统设计 (5)1. 系统总体设计 (5)(1)词法分析器的设计 (5)(2)总体设计框图 (6)(3)总程序流程图 (6)2. 各子模块设计 (8)(1)字符的识别 (8)(2)关键字的识别 (8)(3)数字的识别 (8)(4)界符的识别 (10)(5)运算处理 (10)3.相关函数分析 (11)4. 源程序设计 (12)六.实验调试结果 (29)1. 调试工具 (29)2. 调试步骤 (29)3. 调试结果 (29)七.设计中的问题及解决方法 (31)八.设计心得 (32)九.参考文献 (34)词法分析器的设计与实现一.设计题目词法分析器的设计与实现二.设计要求1. 词法分析器的定义词法分析顾名思义就是分词。

它以程序设计语言编制的源程序作为输入,以单词序列作为输出。

分词过程可以通过编制程序自动完成,我们通常称这个分词程序为词法分析器。

词法分析器分析的源程序可以是现有的各类程序设计语言源程序也可以是人为给定的模型语言的源程序。

本文中的源程序为后者。

从词的角度来看,它涉及的内容较为简单,只包括几个较为常用的词类,词类的构成上也适当的作了一些简化。

对词进行分析时,我们是按类型进行分析的。

不同类型的词在后续的分析中所起的作用不同,相应的操作也各有不同,但同种类型中的词虽然单词的构成不同但从宏观上看它们的操作大体一致。

模型语言中的单词可以分为“关键字”、“标识符”、“常数”、“分隔符”、“运算符”几类。

一般,关键字在程序设计语言中人为给定2. 设计要求对给定的程序通过词法分析器能够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。

而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。

另外,如果是算术表达式,则需要通过栈、运算符的优先级比较处理等从而计算出最终结果并显示。

通过此次课程设计要求掌握从源程序文件中读取有效字符的方法,掌握词法分析的实现方法并上机调试编出的词法分析程序。

在处理表达式前,首先设置两个栈:一是运算符栈,用于在表达式处理过程中存放运算符。

在开始时,运算符栈中先压入一个表达式结束符“#”。

二是操作数栈,用于在表达式处理过程中存放操作数。

然后从左到右依次读出表达式中的各个符号(运算符或操作数),每读出一个符号按以下原则进行处理:(1)若读出的是操作数,则将该操作数压入操作数栈,并依次读入下一个符号。

(2)若读出的是运算符,则作进一步判断。

①若读出运算符的优先级大于运算符栈顶运算符的优先级,则将读出的运算符压入运算符栈,并依次读下一个符号。

②若读出的是表达式结束符“#”,且运算符栈栈顶的运算符也是表达式结束符“#”,则表达式处理结束,最后的计算结果在操作数栈的栈顶位置。

③若读出运算符的优先级不大于运算符栈栈顶运算任的优先级,则从操作数栈连续退出两个操作数,并从运算符栈退出一个运算符,然后作相应的运算(运算符为刚从运算符栈退出的运算符,运算对象为刚从操作数栈退出的两个操作数),并将运算结果压入操作栈。

3. 本程序自行规定:⑴关键字:"auto","break","case","char","const","continue","default","do","double","else","enum","extern","float","for","goto","if","int","long","return","short","signed","sizeof","static","struct","switch"……⑵运算符:"+","-","*","/","="……⑶界符:"{","}","[","]",";",",",".","(",")",":"⑷数字:'0'~'9'⑸其他标记如字符串,表示以字母开头的标识符。

⑹空格、回车、换行符跳过。

在屏幕上显示如下:( +, 运算符)( ;, 界符)(auto , 关键字)( 1 , 无符号整数)( a , 普通标识符)(continue , 关键字)三.设计作用与目的1. 设计作用用高级语言编写一个词法分析器,使之能识别输入串,并把分析结果(单词符号,标识符,关键字等等)输出。

输入源程序,输入单词符号,本词法分析器可以辨别关键字、标识符、常数、运算符号和某些界符,运用了文件读入来获取源程序代码,再对该源程序代码进行词法分析,这就是词法分析器的基本功能。

当词法分析器调用预处理子程序处理出一串输入字符放进扫描缓冲区之后,分析器就从此缓冲区中逐一识别单词符号。

当缓冲区里的字符串被处理完之后,它又调用预处理子程序来处理新串。

2. 设计目的1)熟悉词法分析的基本原理,词法分析的过程,以及词法分析中要注意的一些问题;2)通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;3)复习高级语言,进一步加强用高级语言来解决实际问题的能力;4)提高词法分析方法的实践能力;5)理解如何理论联系实际以及明白理论与实际的差别。

四.运行环境及工具软件Windows XP环境,Microsoft visual C++ 6.0版,512M内存,80G硬盘容量。

VC++是微软公司开发的一个IDE(集成开发环境),换句话说,就是使C++的一个开发平台.有些软件就是这个编出来的vc++是Windows平台上的C++编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较大。

五.系统设计1. 系统总体设计(1)词法分析器的设计词法分析在教学上的主要应用是对源程序进行分词同时验证词的合性,词法分析的输入是给定的模型语言,输出为单词序列。

输入的源程序可以看成是一个字符串序列,通过把源程序看作字符串序列就可以采用形式语言的一些现有理论处理相关的编译题。

分词的输出为单词序列,单词是一个有共同含义的字符集。

由于程序设计语言中通常使用空格来分割不同的词,因此初学者在理解这一概念时可以简单的把空格分隔开的字符串认为是一个单词。

词法分析器设计时,输入的源程序以文件的形式存储在外部。

主控程序通过打开文件调用待分析的源程序。

程序设计时采用一字一码的形式处理,标志符为一类,不同的标志符通过值区别。

常数只给出具体的值即可。

根据以上的分析可以相应的设计如下的存储结构。

关键字可以设计为一个预先存储好的表格。

其设计的主要思路为:先让用户输入单词或字符串,而且是一个字一个字的读取,直到#束,且要全部打印出代码。

着便开始进行分析,先是依次判断每一个字符,空白就跳到下一个,次往下类推,道不是空白为止。

后再读入一个字符,如果是字母,就继续读入下一个,只要遇到是字母或者是数字的时候,都继续往下读,而且读入的字符都依次地保存在一个字符串当中,直到不是字母或者是数字为止。

这时侯来查找关键字表,如果有关键字的话,则作为关键字输出,如果没有,就作为字符串输出。

的话,如果是数字,也继续读入,如果是数字或者是小数点,依然继续往下读,也依次保存在字符串中,直到不是数字或小数点为止,最终这里得到就是常数。

要注意的是,在这里如果中途遇到运算符和界符,也依然要做和前面关键字、字符串或者是常数类似的分析,如果输入是一个正确的算术表达式则按照如下操作进行:(1)若读出的是操作数,则将该操作数压入操作数栈,并依次读入下一个符号。

(2)若读出的是运算符,则作进一步判断。

①若读出运算符的优先级大于运算符栈顶运算符的优先级,则将读出的运算符压入运算符栈,并依次读下一个符号。

②若读出的是表达式结束符“#”,且运算符栈栈顶的运算符也是表达式结束符“#”,则表达式处理结束,最后的计算结果在操作数栈的栈顶位置。

③若读出运算符的优先级不大于运算符栈栈顶运算任的优先级,则从操作数栈连续退出两个操作数,并从运算符栈退出一个运算符,然后作相应的运算(运算符为刚从运算符栈退出的运算符,运算对象为刚从操作数栈退出的两个操作数),并将运算结果压入操作栈。

这就是整个词法分析器的设计思想。

(2)总体设计框图总体设计框图如下:图1.总体设计框图(3)总程序流程图总程序流程图如下:图2.总体流程图2. 各子模块设计(1)字符的识别判断输入的字符是否为字符,若为字符则将其拼凑成一个单词在往下进行判断,若不为字符则则判断其是否为数字,其子模块程序流程图1如下:(2)关键字的识别判断输入的单词是否为关键字,若为关键字则返回它的编码,若不为关键字则判断其是否为运算符,其子模块程序流程图如图2所示:(3)数字的识别判断输入的字符是否为数字,若为数字则返回它的编码,若不为数字则判断其是否为运算符,其子模块程序流程图如图3所示:(4)界符的识别判断输入的字符是否为界符,若为数字则break,若不为数字则将搜索指示器回调一个字符位置,将ch置为空白字符,其子模块程序流程图如下所示:(5)运算处理3.相关函数分析⏹int i=0,j=0,k=0,t=0; //搜索指示器⏹char ch; //存放最新读入的原程序字符⏹void GetChar(); //将下一个字符读入ch中,搜索指示器前移一字符位⏹void GetBC(); //检查ch中的字符是否为空白,若是则调用Getchar直至ch中进入一个非空白字符⏹void Concat(); //将ch中的字符连接到strToken之后⏹bool IsLetter(); //判断ch中的字符是否为字符bool IsDigit(); //判断ch中的字符是否为数字int Reserve(); //对strToken中的字符串查找保留字表,若它是一个保留字●则返回它的编码,否则返回-1值。

相关主题