您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 编译原理实验报告《词法分析器的构造》
1《词法分析器的构造》实验报告一、实验名称词法分析器的构造二、实验目的设计、编制、调试一个词法分析程序,对单词进行识别和编码,加深对词法分析原理的理解。三、实验内容和要求编写一个C语言词法分析器,要求:1、允许用户自己输入源程序并保存为文件2、系统能够输出经过预处理后的源程序(去掉注释、换行、空格等)3、能够将该源程序中所有的单词根据其所属类型(整数、保留字、运算符、标识符等。定义的类C语言中的标识符只能以字母或下划线开头)进行归类显示,例如:识别保留字:if、int、for、while、do、return、break、continue等,其他的都识别为标识符;常数为无符号整形数;运算符包括:+、-、*、/、=、、、=、=、!=等;分隔符包括:,、;、{、}、(、)等。4、实现文件的读取操作,而不是将文本以字符串形式预存于程序中。文本内容为待分析的类C语言程序。例如下面为一段C语言源程序:main(){inta,b;a=10;b=a+20;}要求输出如下(2,’main’)(5,’(’)(5,’)’)(5,’{’)(1,’int’)(2,’a’)(5,’,’)2(2,’b’)(5,’;’)(2,’a’)(4,’=’)(3,’10’)(5,’;’)(2,’b’)(4,’=’)(2,’a’)(4,’+’)(3,’20’)(5,’;’)(5,’}’)四、主要仪器设备硬件:微型计算机。软件:VisualC++6.0(也可以是其它集成开发环境)。五、实验过程描述1、状态转换图01324567空白字母非字母数字和_字母或数字或_数字非数字运算符界符其他*****数字32、程序主要框架程序中编写了以下函数,各个函数实现的作用如下:intalpha(intst)://识别保留字和标识符intnumber(intst)//识别常数intanotation(intst)//处理除号/和注释//intother(intst)//识别运算符、分隔符、特殊字符intchoice1(intst)//读入的字符是字母返回1intchoice2(intst)//读入的字符是数字返回1intchoice(intst)//根据读入的单词的第一个字符确定调用不同函数识别单词3、编写的源程序#includestdio.h#includestdlib.h#includestring.h#includeiostreamusingnamespacestd;stringkeywords[21]={include,void,main,int,char,float,double,if,else,then,break,continue,for,do,while,printf,scanf,begin,end,return,define};charrz[99999]=;//源程序charpz[9999]=;//预处理后的源程序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;}intalpha(intst)//识别保留字(1)和标识符(2){charwordbuf[20]=;4intn=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;k21;k++){if(strcmp(keywords[k].c_str(),wordbuf)==0)flag=1;//是保留字}if(flag==1)printf((%s,1),wordbuf);else{intflagg=-1;for(intt=0;tpp;t++){if(strcmp(id[t].c_str(),wordbuf)==0)//已经出现过的标识符{flagg=t;}}if(flagg==-1){//新的标识符记录到id[]中id[pp]=wordbuf;pp++;}printf((%s,2),wordbuf);}returnst;}intnumber(intst)//识别常数{charnumbuf[20]=;intn=0;intk=0;intflag=0;for(;;){numbuf[n]=rz[st];5st++;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)//新的的常数{nu[qq]=numbuf;qq++;}printf((%s,3),numbuf);}else{printf(();for(inti=0;in;i++)printf(%s,numbuf[i]);printf(,errordigital!));}returnst;}intanotation(intst)//处理除号/和注释{chartabuf[9999]=;intn=0;st++;6if(rz[st]=='/'){printf((//,-));st++;while(rz[st]!=10){tabuf[n]=rz[st];st++;n++;}printf(注释);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(注释);for(inti=0;in;i++)printf(%c,tabuf[i]);printf((*/,-));st=st+2;}elseif(rz[st]=='='){st++;printf((/=,4));}elseprintf((/,4));returnst;}7intother(intst)//识别运算符(4)、分隔符(5)、特殊字符(-){switch(rz[st]){//运算符:=,+,+=,-,-=,*,*=,/,/=,,=,,=,%,%=,!,!=,&,&&,||case'=':st++;if(rz[st]=='='){st++;printf((==,4));}elseprintf((=,4));break;case'+':st++;if(rz[st]=='='){st++;printf((+=,4));}elseif(rz[st]=='+'){st++;printf((++,4));}elseprintf((+,4));break;case'-':st++;if(rz[st]=='='){st++;printf((-=,4));}elseif(rz[st]=='-'){st++;printf((--,4));}elseprintf((-,4));break;case'*':st++;if(rz[st]=='='){st++;printf((*=,4));}8elseprintf((*,4));break;case'':st++;if(rz[st]=='='){st++;printf((=,4));}elseprintf((,4));break;case'':st++;if(rz[st]=='='){st++;printf((=,4));}elseprintf((,4));break;case'%':st++;if(rz[st]=='='){st++;printf((\%=,4));}elseprintf((\%,4));break;case'!':st++;if(rz[st]=='='){st++;printf((!=,4));}elseprintf((!,wrongthing!));break;case'&':st++;if(rz[st]=='&'){st++;printf((&&,4));}elseprintf((&,4));break;case'|':st++;if(rz[st]=='|')9{st++;printf((||,4));}elseprintf((|,worngword!));break;//分隔符:{},(),[],,,;,:,,',空格,回车,TABcase'{':st++;printf(({,5));break;case'}':st++;printf((},5));break;case'(':st++;printf(((,5));break;case')':st++;printf((),5));break;case'[':st++;printf(([,5));break;case']':st++;printf((],5));break;case':':st++;printf((:,5));break;case';':st++;printf((;,5));break;case',':st++;printf((,,5));break;case34:st++;printf((\,5));break;case39:st++;printf((',5));break;case'':st++;break;case'':st++;break;case10:st++;10printf(\n);//特殊字符:#,@,$等break;case'#':st++;printf((#,-));break;case'@':st++;printf((@,-));break;default:printf((%c,worngword!),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;}//主菜单voidmenu(){coutendl;cout--------------------------------------------endl;cout|*****************0.源程序输入******************|\n;cout|*****************1.预处理输出******************|\n;cout|*****************2.词
本文标题:编译原理实验报告《词法分析器的构造》
链接地址:https://www.777doc.com/doc-5203858 .html