词法分析报告

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

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

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

资源描述

编译原理实验报告实验一词法分析程序的设计与实现指导教师:姓名:学号:班级:一、实验目的基本掌握计算机语言的词法分析程序的开发方法。二、实验内容编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。三、实验要求1.根据以下的正规式,编制正规文法,画出状态图;标识符字母(字母|数字字符)*十进制整数0|(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*八进制整数0(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*十六进制整数0(x|X)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*运算符和分隔符+-*/=();关键字ifthenelsewhiledo2.根据状态图,设计词法分析函数intscan(),完成以下功能:(1)从输入流(键盘或文件)读入数据,分析出一个单词。(2)返回单词种别(用整数表示),(3)返回单词属性(不同的属性可以放在不同的全局变量中)。3.编写测试程序,循环调用函数scan(),每次调用,获得一个单词的信息。在测试程序中,打印输出单词种别、属性(注意:不要在词法分析函数scan中打印输出!)。四、实验环境微型计算机。Windows操作系统/Linux操作系统。编程语言:C/C++/Java/C#。建议使用VisualC++/Netbeans/Eclipse集成开发环境。五、实验步骤1.根据状态图,设计词法分析算法2.设计函数scan(),实现该算法3.编制测试程序(在本试验中,可以是主函数main())。4.调试程序:输入一组单词,检查输出结果。六、状态图七.测试数据:092+data0x3f00while八.测试结果九,思考题1.词法分析能否采用空格来区分单词?答:不能,因为比如abc+bcd中没有空格,但这是三个单词。2.程序设计中哪些环节影响词法分析的效率?如何提高效率?答:整个程序都由状态转换图而来。由递归方法实现的状态转换图,影响了整个词法分析器的分析效率,可以考虑使用栈来非递归的实现词法分析。十.实验心得通过词法分析程序的实现,我理解了计算机是怎么去识别一个个单词的,或者可以说是各种命令的。这次实验使我对c语言中文件操作更加了解,了解文件指针的运行情况,还了解了编译原理中有限自动机的概念,根据状态图写程序。十一.源代码#includeiostreamusingnamespacestd;#includefstream#defineASG1#defineADD2#defineSUB3#defineMUL4#defineDIV5#defineID6#defineIF7#defineTHEN8#defineWHILE9#defineDO10#defineINT811//八进制#defineINT1012//十进制#defineINT1613#defineSLP14//左括号(#defineSRP15//右括号)#defineSEMI16//分号;#defineLP17//左花括号{#defineRP18//右花括号}#defineINC19//++#defineDECC20//--#defineNEQ21//不等于#defineEQ22//等于#defineJAE23//大于等于#defineJA24//大于#defineJBE25//小于等于#defineJB26//小于structword{intkind;intvalue;};intfpoint;//文件字符指针intnum_token;//一个单词中的字符数量,主要是数字长度char*token;fstreamfile;//所要读取的文件wordhandle_identifier(char*ch)//处理标识符(包括关键字){structwordre;//返回值//////////////////////////关键字///////////////////////////if(strcmp(ch,if)==0){re.kind=IF;re.value=0;returnre;}if(strcmp(ch,then)==0){re.kind=THEN;re.value=0;returnre;}if(strcmp(ch,while)==0){re.kind=WHILE;re.value=0;returnre;}if(strcmp(ch,do)==0){re.kind=DO;re.value=0;returnre;}//////////////////////////标识符///////////////////////////re.kind=ID;re.value=0;returnre;}intconvert(charch)//将字符转换成数字{intnumber;switch(ch){case'0':number=0;break;case'1':number=1;break;case'2':number=2;break;case'3':number=3;break;case'4':number=4;break;case'5':number=5;break;case'6':number=6;break;case'7':number=7;break;case'8':number=8;break;case'9':number=9;break;case'A':number=10;break;case'a':number=10;break;case'B':number=11;break;case'b':number=11;break;case'C':number=12;break;case'c':number=12;break;case'D':number=13;break;case'd':number=13;break;case'E':number=14;break;case'e':number=14;break;case'F':number=15;break;case'f':number=15;break;default:number=-1;break;//非法字符转换成-1}returnnumber;}wordhandle_number(char*ch,intTN)//处理无符号整数{inti,j;intnumber;//对应每一位上转换后的数字intdec=0,oct=0,hex=0;//最终的数值,三种进制wordre;//返回值if(TN==1)//一位数,只能是十进制{number=convert(ch[0]);if(number==-1||number9)coutError!;else{re.kind=INT10;re.value=number;returnre;}}if((TN==2)&&(ch[0]=='0'))//两位数,八进制{number=convert(ch[1]);if((number=0)&&(number=7)){re.kind=INT8;re.value=number;returnre;}elsecoutError!八进制非法;//报错}if((TN=2)&&(ch[0]!='0'))//两位位数(含)以上,十进制{int*num=newint[TN];for(i=0;iTN;i++){number=convert(ch[i]);num[i]=number;if((number==-1)||(number9))coutError!十进制非法;//报错}for(i=0;iTN;i++){for(j=TN-i-1;j0;j--)num[i]*=10;dec+=num[i];}re.kind=INT10;re.value=dec;returnre;}elseif((TN=3)&&(ch[0]=='0')&&(ch[1]!='x')&&(ch[1]!='X'))//三位数(含)以上,八进制{int*num=newint[TN-1];for(i=1;iTN;i++){number=convert(ch[i]);num[i]=number;if((number==-1)||(number7))coutError!八进制非法;//报错}for(i=1;iTN;i++){for(j=TN-i-1;j0;j--)num[i]*=8;oct+=num[i];}re.kind=INT8;re.value=oct;returnre;}elseif((TN=3)&&(ch[0]=='0')&&((ch[1]=='x')||(ch[1]=='X')))//三位数(含)以上,十六进制{int*num=newint[TN-2];for(i=2;iTN;i++){number=convert(ch[i]);num[i]=number;if(number==-1)coutError!十六进制非法;//报错}for(i=2;iTN;i++){for(j=TN-i-1;j0;j--)num[i]*=16;hex+=num[i];}re.kind=INT16;re.value=hex;returnre;}}wordscan(charch){wordre;//返回值while(ch==''||ch=='\n')//空格或回车{fpoint++;if(ch=='\n')fpoint++;//\n包括回车和换行所以再加1file.get(ch);}num_token=0;//每次要分析一个单词的时候,都要重新对单词中的字符计数token[num_token]=ch;//单词开始的一个字符都放到存放单词的数组中token[num_token+1]='\0';num_token++;if(isalpha(ch))//第一个字符是字母的单词是标识符{file.get(ch);fpoint++;while(isalnum(ch)&&!file.eof())//读取标识符的所有字母和数字{token[num_token]=ch;token[num_token+1]='\0';num_token++;file.get(ch);fpoint++;}fpoint--;file.seekg(fpoint,ios::beg);//后退re=handle_identifier(token);//处理标识符returnre;//返回单词信息(种别和属性值)}elseif(isdigit(ch))//第一个字符是数字的单词是整数{file.get(ch);fpoint++;while(isalnum(ch)&&!file.eof())//十六进制中包含字母x和X,所以整数单词中不一定只包含数字{token[num_token]=ch;token[num_token+1]='\0';num_token++;file.get(ch);fpoint++;}fpoint--;file.seekg(fpoint,ios::beg);//后退re=handle_number(token,num_token);returnre;}elseswitch(ch){case':'://赋值符号file.get(ch);fpoint++;if(ch=='=')//以“:”开头的单词只能是赋值符号,否则出错{re.kind=ASG;re.value=0;returnre;}elsecoutError!赋值出错;//报错break;///////////////////////////各种运算符///////////////////////////////case'+':file.get(ch);fpoint++;if(ch=='+'){re.kind=INC;re.value=0;returnre;}else{fpoint--;file.seekg(fpoint,ios:

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

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

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

×
保存成功