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

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上专心-专注-专业通达学院专业课程设计 II题 目: 词法分析程序的构造 专 业 计 算 机 通 信 学 生 姓 名 班 级 学 号 28 班 指 导 教 师 徐 佳 指 导 单 位 计算机学院计算机科学与技术系日 期 2012.11.12-2012.11.23 精选优质文档-倾情为你奉上专心-专注-专业教教师师评评语语同学出勤率(满勤、较高、一般,较低),学习态度(端正、较端正、一般、较差),程序设计基础(好、较好、一般、较差) ,演示程序(已经、没有)达到了基本要求,算法设计(好、较好、一般) ,界面友好程度(好、较好、一般) ,答辩过程中回答问题(准确、较准确、错

2、误率较高) ,撰写报告格式(规范、一般)、内容(丰满、简单) 、表述(清晰、一般、不清楚), (圆满、较好、基本)完成了课题任务。 教师签名:教师签名: 年年 月月 日日成成 绩绩 评评 定定备备 注注精选优质文档-倾情为你奉上专心-专注-专业 词法分析程序的构造词法分析程序的构造一、一、 课题内容和要求课题内容和要求通过状态转换图构造 C 或者 PASCAL 语言子集的词法分析程序。原理解析:选取语言,例如选取了 C 语言,选取其中一个子集,例如包含了部分关键字 main、float、if、for 等等,特殊符号( 、=、+等等,特殊定义的标识符变量以及部分常量等,采用编译原理词法分析中有穷

3、自动机的思想构建出该语言子集的状态转换图,并编码实现。基本要求:(1)将选取的语言子集编写一个简单程序,放在一个文本文件中;(2)要将一个个单词区分清楚并归类(例如 for 属于关键字)。二、需求和思路分析二、需求和思路分析本课题是用 C+语言设计,选取的是 C 语言子集。编写对简单语言进行词法分析的词法分析程序。1、识别子集中的关键字、标识符、常数、运算符和分界符等。2、对子集中的字符类型进行归类三、概要设计三、概要设计(1)状态转换图: 精选优质文档-倾情为你奉上专心-专注-专业(2)核心代码: 1)定义:char cbuffer;char*keyword14=if,else,for,wh

4、ile,do,float,return,break,continue,int,void,main,const,printf; /关键字char *border8= , , ; , , , ( , ) ,:=,.; /分隔符char *arithmetic6=+ , - , * , / , + , -; /运算符char *relation7= , , = , = ,!=; /关系运算符 char *lableconst80; /标识符2)函数调用:search(char searchchar,int wordtype)/查找类型alphaprocess(char buffer) /字符处理过程

