词法分析报告_第1页
词法分析报告_第2页
词法分析报告_第3页
词法分析报告_第4页
词法分析报告_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编译原理实验报告实验一词法剖析程序的设计与实现指导教师:姓名:学号:班级:一、实验目的基本掌握计算机语言的词法剖析程序的开发方法。二、实验内容编制一个能够剖析三种整数、表记符、主要运算符和主要重点字的词法剖析程序。三、实验要求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集成开发环境。五、实验步骤依据状态图,设计词法剖析算法设计函数scan( ),实现该算法编制测试程序(在本试验中,能够是主函数main( ))。调试程序:输入一组单词,检查输出结果。六、状态图七.测试数据:092+data>0x3f00while八.测试结果九,思虑题词法剖析可否采纳空格来划分单词?答:不可以,由于比方abc+bcd中没有空格,但这是三个单词。程序设计中哪些环节影响词法剖析的效率?怎样提升效率?答:整个程序都由状态变换图而来。由递归方法实现的状态变换图,影响了整个词法剖析器的剖析效率,能够考虑使用栈来非递归的实现词法剖析。十.实验心得经过词法剖析程序的实现,我理解了计算机是怎么去辨别一个个单词的,或许能够说是各样命令的。此次实验使我对语言中文件操作更为认识,认识文件指针的运转状况,还认识了编译c原理中有限自动机的观点,依据状态图写程序。十一.源代码#include<iostream>usingnamespacestd;#include<fstream>#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||number>9)cout<<"Error!";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;}elsecout<<"Error!八进制非法";//报错}if((TN>=2)&&(ch[0]!='0'))//两位位数(含)以上,十进制{int*num=newint[TN];for(i=0;i<TN;i++){number=convert(ch[i]);num[i]=number;if((number==-1)||(number>9))cout<<"Error!十进制非法";//报错}for(i=0;i<TN;i++){for(j=TN-i-1;j>0;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;i<TN;i++){number=convert(ch[i]);num[i]=number;if((number==-1)||(number>7))cout<<"Error!八进制非法";//报错}for(i=1;i<TN;i++){for(j=TN-i-1;j>0;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;i<TN;i++){number=convert(ch[i]);num[i]=number;if(number==-1)cout<<"Error!十六进制非法";//报错}for(i=2;i<TN;i++){for(j=TN-i-1;j>0;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;}elsecout<<"Error!赋值犯错";//报错break;///////////////////////////各样运算符///////////////////////////////case'+':file.get(ch);fpoint++;if(ch=='+'){re.kind=INC;re.value=0;returnre;}else{fpoint--;file.seekg(fpoint,ios::beg);//退后re.kind=ADD;re.value=0;returnre;}break;case'-':file.get(ch);fpoint++;if(ch=='-'){re.kind=DECC;re.value=0;returnre;;}else{fpoint--;file.seekg(fpoint,ios::beg);re.kind=SUB;re.value=0;returnre;}break;case'*':re.kind=MUL;re.value=0;returnre;break;case'/':re.kind=DIV;re.value=0;returnre;break;case'!':file.get(ch);fpoint++;if(ch=='=')号,不然犯错{re.kind=NEQ;re.value=0;returnre;}elsecout<<"Error!";//报错break;case'='://等号file.get(ch);fpoint++;if(ch=='=')不然犯错{re.kind=EQ;re.value=0;returnre;}elsecout<<"Error!";//报错break;case'>':file.get(ch);fpoint++;

退后//不等号以“!”开头的单词只好是不等以“=”开头的单词只好是等号,if(ch=='='){re.kind=JAE;re.value=0;returnre;}else{fpoint--;file.seekg(fpoint,ios::beg);re.kind=JA;re.value=0;returnre;}break;case'<':file.get(ch);fpoint++;if(ch=='='){re.kind=JBE;re.value=0;returnre;}else{fpoint--;file.seekg(fpoint,ios::beg);re.kind=JB;re.value=0;returnre;}break;case'(':re.kind=SLP;re.value=0;returnre;break;case')':re.kind=SRP;re.value=0;returnre;break;case'{':re.kind=LP;re.value=0;

退后退后returnre;break;case'}':re.kind=RP;re.value=0;returnre;break;case';':re.kind=SEMI;re.value=0;returnre;break;///////////////////////

不是该语言所能识其他单词

////////////////////////////default:cout<<"Error!";

//报错}//endswitch}////////////////////////////voidmain( ){

主程序////////////////////////////////////////charch;wordreword;fpoint=0;

//接收词法剖析程序返回的单词//记录目前字符的地点,用于回退num_token=0;//

记录一个单词中的字符数目token=newchar[30];

//寄存每个单词file.open("word.txt");cout<<"\n词法程序剖析结果:"<<endl;while(1){file.get(ch);fpoint++;if(file.eof( )!=0)break;reword=scan(ch);if(reword.kind!=0){switch(reword.kind){case1:cout<<"<ASG";break;case2:cout<<"<ADD";break;case3:cout<<"<SUB";break;case4:cout<<"<MUL";break;case5:cout<<"<DIV";break;case6:cout<<"<ID";break;case7:cout<<"<IF";break;case8:cout<<"<THEN

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论