




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 词法分析器实验报告一. 需求分析1. C语言关键字的子集,以文件形式保存,待判断的C语言语句以文件形式保存。2. 关键字文件包括标识符、基本字、常数、运算符和界符以及相应的种别码。3. 在计算机终端顺次输出各词法单位的种别码和值。若为标识符,其值为该标识符在标识符表中的位置;若为常数,其值为该常数在常数表中的位置;其余值为-1。非法输入单词的种别码为-1,值为-2。4. “单词”定义:C语言中最小的语法单位。“标识符”定义:用户自定义的标志符。5. 测试数据:文本文件为unknowedword.text二. 概要设计1. 单词种别码设计如表一所示: 表一.种别码设计种别码单词种别码单词种别码
2、单词1for6+11)2if7-12=3else8+=13;4+9-=14标识符5-10(15实数其它其它字母初态字母012终态22.单词规划的状态图: A标识符及关键字如图一所示: 数字E其它数字小数点数字终态其它数字+或-E数字小数点数字初态数字01324567 图一.标识符状态转换图B实数如图二所示: 图二.实数状态转换图非、+初态+012终态234 C运算符如图三所示 图三.运算符状态转换图 D其它与运算符雷同,此处略3. 数据结构 knowN 用来存放构成单词符号的字符串; unknowN用来存放待辨别的字符串;chartabTN 用来存放识别出的标识符;keytabMN 用来存放从
3、文件中读入的基本字;consttabT 用来存放识别出的实数。以上均设为全局变量。4.基本操作 Getchar() 初始条件:unknow中读入了一串待辨别的字符串。 操作结果:从unknow读入一个字符到ch中,指向unknow的指针加1。 Getbc() 初始条件:unknow中读入了一串待辨别的字符串。 操作结果:从unknow中读入不是空格的下一个字符。 Concat() 初始条件:know中为字母且ch中为字母,或know中为数字(包括小数点)ch中也为数字。 操作结果:将ch中的字符连接到know中。 Isletter() 初始条件:ch中已经读入了一个新的字符。 操作结果:判断c
4、h中的字符是否字母。 Isdigit() 初始条件:ch中已经读入了一个新的字符。 操作结果:判断ch中的字符是否数字。 Keyword() 初始条件:已判断出know中的字符串为标识符。 操作结果:判断know中的字符串单词是否关键字。 Retract() 初始条件:ch中的字符不能与know中的字符串组成可识别的单词。 操作结果:将ch中的字符退回unknow中,ch为空格。 Insertchar() 初始条件:已判断出know中的字符串为非关键字的标识符。 操作结果:将know中的字符串插入到标识符表chartab中。 Insertconst() 初始条件:已判断出know中的字符串为实
5、数。 操作结果:将know中的字符串插入到实数表consttab中。Aword(int &code) 初始条件:ch中读入了新的字符。 操作结果:判断unknow中指针当前位置开始的单词是否标识符。Real_number(int &code)初始条件:ch中读入了新的字符。 操作结果:判断unknow中指针当前位置开始的单词是否实数。 5.本程序包含的模块WordAnsis模块实现对一个单词的识别功能。Main 模块调用词法分析器,分析文件unknowedword.text中所给出的程序。6.各模块间调用关系 main WordAnsis 各基本操作 三. 详细设计程序源代码如下:#inclu
6、de#include#include#include#define N 10#define M 13#define T 5char ch,knowN,unknowN,chartabTN, keytabMN; float consttabT,*pcos; char *puk,*pk,*pch;FILE *fkeywd,*funknw;void Getchar()ch=*puk; puk+;void Getbc()while(ch= ) Getchar(); void Concat() *pk=ch; pk+;int Isletter() if(ch64)&(ch96)&(ch47)&(ch58)
7、 return 1; else return 0;int Keyword() int i; for(i=0;iM;i+) if(strcmp(know,keytabi)=0) return i+1; return 14;void Retract() ch= ; puk-;int Insertchar() strcpy(pch,know); pch+=N; return (pch-chartab0)/N;int Insertconst() int i,t,t1=-1,t2=-1,t3=-1; float num=(float)0.0,para=(float)0.1,temp=(float)0.0
8、; for(i=0;i=0;i-) para*=10; num+=para*(knowi-48); if(t1!=-1) if(t2=-1) t=t3; else t=t2; para=1; for(i=t1+1;i=t;i-) para*=10; temp+=para*(knowi-48); for(i=0,t=1;itemp;i+) t*=10; if(knowt2+1=-) num/=t; else num*=t; *pcos=num; pcos+; return pcos-consttab;int Aword(int &code) /若是标识符,返回值为该标识符在标识符表中的位置 wh
9、ile(Isletter()|Isdigit()|(ch=_)Concat(); Getchar(); Retract();code=Keyword(); if(code=14) return Insertchar();else return-1;int Real_number(int &code) /若是实数,返回值为该实数在实数表中的位置 int t=0;while(Isdigit()Concat(); Getchar(); t=1; if(ch=.) Concat(); Getchar(); if(!Isdigit()&(t=0) printf(digit error1n);code=-
10、1;Retract();return -2; while(Isdigit()Concat(); Getchar(); if(ch=E)|(ch=e) Concat(); Getchar(); if(ch=+)|(ch=-) Concat();Getchar(); if(!Isdigit() printf(digit error2n);code=-1;return -2; while(Isdigit()Concat(); Getchar(); Retract(); code=15; return Insertconst();int WordAnsis( int &code) int i; for
11、(i=0;iN;i+) knowi=0; pk=know; Getchar(); Getbc(); if(ch=+) Getchar(); if(ch=+) code=6;return -1; else if(ch=) code=8;return -1; elseRetract();code=4;return -1; else if(ch=-) Getchar(); if(ch=-) code=7;return -1; else if(ch=) code=9;return -1; elseRetract();code=5;return -1; else if(ch=() code=10;ret
12、urn -1;/ else if(ch=) code=11;return -1; else if(ch=) code=12;return -1;else if(ch=;) code=13;return -1; else if(Isletter() return Aword(code); else if(Isdigit()|(ch=.) return Real_number(code); else printf(input errorn);code=-1;return -2;void main() int i,t,code,value; if(fkeywd=fopen(keyword.txt,r
13、)=NULL) printf(Cannt open keyword file!); exit(1); if(funknw=fopen(unknowedword.txt,r)=NULL) printf(Cannt open unknowedword file!); exit(1); for(i=0;iM;i+)fscanf(fkeywd,%s %d,&keytabi,&t); if(keytabi0= ) break;fscanf(funknw,%s,&unknow);puk=unknow;pch=chartab0;pcos=consttab;for(;(puk(unknow+N)&(*puk)
14、!=0);)value=WordAnsis(code); printf(The code is %d,the value is %dn,code,value); fclose(fkeywd); fclose(funknw); getch();四. 调试分析1. 编程时将各个基本功能用函数来实现使得程序的条理性增强了,全局变量的使用也使得数据在函数间的传递更加方便。2. 词法分析器中ifelse 的使用有些繁琐,暂时还没有找到更好的解决方法。3. 整个编程过程中除了一些简单的语法和逻辑错误外,没有太大的问题。五. 用户手册1. 本程序的运行环境为DOS操作系统,执行文件为:词法分析器.exe2.
15、 用户可通过将需要识别的程序段放入文件unknowedword.txt中,打开词法分析器.exe可看到运行结果。3. 本程序的目的是识别单词,函数WordAnsis即用户所需,主函数仅用于测试该函数的正确性。 六. 测试结果1. 测试数据:for(i=3.5e2)运行结果: 2. 测试数据:for(*10)运行结果: 七. 附录 源程序文件名清单: 词法分析器.cpp /主程序文件 Keyword.txt /关键字及其种别码文件 Unknowedword /待识别程序文件出师表两汉:诸葛亮先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,
16、盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。宫中府中,俱为一体;陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理;不宜偏私,使内外异法也。侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下:愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰“能”,是以众议举宠为督:愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。 亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之、信之,则汉室之隆,可计日而待也。臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版汽车运输事故理赔合同范本及流程
- 2025版餐饮业微信公众号运营管理合同
- 2025房产证抵押贷款借条合同纠纷调解协议
- 2025版水电安装与设备检修合同
- 2025版施工安全教育培训与认证服务合同
- 2025版山皮石矿山至工地专用运输合同
- 2025版制造业劳动法培训及咨询服务合同
- 2025年度三方协议附加服务保障协议书
- 2025年度汽车租赁合同租赁物丢失与赔偿合同
- 2025年度企业员工绩效考核与激励机制合同
- 养老院房屋租赁合同
- 《酿造工艺教程》课件
- 《社会治理概论》教学大纲
- 2024ESC心房颤动管理指南解读-完整版
- 《捷众电梯推介书》课件
- 《城市轨道交通车辆标志规范》
- 人事工作目标及规划
- 第十三讲-先锋队与中华民族独立解放-中华民族共同体概论教案
- 糖尿病处方点评
- 诊断学-常见症状的诊疗(临床疾病概要课件)
- 咨询类合同合同范例
评论
0/150
提交评论