词法分析程序的构造_第1页
词法分析程序的构造_第2页
词法分析程序的构造_第3页
词法分析程序的构造_第4页
词法分析程序的构造_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

1、词法分析程序的构造通达学院题专学班指指日 II 词法分析程序的构造 业 生 姓 名 级 学 号 导 教 师 导 单 位 计算机学院 计算机科学与技术系 期 专业课程设计目:词法分析程序的构造一、课题内容和要求通过状态转换图构造 C或者PASCALS言子集的词法分析程序。原理解析:选取语言,例如选取了C语言,选取其中一个子集,例如包含了部分关键字 main、float 、if 、 for 等等,特殊符号 ( 、 的标识符变量以及部分常量等,采用编译原理词法分析中有穷自动 机的思想构建出该语言子集的状态转换图,并编码实现。基本要求:( 1)将选取的语言子集编写一个简单程序,放在一个文本文件中; (

2、2)要将一个个单词区分清楚并归类 (例如 for 属于关键字 ) 。二、需求和思路分析本课题是用C+语言设计,选取的是 C语言子集。编写对简单语言进行词法分 析的词法分析程序。1 、识别子集中的关键字、标识符、常数、运算符和分界符等。2 、对子集中的字符类型进行归类三、概要设计(1)状态转换图:(2)核心代码:1 )定义:char cbuffer;char*keyword14=if,else,for,while,do,float,return,break,con tinue,int,void,main,const,printf; / 关键字char *border8= , , ; , , ,

3、( , ) ,:=,.; /char *arithmetic6=+ , - , * , / , + , -; /char *relation7= , = , = ,!=;分隔符运算符char *lableconst80;2 )函数调用: search(char searchchar,int wordtype)/alphaprocess(char buffer) / digitprocess(char buffer) / otherprocess(char buffer) / main()/ 主函数3) 状态类型: 状态转换图的形式: 每个状态对应一个带标号的查找类型 字符处理过程 数字处理过程

