欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    词法分析器实验报告示例(共9页).doc

    • 资源ID:14041083       资源大小:88.50KB        全文页数:9页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    词法分析器实验报告示例(共9页).doc

    精选优质文档-倾情为你奉上 词法分析器实验报告一. 需求分析1. C语言关键字的子集,以文件形式保存,待判断的C语言语句以文件形式保存。2. 关键字文件包括标识符、基本字、常数、运算符和界符以及相应的种别码。3. 在计算机终端顺次输出各词法单位的种别码和值。若为标识符,其值为该标识符在标识符表中的位置;若为常数,其值为该常数在常数表中的位置;其余值为-1。非法输入单词的种别码为-1,值为-2。4. “单词”定义:C语言中最小的语法单位。“标识符”定义:用户自定义的标志符。5. 测试数据:文本文件为unknowedword.text二. 概要设计1. 单词种别码设计如表一所示: 表一.种别码设计种别码单词种别码单词种别码单词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 用来存放从文件中读入的基本字;consttabT 用来存放识别出的实数。以上均设为全局变量。4.基本操作 Getchar() 初始条件:unknow中读入了一串待辨别的字符串。 操作结果:从unknow读入一个字符到ch中,指向unknow的指针加1。 Getbc() 初始条件:unknow中读入了一串待辨别的字符串。 操作结果:从unknow中读入不是空格的下一个字符。 Concat() 初始条件:know中为字母且ch中为字母,或know中为数字(包括小数点)ch中也为数字。 操作结果:将ch中的字符连接到know中。 Isletter() 初始条件:ch中已经读入了一个新的字符。 操作结果:判断ch中的字符是否字母。 Isdigit() 初始条件:ch中已经读入了一个新的字符。 操作结果:判断ch中的字符是否数字。 Keyword() 初始条件:已判断出know中的字符串为标识符。 操作结果:判断know中的字符串单词是否关键字。 Retract() 初始条件:ch中的字符不能与know中的字符串组成可识别的单词。 操作结果:将ch中的字符退回unknow中,ch为空格。 Insertchar() 初始条件:已判断出know中的字符串为非关键字的标识符。 操作结果:将know中的字符串插入到标识符表chartab中。 Insertconst() 初始条件:已判断出know中的字符串为实数。 操作结果:将know中的字符串插入到实数表consttab中。Aword(int &code) 初始条件:ch中读入了新的字符。 操作结果:判断unknow中指针当前位置开始的单词是否标识符。Real_number(int &code)初始条件:ch中读入了新的字符。 操作结果:判断unknow中指针当前位置开始的单词是否实数。 5.本程序包含的模块WordAnsis模块实现对一个单词的识别功能。Main 模块调用词法分析器,分析文件unknowedword.text中所给出的程序。6.各模块间调用关系 main WordAnsis 各基本操作 三. 详细设计程序源代码如下:#include<stdio.h>#include<conio.h>#include<stdlib.h>#include<string.h>#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(ch>64)&&(ch<91)|(ch>96)&&(ch<123) return 1; else return 0;int Isdigit() if(ch>47)&&(ch<58) return 1; else return 0;int Keyword() int i; for(i=0;i<M;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; for(i=0;i<M;i+) if(knowi='.') t1=i; else if(knowi='e')|(knowi='E') t2=i; else if(knowi='0') t3=i;break; if(t1!=-1) i=t1; else if(t2!=-1) i=t2; else i=t3; for(i-;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*=(float)0.1; num+=para*(knowi-48); if(t2!=-1) if(knowt2+1='-')|(knowt2+1='+') t=t2+2; else t=t2+1; para=(float)0.1; for(i=t3-1;i>=t;i-) para*=10; temp+=para*(knowi-48); for(i=0,t=1;i<temp;i+) t*=10; if(knowt2+1='-') num/=t; else num*=t; *pcos=num; pcos+; return pcos-consttab;int Aword(int &code) /若是标识符,返回值为该标识符在标识符表中的位置 while(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=-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(i=0;i<N;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;return -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")=NULL) printf("Cann't open keyword file!"); exit(1); if(funknw=fopen("unknowedword.txt","r")=NULL) printf("Cann't open unknowedword file!"); exit(1); for(i=0;i<M;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)!='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. 用户可通过将需要识别的程序段放入文件unknowedword.txt中,打开词法分析器.exe可看到运行结果。3. 本程序的目的是识别单词,函数WordAnsis即用户所需,主函数仅用于测试该函数的正确性。 六. 测试结果1. 测试数据:for(i=3.5e2)运行结果: 2. 测试数据:for(*10)运行结果: 七. 附录 源程序文件名清单: 词法分析器.cpp /主程序文件 Keyword.txt /关键字及其种别码文件 Unknowedword /待识别程序文件出师表:先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。宫中府中,俱为一体;陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理;不宜偏私,使内外异法也。侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下:愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰“能”,是以众议举宠为督:愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。 亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之、信之,则汉室之隆,可计日而待也。臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明;故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏。臣不胜受恩感激。今当远离,临表涕零,不知所言。专心-专注-专业

    注意事项

    本文(词法分析器实验报告示例(共9页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开