您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 编译原理词法分析源代码
一.实验目的1.深入理解有限自动机及其应用2.掌握根据语言的词法规则构造识别其单词的有限自动机的方法3.基本掌握词法分析程序的开发。二.实验内容及要求1、词法分析器的功能和输出格式词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是一类符号一种别码的方式。2、单词的BNF表示标识符-字母字母数字串字母数字串-字母字母数字串|数字字母数字串|下划线字母数字串|ε无符号整数-数字数字串数字串-数字数字串|ε加法运算符-+减法运算符--大于关系运算符-大于等于关系运算符-=3、“超前搜索”方法词法分析时,常常会用到超前搜索方法。如当前待分析字符串为“a+”,当前字符为’’,此时,分析器倒底是将其分析为大于关系运算符还是大于等于关系运算符呢?显然,只有知道下一个字符是什么才能下结论。于是分析器读入下一个字符’+’,这时可知应将’’解释为大于运算符。但此时,超前读了一个字符’+’,所以要回退一个字符,词法分析器才能正常运行。在分析标识符,无符号整数等时也有类似情况。4、模块结构5.程序思路这里以开始定义的C语言子集的源程序作为词法分析程序的输入数据。在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并查填适当的信息表。经过词法分析后,源程序缓冲区扫描一个字符主函数main()N输入文件名,判断能否打开文件Y缓冲区中是否还有字符Y结束取单词扫描一个字符调用返回输出N字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。0.定义部分:定义常量、变量、数据结构。1.初始化:从文件将源程序全部输入到字符缓冲区中。2.取单词前:去掉多余空白。3.取单词后:去掉多余空白(可选,看着办)。4.取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。(关键是如何判断取单词结束?取到的单词是什么类型的单词?)5.显示结果。6.实验程序的源代码如下:#includestdio.h#includectype.h#includemalloc.h#includestdlib.h#includestring.h#defineNULL0FILE*fp;charcbuffer;char*key[8]={if,else,for,while,do,return,break,continue};char*border[6]={,,;,{,},(,)};char*arithmetic[4]={+,-,*,/};char*relation[6]={,=,=,,=,};char*consts[20]={0,1,2,3,4,5,6,7,8,9};char*label[20];intconstnum=0,labelnum=0;intsearch(charsearchchar[],intwordtype){inti=0;switch(wordtype){case1:for(i=0;i=7;i++){if(strcmp(key[i],searchchar)==0){return(i+1);}}break;case2:{for(i=0;i=5;i++){if(strcmp(border[i],searchchar)==0)return(i+1);}return(0);}break;case3:{for(i=0;i=3;i++){if(strcmp(arithmetic[i],searchchar)==0){return(i+1);}}return(0);}break;case4:{for(i=0;i=5;i++){if(strcmp(relation[i],searchchar)==0){return(i+1);}}return(0);}break;case5:{for(i=0;i=constnum;i++){if(strcmp(consts[i],searchchar)==0){return(i+1);}}}break;case6:{for(i=0;i=labelnum;i++){if(strcmp(label[i],searchchar)==0){return(i+1);}}label[i-1]=(char*)malloc(sizeof(searchchar));strcpy(label[i-1],searchchar);labelnum++;return(i);}break;}}charalphaprocess(charbuffer){intatype;inti=-1;charalphatp[20];while((isalpha(buffer))||(isdigit(buffer))){alphatp[++i]=buffer;buffer=fgetc(fp);}alphatp[i+1]='\0';if(atype=search(alphatp,1))printf(%s\t(1,%d)\n,alphatp,atype-1);//结束else{atype=search(alphatp,6);printf(%s\t(6,%d)\n,alphatp,atype-1);}return(buffer);}chardigitprocess(charbuffer){inti=-1;chardigittp[20];intdtype;while((isdigit(buffer))){digittp[++i]=buffer;buffer=fgetc(fp);}digittp[i+1]='\0';dtype=search(digittp,5);printf(%s\t(5,%d)\n,digittp,dtype-1);return(buffer);}charotherprocess(charbuffer){inti=-1;charothertp[20];intotype,otypetp;othertp[0]=buffer;othertp[1]='\0';if(otype=search(othertp,3)){printf(%s\t(3,%d)\n,othertp,otype-1);buffer=fgetc(fp);gotoout;}if(otype=search(othertp,4)){buffer=fgetc(fp);othertp[1]=buffer;othertp[2]='\0';if(otypetp=search(othertp,4)){printf(%s\t(4,%d)\n,othertp,otypetp-1);gotoout;}elseothertp[1]='\0';printf(%s\t(4,%d)\n,othertp,otype-1);gotoout;}if(buffer==':'){buffer=fgetc(fp);if(buffer=='=')printf(:=(2,2)\n);buffer=fgetc(fp);gotoout;}else{if(otype=search(othertp,2)){printf(%s\t(2,%d)\n,othertp,otype-1);buffer=fgetc(fp);gotoout;}}if((buffer!='\n')&&(buffer!=''))printf(%cerror,notaword\n,buffer);buffer=fgetc(fp);out:return(buffer);}voidmain(){inti;for(i=0;i=20;i++){label[i]=NULL;};if((fp=fopen(example.txt,r))==NULL)printf(error);else{cbuffer=fgetc(fp);while(cbuffer!=EOF){if(isalpha(cbuffer))cbuffer=alphaprocess(cbuffer);elseif(isdigit(cbuffer))cbuffer=digitprocess(cbuffer);elsecbuffer=otherprocess(cbuffer);}printf(over\n);getchar();}}7.运行结果如下:三.实验总结(心得)通过本实验的学习,了解了基本此法分析的过程及方法,巩固了我对书本知识了解,拓宽了知识面!在实验中也遇到很多的错误,比如刚开时不能读写含有数字和不能识别的单词的语句,直接程序运行出错,经过很长时间的调试和分析,最后用单步调试方法找到了原因所在,是其中的一个数组没有给正确的值,导致无法进行执行strcmp函数!
本文标题:编译原理词法分析源代码
链接地址:https://www.777doc.com/doc-5421942 .html