词法分析实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

计科101—左朝阳1词法分析器一、实验目的:通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。二、实验要求如源程序为C语言。输入如下一段:main(){inta,b;a=10;b=a+20;}#要求输出如右图。要求:1、将单词分为五种识别关键字:main、if、int、for、while、do、return、break、continue;单词种别码为1。标识符;单词种别码为2。常数为无符号整形数;单词种别码为3。运算符包括:+、-、*、/、=、、、=、=、!=;单词种别码为4。分隔符包括:,、;、{、}、(、);单词种别码为5。2、使用一符一种的分法关键字、运算符和分界符可以每一个均为一种标识符和常数仍然一类一种三、实验内容1、功能描述改程序是一个实现词法分析的功能,能识别5种单词,其他单词报错。2、程序结构描述intIsKey(char*Word)关键字匹配函数,查询是否为关键字,若是,返回值为1,否则为0。intIsAlpha(charc)查看是否为字母,若是,返回值为1,否则为0。intIsNum(charc)查看是否为数字,若是,返回值为1,否则为0。voidscanner(FILE*fp)扫描函数,扫描程序中的字符串并调用上述三种函数检查是否是字母、数字,是否是关键字,并输出。fseek(fp,-1,1)回退一个字符。fgetc(fp)从数据流中区下一个字符。fopen文件打开函数,返回指向文件第一个字符的指针四、实验结果测试内容为main(){(1,”main”)(5,”(“)(5,”)“)(5,”{“)(1,”int”)(2,”a”)(5,”,”)(2,”b”)(5,”;”)(2,”a”)(4,”=”)(3,”10”)(5,”;”)(2,”b”)(4,”=”)(2,”a”)(4,”+”)(3,”20”)(5,”;”)(5,”}“)计科101—左朝阳2inta,b;a=10;b=a+20;}#结果测试代码为voidmain(){inta,b;if(a=10;)b+=20;c=%;}#结果为计科101—左朝阳3测试代码main(){inta,b;if(a=10)b+=20;c=%@;return0;}#结果计科101—左朝阳4五、实验过程记录1、因为用到回退函数fseek(),而以前没有用过这个函数,所以开始时很苦恼,不知道如何回退一个字符,后来问了同学,才明白原来有这么一个函数,顿时豁然开朗。2、本次试验中word[20]保存字符串时,不能正确保存,总是出错,原因是while(IsNum(ch)||IsAlpha(ch)){Word[i]=ch;i++;ch=fgetc(fp);}中,i++与Word[i]=ch;次序不对,后来多次思索,发现问题。六、实验总结本次实验花了将近一个下午才完成。在纸上设计的时间大约40分钟,剩下的时间是录入和调试。本次实验使我认识到,一段时间搁置,不编程序,水平会下降,好多有关c语言的知识会忘掉,所以以后我会经常写写程序。另外,通过本次实验,我又进一步加深对词法分析原理的理解。总的来说,获益匪浅!附录#includestring.h#includestdio.h#includestdlib.h#includectype.h#includeiostream.h计科101—左朝阳5Char*Key[9]={void,main,int,if,then,else,return,break,continue};charch;//存储识别出的单词流intIsAlpha(charc){//判断是否为字母if(((c='z')&&(c='a'))||((c='Z')&&(c='A')))return1;elsereturn0;}intIsNum(charc){//判断是否为数字if(c='0'&&c='9')return1;elsereturn0;}intIsKey(char*Word){//识别关键字函数intm,i;for(i=0;i8;i++){if((m=strcmp(Word,Key[i]))==0)return1;}return0;}voidscanner(FILE*fp){//扫描函数charWord[20]={'\0'};charch;inti,c;ch=fgetc(fp);//获取字符,指针fp并自动指向下一个字符if(IsAlpha(ch)){//判断该字符是否是字母Word[0]=ch;ch=fgetc(fp);i=1;while(IsNum(ch)||IsAlpha(ch)){//判断该字符是否是字母或数字Word[i]=ch;i++;ch=fgetc(fp);}Word[i]='\0';//'\0'代表字符结束(空格)fseek(fp,-1,1);//回退一个字符c=IsKey(Word);//判断是否是关键字if(c==0)cout(2,Word')'endl;//不是关键字elsecout(1,Word')'endl;//输出关键字}else//开始判断的字符不是字母计科101—左朝阳6if(IsNum(ch)){//判断是否是数字Word[0]=ch;ch=fgetc(fp);i=1;while(IsNum(ch)){Word[i]=ch;i++;ch=fgetc(fp);}Word[i]='\0';fseek(fp,-1,1);//回退cout(3,Word')'endl;}else//开始判断的字符不是字母也不是数字{Word[0]=ch;switch(ch){case'[':case']':case'(':case')':case'{':case'}':case',':case'':case';':cout(5,Word')'endl;break;case'+':ch=fgetc(fp);if(ch=='='||ch=='+'){Word[1]=ch;cout(4,Word')'endl;//运算符+=或判断结果为++}else{fseek(fp,-1,1);cout(4,Word')'endl;//判断结果为+}break;case'-':ch=fgetc(fp);if(ch=='='||ch=='-'){Word[1]=ch;cout(4,Word')'endl;}else{fseek(fp,-1,1);cout(4,Word')'endl;//判断结果为-计科101—左朝阳7}break;case'*':case'/':case'!':case'=':ch=fgetc(fp);if(ch=='='){Word[1]=ch;cout(4,Word')'endl;}else{fseek(fp,-1,1);cout(4,Word')'endl;}break;case'':ch=fgetc(fp);if(ch=='='||ch==''){Word[1]=ch;cout(4,Word')'endl;}else{fseek(fp,-1,1);cout4\tWordendl;//判断结果为}break;case'':ch=fgetc(fp);if(ch=='='||ch==''){Word[1]=ch;cout(4,Word')'endl;}else{fseek(fp,-1,1);cout(4,Word')'endl;}break;default:cout(无法识别字符,Word')'endl;break;}}}voidmain(){计科101—左朝阳8FILE*fp;fp=fopen(c:\\1.txt,r);if(fp==NULL)//读取文件内容,并返回文件指针,该指针指向文件的第一个字符{cout读入文件错误!endl;exit(0);}cout*******************词法分析结果如下*******************\n;while(ch!='#'){ch=fgetc(fp);if(ch=='#')break;//文件以#结尾,作为扫描结束条件elseif(ch==''||ch=='\t'||ch=='\n'){}//忽略空格,空白,和换行else{fseek(fp,-1,1);//回退一个字节开始识别单词流scanner(fp);}}}

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功