4、 分隔符、运算符、逻辑运算符等case 语句 转向边对应 goto 语句switch (wordtype)case 1: for (i=0;iif (strcmp(keywordi,searchchar)=0) return(i+1);return(0);case 2:for (i=0;iif (strcmp(borderi,searchchar)=0) return(i+1);return(0);/ 关系运算符 / 标识符case 3:for (i=0;iif (strcmp(arithmetici,searchchar)=0) return(i+1);return(0);case 4:fo

5、r (i=0;iif (strcmp(relationi,searchchar)=0)return(i+1);return(0);case 5:for (t=40;tif (strcmp(searchchar,lableconstt)=0)/ 判断该常数是否已出现过 return(t+1);lableconstt-1=(char *)malloc(sizeof(searchchar); / 为新的元素分配内存 空间strcpy(lableconstt-1,searchchar); / 为数组赋值 lableconst指针数组名constnum+; /常数个数自加return(t);case 6

6、:for (i=0;i判断标识符是否已出现过if (strcmp(searchchar,lableconsti)=0) /return(i+1);lableconsti-1=(char *)malloc(sizeof(searchchar);strcpy(lableconsti-1,searchchar);lableconstnum+; / 标识符个数自加return(i);5) 单字符判断if (otypetp=search(othertp,3) / 判断该运算符是否是由连续的两个字符组成的coutfp.get(buffer);goto out;else / 单字符逻辑运算符othertp1

7、=0;coutIIgoto out;四、详细设计实验环境: visual C+6.0 win7 系统源程序代码:#include#include#include#include#includeusing namespace std;ifstream fp(09002801.txt,ios:in);char cbuffer;char *keyword14=if,else,for,while,do,float,return,break,continu e,int,void,main,const,printf; / 关键字分隔符运算符char *border8= , , ; , , , ( , )

8、,:=,.; /char *arithmetic6=+ , - , * , / , + , -; /char *relation7= , = , = ,!=; /关系运算符 char*lableconst80; /标识符int constnum=40;int lableconstnum=0; / 统计常数和标识符数量int row=1;int search(char searchchar,int wordtype)int i=0,t=0;switch (wordtype)case 1: for (i=0;iif (strcmp(keywordi,searchchar)=0)return(i+1

9、);return(0);case 2:for (i=0;iif (strcmp(borderi,searchchar)=0)return(i+1);return(0);case 3:for (i=0;iif (strcmp(arithmetici,searchchar)=0)return(i+1);return(0);case 4:for (i=0;iif (strcmp(relationi,searchchar)=0)return(i+1);return(0);case 5:for (t=40;tif (strcmp(searchchar,lableconstt)=0)/ 判断该常数是否已出

10、现过return(t+1);lableconstt-1=(char *)malloc(sizeof(searchchar); / 为新的元素分配内存空 间strcpy(lableconstt-1,searchchar); / 为数组赋值 lableconst 指针数组名 constnum+; / 常数个数自加return(t);case 6:for (i=0;i判断标识符是否已出现过if (strcmp(searchchar,lableconsti)=0) /return(i+1);lableconsti-1=(char *)malloc(sizeof(searchchar); strcpy(

11、lableconsti-1,searchchar);lableconstnum+; / 标识符个数自加return(i);default:coutchar alphaprocess(char buffer) / 字符处理过程int atype;int i=-1;char alphatp20;while (isalpha(buffer)|(isdigit(buffer)/ 这两个函数分别是判字符和判数字函数位于 ctype.h 中 alphatp+i=buffer;fp.get(buffer);alphatpi+1=0;/ 在末尾添加字符串结束标志if (atype=search(alphatp

12、,1)coutelseatype=search(alphatp,6); /coutreturn(buffer);char digitprocess(char buffer) /int i=-1;char digittp20;int dtype;while (isdigit(buffer)digittp+i=buffer;fp.get(buffer);digittpi+1=0;dtype=search(digittp,5);coutreturn(buffer);char otherprocess(char buffer) /int i=-1;标识符数字处理过程分隔符、运算符、逻辑运算符等char

13、 othertp20;int otype,otypetp;othertp0=buffer;othertp1=0;if (otype=search(othertp,3)fp.get(buffer);othertp1=buffer;othertp2=0;if (otypetp=search(othertp,3) / 判断该运算符是否是由连续的两个字符组成的 coutgoto out;else / 单字符逻辑运算符othertp1=0;coutif (otype=search(othertp,4) / 关系运算符fp.get(buffer);othertp1=buffer;othertp2=0;if

14、 (otypetp=search(othertp,4) / 判断该关系运算符是否是由连续的两个字符组 成的 coutgoto out;else / 单字符逻辑运算符othertp1=0;coutif (buffer=!) /= 的判断fp.get(buffer);if (buffer=)/coutfp.get(buffer);goto out;elseif (otype=search(othertp,2) / 分界符coutfp.get(buffer);goto out;if (buffer!=n)&(buffer!= )coutfp.get(buffer);out:return(buffer

15、);void main()printf(= 词法分析器 =n); int i;for (i=0;ilableconsti= ;/ 用于保存标识符if (!fp)coutelsefp.get (cbuffer);while (!fp.eof()if(cbuffer=n)row+;fp.get(cbuffer);else if (isalpha(cbuffer)cbuffer=alphaprocess(cbuffer);else if (isdigit(cbuffer) cbuffer=digitprocess(cbuffer);elsecbuffer=otherprocess(cbuffer);

16、couti=0;while(icoutcoutcoutgetchar();3)程序流程图:五、测试数据及其结果分析若源程序中没有 09002801.txt 文档,则会出现如下提示:若文档中包含 09002801.txt 文档,文档代码为:运行后结果如下:六、调试过程中的问题在代码调试过程中,由于代码编写时将主函数 main 和文件打开的顺序颠倒,导致未 写入源文档也会提示词法分析结束,实际上并未进行词法分析过程,应该提示文件打开错, 返回检查。在重新修改之后能够达到理想要求编译运行。七、专业课程设计总结通过这次实验,我对编译原理关于词法分析有了进一步的了解,能够把编译原理 中有穷自动机的理论知识应用于实验中。通过这次语义分析的实验 , 我对高级语言的学习有了更深的认识,了解得更透彻我了 解了高级语言转化为目标代码或汇编指令的过程。对今后的学习将起很大的作用,对以后 的编程有很大的帮助。本次实验通过查找书本和网上搜索了解了大致地实验思路,虽然只 是完成了一个简单的程序,但在组织程序结构中学到了很多,加深了对编

温馨提示

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

评论

0/150

提交评论