词法分析器计算器设计与实现实验报告

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

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

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

资源描述

辅导教师张静成绩实验日期实验时间1实验名称:词法分析器的设计与实现2、实验目的(1)掌握C语言单词符号的划分、正规式、状态转换图及词法分析器的实现。(2)掌握词法分析程序的作用。3、实验要求(1)对任给的一个C语言源程序,能够滤掉空格、回车换行符、tab键及注释。(2)识别各类单词符号,如关键字、标识符、运算符、常数、界符,结果以二元式形式输出,并构造符号表。(3)输出有词法错误的单词及所在行号。(在此阶段只能识别有限的词法错误)4、实验原理根据扫描到的单词符号的第一个字符的种类,分别转到相应的程序进行处理。这些程序的功能就是识别以相应字符开头的各类单词符号。5、实验步骤(1)根据C语言各类单词的正规式,构造能识别各类单词的状态转换图。(2)根据状态转换图,构造识别各类单词的词法分析器。6、状态转换图及词法分析程序状态转换图:词法分析程序:#includestdio.h#includestdlib.h#includestring#includeiostreamusingnamespacestd;stringkeywords[20]={include,void,main,int,char,float,double,if,else,then,break,continue,for,do,while,printf,scanf,begin,end,return};charrz[99999]=;stringid[10000];intpp=0;stringnu[10000];intqq=0;intchoice1(chara)//判断是否是字母{if((a='a'&&a='z')||(a='A'&&a='Z'))return1;elsereturn0;}intchoice2(chara)//判断是否是数字{if(a='0'&&a='9')return1;elsereturn0;01324567空白字母非字母与数字字母或数字数字非数字运算符界符其他*****}intalpha(intst)//识别保留字和标识符{charwordbuf[20]=;intn=0;for(;;){wordbuf[n]=rz[st];st++;n++;if((choice2(rz[st])==1)||(choice1(rz[st])==1)||(rz[st]=='_'))wordbuf[n]=rz[st];elsebreak;}intflag=0;for(intk=0;k20;k++){if(strcmp(keywords[k].c_str(),wordbuf)==0)flag=1;}if(flag==0){intflagg=-1;for(intt=0;tpp;t++){if(strcmp(id[t].c_str(),wordbuf)==0){flagg=t;}}if(flagg!=-1)printf((id,%d),flagg);else{id[pp]=wordbuf;printf((id,%d),pp);pp++;}}else{printf(();for(inti=0;in;i++){printf(%c,wordbuf[i]);}printf(,-));}returnst;}intnumber(intst)//识别整数{charnumbuf[20]=;intn=0;intk=0;intflag=0;for(;;){numbuf[n]=rz[st];st++;n++;if(choice2(rz[st])==1){numbuf[n]=rz[st];}elseif((k==0)&&(rz[st]=='.')){numbuf[n]=rz[st];k++;}elseif(choice1(rz[st])==1){numbuf[n]=rz[st];flag=1;continue;}elsebreak;}if(flag==0){intflagg=-1;for(intt=0;tqq;t++)if(strcmp(nu[t].c_str(),numbuf)==0)flagg=t;if(flagg!=-1)printf((nu,%d),flagg);else{nu[qq]=numbuf;printf((nu,%d),qq);qq++;}}else{printf(();for(inti=0;in;i++)printf(%c,numbuf[i]);printf(,errordigital!));}returnst;}intanotation(intst)//处理除号/和注释{chartabuf[9999]=;intn=0;st++;if(rz[st]=='/'){printf((//,-));st++;while(rz[st]!=10){tabuf[n]=rz[st];st++;n++;}printf(\n注释);for(inti=0;in;i++)printf(%c,tabuf[i]);}elseif(rz[st]=='*'){printf((/*,-));st++;intstt=st+1;while(1){if(rz[st]=='*'&&rz[st+1]=='/')break;tabuf[n]=rz[st];st++;n++;if(rz[st+1]=='\0'){printf((/*error!!\n));returnst+1;}}printf(\n注释);for(inti=0;in;i++)printf(%c,tabuf[i]);printf((*/,-));st=st+2;}elseif(rz[st]=='='){st++;printf((/*,-));}elseprintf((/,-));returnst;}intother(intst)//函数识别其他特殊字符{switch(rz[st]){case'=':st++;if(rz[st]=='='){st++;printf((rlop,==));}elseprintf((rlop,=));break;case'+':st++;if(rz[st]=='='){st++;printf((+=,-));}elseif(rz[st]=='+'){st++;printf((++,-));}elseprintf((+,-));break;case'-':st++;if(rz[st]=='='){st++;printf((-=,-));}elseif(rz[st]=='-'){st++;printf((--,-));}elseprintf((-,-));break;case'*':st++;if(rz[st]=='='){st++;printf((*=,-));}elseprintf((*,-));break;case'':st++;if(rz[st]=='='){st++;printf((rlop,=));}elseprintf((rlop,));break;case'':st++;if(rz[st]=='='){st++;printf((rlop,=));}elseprintf((rlop,));break;case'%':st++;if(rz[st]=='='){st++;printf((\%=,-));}elseprintf((\%,-));break;case'!':st++;if(rz[st]=='='){st++;printf((!=,-));}elseprintf((!,wrongthing!));break;case'&':st++;if(rz[st]=='&'){st++;printf((&&,-));}elseprintf((&,worngword!));break;case'|':st++;if(rz[st]=='|'){st++;printf((||,-));}elseprintf((|,worngword!));break;case'{':st++;printf(({,-));break;case'}':st++;printf((},-));break;case'(':st++;printf(((,-));break;case')':st++;printf((),-));break;case'[':st++;printf(([,-));break;case']':st++;printf((],-));break;case':':st++;printf((:,-));break;case'#':st++;printf((#,-));break;case';':st++;printf((;,-));break;case'.':st++;printf((.,-));break;case',':st++;printf((,,-));break;case'':st++;break;case'':st++;break;case10:st++;printf(\n);break;case34:st++;printf((\,-));break;case39:st++;printf((',-));break;default:printf((%c,worngthing),rz[st]);st++;}returnst;}intchoice(intst)//根据读入的单词的第一个字符确定调用不同的单词识别函数{if(choice1(rz[st])==1)st=alpha(st);elseif(choice2(rz[st])==1)st=number(st);elseif(rz[st]=='/')st=anotation(st);elsest=other(st);returnst;}intmain(){inti=0;FILE*fp;charname[10];printf(请输入文件名:\n);scanf(%s,&name);if((fp=fopen(name,r))==NULL){printf(Openerror!);exit(0);}charch=fgetc(fp);while(ch!=EOF){rz[i]=ch;i++;ch=fgetc(fp);}fclose(fp);intj=0;while(rz[j]!='\0')j=choice(j);coutendl程序中标示符如下endl;for(inti=0;ipp;i++)coutiid[i]endl;cout程序中数字如下endl;for(intj=0;jqq;j++)coutjnu[j]endl;system(pause);}7、测试及结果测试代码:intchoice(intst)//根据读入的单词的第一个字符确定调用不同的单词识别函数{if(choice1(rz[st])==1)st=alpha(st);elseif(choice2(rz[st])==1)st=number(st);elseif(rz[st]=='/')st=anotation(st);elsest=other(st);returnst;}测试结果:8、心得通过本次的实验,使我真正的了解词法分析器的实现过程,让我更加深刻领悟词法分析器的实现原理。虽然在本次实验中遇到了各种各样的困难和错误,但在同学们的帮助下我都一一克服了,使得词法分析器能够正确的识别相应的词法和表达式。在做实验的过程中,总是会忽略各种细节,从而导致经常修改一些很小的低级错误才能使程序正常运行,不仅浪费时间,还影响对其他地方的修改,并且在很多步骤处理上,方法不正确。使结果不能符合要求,深刻体会到了自己在编程方面与别人的差距,在今后的学习中,我会注意改正自己在这方面的缺点,促使自己的编程水平不断进步。编译原理是一门专业学科,对于现阶段的我来说,只能掌握它的一些基本原理和概念,对于一些更深层的知识还是有很多难以理解的地方。但在这次实验过程中,锻炼了自己的思考能力,也锻炼了自己的动手编程能力,对于将知识的转化有了很大的帮助。辅导教师张静成

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

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

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

×
保存成功