词法分析器报告重点讲义资料

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

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

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

资源描述

编译原理实验报告实验题目:词法分析器构造指导教师:杨建姓名:杨先宇班级:计13-4学号:15901020402实验成绩:实验题目词法分析器构造实验目的和要求总体任务:总体任务:通过对给定源语言词法分析程序的设计,加深对词法分析原理的理解,掌握源语言的接受、存贮、预处理和扫描分析,生成正确的单词符号串二元式序列。说明提示:1.本实验要求的直接分析法,即从左向右扫描源程序,一旦发现有独立意义的字符串时,即将其改造统一长度的二元组(t,i)输出,其中t表示单词种别,i为相应内部表示,本题t分为五类:K(关键字)、I(标识符)、C(常数)、P(界符),L(标号)i为特定项的指针值,对应于每一类属性的单词均设置相应的有贮表格,在识别过程中每识别出一个单词,则将其顺序放入相应的符号表中。2.源程序利用行编辑录入,以TEXT文件形式存贮在盘上,词法分析程序,先对源程序作预处理扫描生成新的TEXT文件。预处理的功能是剔除无用的空白、跳格、回车和换行等编辑性字符;去掉注解部分,连接继续行,给出句未符。3.本实验作为编译过程的第一阶段和后续实验的前提,所有生成结果都必须作为永久文件存贮。设计思想与框架词法分析时,首先要对源程序进行预处理,去掉的多余的空格符号和注释,其中注释要删除,多个空格变成一个,并在结尾加一个标识符如#,用来表示结束。预处理阶段结束,再进行逐词分析。若第一位是字母,则他可能是关键字、标号、标示符;若第一位是数字,则可能是常数、标号、非法标号;若为其他字符,则可能是界符、运算符、关系符、或非法字符。这样细分后再进行查表判断。核心算法定义符号表:char*keyword[4]={IF,THEN,ELSE,GOTO};char*operatornum[4]={+,-,*,/};char*comparison[6]={,,=,=,=,};char*interpunction[4]={,,:,(,)};主要函数:boolsearch(charsearchstr[],intwordtype)charletterprocess(charch)//isalnum判断是否为字母或者数字charnumberprocess(charch)//数字charotherprocess(charch)//数字,字母,非括号charprocess(charch)//读字符voidpro_process(char*buf)//预处理voidmain()//主函数源程序及注释#includestdio.h#includestdlib.h#includestring.h#includectype.h#includemalloc.h#includeconio.h#includefstream.h#includeiostream.h#defineNULL0FILE*fp;FILE*out,*in;charch;charfilename[50];char*keyword[4]={IF,THEN,ELSE,GOTO};char*operatornum[4]={+,-,*,/};char*comparison[6]={,,=,=,=,};char*interpunction[4]={,,:,(,)};intx=-1,y=-1,z=-1;#defineKlen10#defineIlen30#defineClen40#definePlen20#defineOlen20#defineLlen10charK[Klen][10],P[Plen][2],I[Ilen][20],O[Olen][2];intC[Clen],L[Llen];boolsearch(charsearchstr[],intwordtype){inti;switch(wordtype){case1:for(i=0;i=3;i++){if(strcmp(keyword[i],searchstr)==0)returntrue;}case2:for(i=0;i=3;i++){if(strcmp(operatornum[i],searchstr)==0)returntrue;}case3:for(i=0;i=5;i++){if(strcmp(comparison[i],searchstr)==0)returntrue;}case4:for(i=0;i=3;i++){if(strcmp(interpunction[i],searchstr)==0)returntrue;}}returnfalse;}charletterprocess(charch)//isalnum判断是否为字母或者数字{inti=-1,j=-1,k,a=1;charletter[10],temp[10];while(isalnum(ch)!=0){letter[++i]=ch;ch=fgetc(fp);}letter[i+1]='\0';if(search(letter,1)){printf((K,%5s)\n,letter);fprintf(out,(K,%s)\n,letter);if(strcmp(letter,GOTO)==0){ch=fgetc(fp);while(isdigit(ch)!=0){temp[++j]=ch;ch=fgetc(fp);}temp[j+1]='\0';printf((L,%5s)\n,temp);fprintf(out,(L,%s)\n,temp);L[++y]=atoi(temp);}}else{printf((I,%5s)\n,letter);fprintf(out,(I,%s)\n,letter);for(k=0;k10;k++){if(strcmp(letter,I[k])==0)a=0;}if(a==1)strcpy(I[++x],letter);}returnch;}charnumberprocess(charch)//数字{inti=-1,n,temp,a=1;charnum[20];while(isdigit(ch)!=0)//isdigit为数字0-9时,返回非零值,否则返回零{num[++i]=ch;ch=fgetc(fp);}if(isalpha(ch)!=0){while(isalpha(ch)!=0){num[++i]=ch;ch=fgetc(fp);}num[i+1]='\0';printf(非法标识符:%s\n,num);fprintf(out,非法标识符:%s\n,num);}if(ch==':'){num[i+1]='\0';printf((L,%5s)\n,num);fprintf(out,(L,%s)\n,num);L[++y]=atoi(num);}else{num[i+1]='\0';printf((C,%5s)\n,num);fprintf(out,(C,%s)\n,num);temp=atoi(num);for(n=0;n10;n++){if(temp==C[n])a=0;}if(a==1)C[++z]=temp;}returnch;}charotherprocess(charch)//数字,字母,非括号{inti=-1;charother[10];if(ch=='('){other[++i]=ch;ch=fgetc(fp);}while(isalnum(ch)==0&&ch!=''&&ch!='('&&ch!=')')//isalnum判断是否为字母或者数字{other[++i]=ch;ch=fgetc(fp);}if(ch==')'){other[++i]=ch;ch=fgetc(fp);}other[i+1]='\0';if(search(other,4)){printf((P,%5s)\n,other);fprintf(out,(P,%s)\n,other);}elseif(search(other,2)||search(other,3)){printf((O,%5s)\n,other);fprintf(out,(O,%s)\n,other);}else{printf(非法字符:%s\n,other);fprintf(out,非法字符:%s\n,other);}returnch;}charprocess(charch){while(ch=='')ch=fgetc(fp);returnch;}voidpro_process(char*buf)//预处理{ifstreamcinf(filename,ios::in);inti=0;charold_ch='\0',cur_ch;boolcomment=false;while(cinf.read(&cur_ch,sizeof(char))){switch(comment){casefalse:if(old_ch=='/'&&cur_ch=='*'){i--;comment=true;}else{if(old_ch=='\\'&&cur_ch=='\n')i--;else{if(cur_ch=='\t'||cur_ch=='\r'||cur_ch=='\n')cur_ch='';if(old_ch==''&&cur_ch=='')i--;buf[i++]=cur_ch;}}break;casetrue:if(old_ch=='*'&&cur_ch=='/')comment=false;}old_ch=cur_ch;}buf[i++]='#';}voidmain(){charstr;charbuf[4048]={'\0'};inti=0;charp;printf(------------------欢迎使用C语言词法分析程序\n);C:printf(1:程序未经过预处理,先进行预处理分析\n);printf(2:程序已经过预处理,直接分析其词法结构\n);printf(请选择(1或2)\n);scanf(%c,&p);if(p=='1')gotoA;elseif(p=='2')gotoB;else{printf(输入错误,请重新输入\n);gotoC;}A:printf(请输入源文件路径及名称:);scanf(%s,filename);in=fopen(预处理.txt,w);printf(------------------欢迎使用C语言词法分析程序\n);if((fp=fopen(filename,rt))==NULL)printf(源文件无法打开!\n);else{pro_process(buf);while(buf[i]!='#'){fputc(buf[i],in);i++;}fputc('#',in);fclose(in);printf(预处理成功,是否继续进行词法结构分析......\n);system(pause);B:printf(分析如下:\n);printf(K:关键字I:标识符C:常数O:运算符P:界符L:标号\n);system(pause);out=fopen(二元式表.txt,w);fp=fopen(预处理.txt,r);str=fgetc(fp);inti=1;while(str!='#'){str=process(str);if(isalpha(str)!=0){printf(%d:,i);str=letterprocess(str);i++;}else{if(isdigit(str)!=0){printf(%d:,i);str=numberprocess(str);i++;}else{printf(%d:,i);str=otherprocess(str);i++;}}}printf(输出结果保存在二元式表.txt文件中,请打开查看。\n);printf(词法分析结束!\n);system(pause);for(intk=0;k30;k++){printf(%s%s,I[k],I[k+1]);k++;}fclos

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

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

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

×
保存成功