版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 化工原料供应招投标报价单
- 农村基础设施建设借款协议书
- 信息技术干部管理方案
- 如何制定合理的薪酬政策
- 合同部市场营销计划
- 旅行保险理赔指南
- 物理实验室电器安全使用指南
- 汽车租赁限行规定
- 菏泽市物业消防安全演练
- 学校建设施工员招聘合同范本
- 滤波电路课件讲解
- 2024-2030年国内铝合金锁行业市场发展分析及发展前景与投资机会研究报告
- 冶金企业的冶炼生产计划三篇
- 课题论文:推动发展培育新质生产力
- 12G614-1 砌体填充墙结构构造
- 燃气经营安全重大隐患判定标准课件
- 小学一年级数学两位数加减一位数竞赛监控模拟题
- CHT 8023-2011 机载激光雷达数据处理技术规范(正式版)
- 检验科进修汇报课件
- 年产10万套新能源车电池托盘和储能箱体项目可行性研究报告
- 低压电工基础知识培训
评论
0/150
提交评论