词法分析实验报告_第1页
词法分析实验报告_第2页
词法分析实验报告_第3页
词法分析实验报告_第4页
词法分析实验报告_第5页
免费预览已结束,剩余7页可下载查看

付费下载

下载本文档

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

文档简介

1、一、实验目的:词法分析器通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。二、实验要求如源程序为C语言。输入如下一段:main ()int a,b; a = 10;b = a + 20;#要求输出如右图。要求:1、将单词分为五种识另U关键字: main、if、int、for、while、do、return、break、continue ;单词

2、种别码为1。标识符;单词种别码为 2。常数为无符号整形数;单词种别码为运算符包括:+、-、*、/、=、单词种别码为4。分隔符包括:,、;、(、);2、使用一符一种的分法关键字、运算符和分界符可以每一个均为一种标识符和常数仍然一类一种三、实验内容1、功能描述改程序是一个实现词法分析的功能,能识别5种单词,其他单词报错。2、程序结构描述int lsKey(char *Word)关键字匹配函数,查询是否为关键字,若是,返回值为1,否则为0。int IsAlpha(char c)查看是否为字母,若是,返回值为1,否则为0。int IsNum(char c)查看是否为数字,若是,返回值为1,否则为0。v

3、oid sca nn er(FILE *fp)字母、fseek3。+、=、=、!=;单词种别码为5。(1,main ”(5,”()(5,”)(5,”)(1,”i nt ”)(2,” a”)(5,”,”)(2,” b”)(5,”;”)(2,a ”(4,”=”)(3,”10”)(5,”;”)(2,” b”)(4,”=”)(2,a ”(4,(3,”20”)(5,(5,查看是否为字母,若是,返回值为查看是否为数字,若是,返回值为扫描函数,扫描程序中的字符串并调用上述三种函数检查是否是数字,是否是关键字,并输出。(fp,-1,1)回退一个字符。(fp)从数据流中区下一个字符。文件打开函数,返回指向文件第

4、一个字符的指针fgetc fopen四、实验结果 测试内容为 main ()int a,b; a = 10;b = a + 20;#结果1 "E:wgGii4!fln<vMlnigv. ese*a词法分析结果远下:丄.main >苫a"1 ” 1 nt、”弓 :2.b> :5.;> :2.a>:4厂):5.;>:2.b> :4严) :2.a>:4*+ ):3.Z0) :5.;> :5.>测试代码为void mai n() int a,b;if(a = 10;) b += 20; c=%;#结果为农 TcgDiigc

5、hqnfTJDotnigv. axo*建 K WW W M W K M WM K iCMKll: K W K<1<5<2<b<2<b<5<2<4<3<C<5<2<4<3<2uo id main? <Aint > d>li>;>If ><>-J io>Jh>20>gJ£无注逞搠宇箝<b<5测试代码main ()int a,b;if(a <= "10") b += 20;c=%; retur

6、n 0;#结果<2,a)<2,h> <5,;> <l,if ?<5><)<2,a>£5 J)<5, >> <Z,b><3,20><5,;) <Z,c)别别 识识 £ £ <五、实验过程记录1因为用到回退函数 fseek (),而以前没有用过这个函数,所以开始时很苦恼,不知道如 何回退一个字符,后来问了同学,才明白原来有这么一个函数,顿时豁然开朗。2、本次试验中word20保存字符串时,不能正确保存,总是出错,原因是 while(lsNum(

7、ch)|lsAlp ha(ch)Wordi=ch;i+;ch=fgetc(fp);中,i+与Wordi=ch;次序不对,后来多次思索,发现问题。六、实验总结本次实验花了将近一个下午才完成。在纸上设计的时间大约40分钟,剩下的时间是录入和调试。本次实验使我认识到,一段时间搁置,不编程序,水平会下降,好多有关c语言的知识会忘掉,所以以后我会经常写写程序。另外,通过本次实验,我又进一步加深对词法分析原理的理解。总的来说,获益匪浅! 附录#in clude<stri ng.h>#in clude<stdio.h> #in clude<stdlib.h>#in clu

8、de<ct yp e.h>#in clude<iostream.h>Char*Key9="void","mai n",”i nt","if","the rr,"else","return","break","co nti nue "char ch;/存储识别出的单词流int IsAl pha(char c) /判断是否为字母if(c<='z') &&(c>='a

9、')|(c<='Z')&&(c>='A') return 1; else return 0;int IsNum(char c)/if(c>='0'&&c<='9') return 1;else return 0;int IsKey(char *Word) /int m,i;for(i=0;i<8;i+)if(m=strcm p( Word,Keyi)=0)return 1;/判断是否为数字识别关键字函数return 0;void scann er(FILE *f

10、p)char Word20='0'/扫描函数char ch;int i,c;ch=fgetc(fp); /if(IsAl pha(ch)Word0=ch;ch=fgetc(fp);i=1;while(lsNum(ch)|lsAI pha(ch) /Wordi=ch;i+;ch=fgetc(fp);Wordi='0'fseek(fp,-1,1);c=lsKey(Word);/'0'获取字符,指针fp并自动指向下一个字符 判断该字符是否是字母判断该字符是否是字母或数字代表字符结束/if(c=0) cout<<"(2,"

11、<<Word<<')'<<e ndl;/ elsecout<<"(1,"<<Word<<')'<<e ndl;/(空格)回退一个字符判断是否是关键字 不是关键字输出关键字else/开始判断的字符不是字母if(lsNum(ch)Word0=ch; ch=fgetc(fp); i=1;while(IsNum(ch) Wordi=ch; i+;ch=fgetc(fp); Wordi='0' fseek(fp,-1,1);/判断是否是数字回退cout&

12、lt;<"(3,"<<Word<<')'<<e ndl; else/开始判断的字符不是字母也不是数字Word0=ch;switch(ch)case'':case'':case'(':case')':case'':case'':case',':case'"':case'':cout<<"(5,"<<Word<<&

13、#39;)'<<e ndl; break;case'+':ch=fgetc(fp);if(ch='='|ch='+')Word1=ch;运算符"+="或判断结果为cout<<"(4,"<<Word<<')'<<e ndl;/"+"else fseek(fp,-1,1);判断结果为"+"cout<<"(4,"<<Word<<'

14、;)'<<e ndl;/ break;case'-':ch=fgetc(fp); if(ch='='|ch='-')Word1=ch; cout<<"(4,"<<Word<<')'<<e ndl; else fseek(fp,-1,1);判断结果为"-"cout<<"(4,"<<Word<<')'<<e ndl; / break;case&#

15、39;*': case'/':case'!':case'-:ch=fgetc(fp);if(ch='=')Word1=ch; cout<<"(4,"<<Word<<')'<<e ndl;else fseek(fp,-1,1);cout<<"(4,"<<Word<<')'<<e ndl;break;case'<':ch=fgetc(fp);if(

16、ch='='|ch='<')Word1=ch; cout<<"(4,"<<Word<<')'<<e ndl;else fseek(fp,-1,1);判断结果为"<"cout<<"4t"<<Word<<e ndl; /break;case'>':ch=fgetc(fp);if(ch='='|ch='>')Word1=ch;cout<

17、;<"(4,"<<Word<<')'<<e ndl;else fseek(fp,-1,1);cout<<"(4,"<<Word<<')'<<e ndl;break;default:cout<<"(无法识别字符,"<<Word<<')'<<endl; break;void mai n()FILE *fp;fp=fo pen ("c:1.txt","门;if(fp=NULL) II读取文件内容,并返回文件指针,该指针指向文件的第一个字符c

温馨提示

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

评论

0/150

提交评论