5、digitprocess(char buffer) /数字处理过程otherprocess(char buffer) /分隔符、运算符、逻辑运算符等main()/主函数3) 状态类型:状态转换图的形式: 每个状态对应一个带标号的 case 语句 转向边对应 goto 语句switch (wordtype) case 1: for (i=0;i=13;i+) /关键字 if (strcmp(keywordi,searchchar)=0) return(i+1); return(0); case 2: for (i=0;i=7;i+) /分隔符 if (strcmp(borderi,searchc

6、har)=0) return(i+1); return(0);精选优质文档-倾情为你奉上专心-专注-专业 case 3: for (i=0;i=5;i+) /运算符 if (strcmp(arithmetici,searchchar)=0) return(i+1); return(0); case 4: for (i=0;i=6;i+) /关系运算符 if (strcmp(relationi,searchchar)=0) return(i+1); return(0); case 5: for (t=40;t=constnum;t+) /常数 if (strcmp(searchchar,labl

7、econstt)=0)/判断该常数是否已出现过 return(t+1); lableconstt-1=(char *)malloc(sizeof(searchchar); /为新的元素分配内存空间 strcpy(lableconstt-1,searchchar); /为数组赋值 lableconst指针数组名 constnum+; /常数个数自加 return(t); case 6: 精选优质文档-倾情为你奉上专心-专注-专业 for (i=0;i=lableconstnum;i+) if (strcmp(searchchar,lableconsti)=0) /判断标识符是否已出现过 retu

8、rn(i+1); lableconsti-1=(char *)malloc(sizeof(searchchar); strcpy(lableconsti-1,searchchar); lableconstnum+; /标识符个数自加 return(i); 5) 单字符判断 if (otypetp=search(othertp,3) /判断该运算符是否是由连续的两个字符组成的 coutrow: row String= othertpttt运算符endl; fp.get(buffer); goto out; else /单字符逻辑运算符 othertp1=0; coutrow: row Strin

9、g= othertpttt逻辑运算符endl; goto out; 四、详细设计四、详细设计实验环境:visual C+6.0 win7 系统源程序代码:#include #include #include #include #include 精选优质文档-倾情为你奉上专心-专注-专业using namespace std;ifstream fp(.txt,ios:in);char cbuffer;char *keyword14=if,else,for,while,do,float,return,break,continue,int,void,main,const,printf; /关键字ch

10、ar *border8= , , ; , , , ( , ) ,:=,.; /分隔符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;i=

11、13;i+) /关键字 if (strcmp(keywordi,searchchar)=0) return(i+1); return(0); case 2: for (i=0;i=7;i+) /分隔符 if (strcmp(borderi,searchchar)=0) return(i+1); return(0); case 3: for (i=0;i=5;i+) /运算符 if (strcmp(arithmetici,searchchar)=0) return(i+1); return(0);精选优质文档-倾情为你奉上专心-专注-专业 case 4: for (i=0;i=6;i+) /关系

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

13、自加 return(t); case 6: for (i=0;i=lableconstnum;i+) if (strcmp(searchchar,lableconsti)=0) /判断标识符是否已出现过 return(i+1); lableconsti-1=(char *)malloc(sizeof(searchchar); strcpy(lableconsti-1,searchchar); lableconstnum+; /标识符个数自加 return(i); default:cout错误!; char alphaprocess(char buffer) /字符处理过程 int atype;

14、精选优质文档-倾情为你奉上专心-专注-专业 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,1) coutrow: row String= alphatpttt关键字endl; else atype=search(alphatp,6); /标识符 coutrow: row Stri

15、ng= alphatpttt标识符endl; return(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); coutrow: row String= digittpttt数字endl; return(buffer);char otherprocess(char buffer) /分隔符、

16、运算符、逻辑运算符等 int i=-1; char 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) /判断该运算符是否是由连续的两个字符组成的 coutrow: row String= othertpttt运算符endl; fp.get(buffer); goto out; el

17、se /单字符逻辑运算符 othertp1=0; coutrow: row String= othertpttt逻辑运算符endl; goto out; if (otype=search(othertp,4) /关系运算符 fp.get(buffer); othertp1=buffer; othertp2=0; if (otypetp=search(othertp,4) /判断该关系运算符是否是由连续的两个字符组成的 coutrow: row String= othertpttt关系运算符endl; fp.get(buffer); goto out; else /单字符逻辑运算符 othert

18、p1=0; coutrow: row String= othertpttt逻辑运算符endl; goto out; if (buffer=!) /=的判断 fp.get(buffer); if (buffer=) /cout!= (2,2)n; fp.get(buffer); goto out;精选优质文档-倾情为你奉上专心-专注-专业 else if (otype=search(othertp,2) /分界符 coutrow: row String= othertpttt分隔符endl; fp.get(buffer); goto out; if (buffer!=n)&(buffer

19、!= ) cout错误!非法字符为:tttbufferendl; fp.get(buffer); out: return(buffer);void main()printf(=词法分析器=n); int i; for (i=0;i=50;i+) lableconsti= ;/用于保存标识符 if (!fp) cout源文件无法打开,请检查!endl; else fp.get (cbuffer); while (!fp.eof() if(cbuffer=n) row+; fp.get(cbuffer); else if (isalpha(cbuffer) cbuffer=alphaprocess

20、(cbuffer); else if (isdigit(cbuffer)精选优质文档-倾情为你奉上专心-专注-专业 cbuffer=digitprocess(cbuffer); else cbuffer=otherprocess(cbuffer); cout标识符个数是:lableconstnum分别是endl; i=0; while(ilableconstnum) coutlableconsti+ ; coutendl; cout词法分析结束!n; getchar(); (3)程序流程图:精选优质文档-倾情为你奉上专心-专注-专业五、测试数据及其结果分析五、测试数据及其结果分析 若源程序中没有.txt 文档,则会出

温馨提示

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

评论

0/150

提交评论