您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 编译原理词法分析实验报告
词法分析实验报告学院:计算机科学与技术班级:软件工程1203班学号:1208010303姓名:王青枝词法分析实验报告一、题目词法分析二、实验目的1)加深对词法分析器的工作过程的理解;2)加强对词法分析方法的掌握;3)能够采用一种编程语言实现简单的词法分析程序;4)能够使用自己编写的分析程序对简单的程序段进行词法分析。二、单词保留字运算符界符(表格)1)编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。2)依次输出各个单词的内部单词种别及单词符号自身值。3)单词的文法表示:常量定义::=标识符=无符号整数;标识符::=字母={字母|数字};加法运算符::=+|-乘法运算符::=*|/关系运算符::==|#||=||=字母::=a|b|…|X|Y|Z数字::=0|1|2|…|8|94)要求:保留字:单词种别码为1。包括if、int、for、while、do、return、break、continue;标识符:单词种别码为2。常数:单词种别码为3。(常数为无符号整形数)运算符:单词种别码为4。包括+、-、*、/、=、、、=、=、!=;分隔符:单词种别码为5。包括,、;、{、}、(、);四、实验要求1.实验环境要求在C或C++运行环境中执行2.对单词的构词规则有明确的定义;3.编写的分析程序能够正确识别源程序中的单词符号;4.识别出的单词以种别码,值的形式保存在符号表中;5.对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成整个源程序的词法分析;五、词法分析总体架构大的流程图在词法分析中,先以只读方式读取一个文件,自文件头开始扫描文本,滤去开头的空格、回车符、换行符等!读取的字符送入缓冲区。扫描第一个字符,看匹配的类型,并进行相应的类型分析,满足判断类型时,输出其种别码和值。判断时要注意保留字和识别符之间的不同,单目运算符和双目运算符之间的不同。因此可用指针进行处理。还必须熟悉字符串函数的使用。并要对非法字符作出错误提示。文本扫描结束要判断词法分析是否成功。最后是关闭文件,释放指针。其中:⑴常量、变量、数据结构的定义:本程序中用keyword数组来定义保留字if、int、for、while、do、return、break、continue;用yunsuan数组来定义运算符+、-、*、/、=、、、=、=、!=;用fenge数组来定义分隔符包括:,、;、{、}、(、)1-表示保留字2-表示标识符3-表示常数4-表示运算符5-表示分隔符Output是输出函数。⑵函数使用:字符函数:intisalpha(intch)若ch是字母('A'-'Z','a'-'z')返回非0值,否则返回0intisalnum(intch)若ch是字母('A'-'Z','a'-'z')或数字('0'-'9')返回非0值,否则返回0intisdigit(intch)若ch是数字('0'-'9')返回非0值,否则返回0字符串函数:strcmp(constchar*s1,constchar*s2)比较字符串s1与s2的大小,并返回s1-s2strchr(constchar*string,intc)函数就是在字符串中搜索指定字符。第一个形参就是要搜索的字符串,第二个是被搜索的字符。如果找到了该字符就返回该字符第一次出现的内存地址。如果没有找到就返回NULL(也就是0)。fseek(文件类型指针,位移量,起始点);起始点指文件开头处,文件当前位置,文件尾,分别用0,1,2来表示④fwrite()⑶读取字符:读出单词的每一个字符,组成单词,分析类型。读取单词前后的多余空白要滤去。程序大的流程图如下图:六、细化流程图:七、调试过程抓图,输入,输出,结果(1)程序无错误,正确运行时如下图:(2)调试的时候需要在文件位置建一个文本文档wqz.txt文件,内容如下:#includestdio.hvoidmain(){intvalue=0;while(value=100){printf(%d\n,value);value++;}}输入文件的名字,运行结果如下图:文件名错误时:文件名正确时,如下图所示:(3)词法分析结束,退出本程序八、总结通过这次实验,我更深刻的理解了词法分析的原理,词法分析是编译程序的基础,是为学习语法分析、语义分析以及代码生成打基础。在实验过程中,遇到了许多概念理解不深刻的问题,我重新翻阅了课本,从而更深刻的理解了词法分析的原理,发现自己的不足之处,在今后的学习中将会有更加明确的目标.虽然只是读程序,但是我觉得还是有一定难度的,需要花一定的时间去理解写程序人的思路和每个函数的意思。九、源代码#includestdio.h#includestring.h#includectype.h#definekeyword8char*key[keyword]={if,int,for,while,do,return,break,continue};#defineyunsuan9charyun[yunsuan]=+-*/=!;#definefenge8charfen[fenge]=.;{}();charch;inti,k;charbuff[20];voidoutput(int,char*);voidscan(FILE*fp){intj;ch=fgetc(fp);while(ch==''||ch=='\n'||ch=='\t'){ch=fgetc(fp);}if(isalpha(ch))/*输入的是字母,进行标识符处理*/{buff[0]=ch;i=1;ch=fgetc(fp);while(isalnum(ch))/*如果是字母数字则组合,否则结束*/{buff[i]=ch;i++;ch=fgetc(fp);}buff[i]='\0';/*查找保留字*/fseek(fp,-1,1);j=0;while((jkeyword)&&strcmp(buff,key[j]))j++;if(j=keyword){output(2,buff);}else{output(1,buff);}}elseif(isdigit(ch)){buff[0]=ch;ch=fgetc(fp);i=1;while(isdigit(ch))/*如果是数字则整合数字*/{buff[i]=ch;i++;ch=fgetc(fp);}buff[i]='\0';/*整数整合结束*/fseek(fp,-1,1);output(3,buff);}elseif(strchr(fen,ch)0)/*判断分隔符*/{buff[0]=ch;ch=fgetc(fp);buff[1]='\0';fseek(fp,-1,1);output(5,buff);}elseif(strchr(yun,ch)0)/*判断运算符*/{buff[0]=ch;if(ch=='=')/*双运算符*/{ch=fgetc(fp);if(ch=='='){output(4,==);}else{fseek(fp,-1,1);output(4,=);}}elseif(ch==''){ch=fgetc(fp);if(ch=='='){output(4,=);}else{fseek(fp,-1,1);output(4,);}}elseif(ch==''){ch=fgetc(fp);if(ch=='='){output(4,=);}else{fseek(fp,-1,1);output(4,);}}elseif(ch=='!'){ch=fgetc(fp);if(ch=='='){output(4,!=);}else{fseek(fp,-1,1);output(0,error!);}}else{ch=fgetc(fp);buff[1]='\0';fseek(fp,-1,1);output(4,buff);}}else/*无法识别的字符*/{buff[0]=ch;buff[1]='\0';ch=fgetc(fp);fseek(fp,-1,1);{printf(\t非法字符%s\n,buff);}}}voidsave(){FILE*out;out=fopen(out.txt,w+);while(gets(buff)){fprintf(out,%%s\n,ch);}fclose(out);}voidoutput(intn,char*m)/*输出格式*/{printf(%-2d,%-8s\n,n,m);}voidmain(){FILE*fp;charfilename[20];printf(数据类型定义规则:\n);printf(保留字--1标识符--2常数--3运算符--4分隔符--5\n);printf(pleaseinputthefilenamewhichyouwanttoopen:);scanf(%s,&filename);fp=fopen(filename,r);/*以只读方式打开指定文件*/if((fp=fopen(filename,r))==NULL)/*文件不存在输出错误*/{printf(Filedoesnotexist!checkitagain);}else{printf(种别码,值\n);while(ch!=EOF){scan(fp);}printf(Theanalysisisover.\n);printf(Thanksforusingthissoftware,haveagoodtime!\n);save();}fclose(fp);getchar()};
本文标题:编译原理词法分析实验报告
链接地址:https://www.777doc.com/doc-5131271 .html