编译原理实验-词法分析器_第1页
编译原理实验-词法分析器_第2页
编译原理实验-词法分析器_第3页
编译原理实验-词法分析器_第4页
编译原理实验-词法分析器_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

编译原理实验-词法分析器⼀、实验⽬的设计、编制、调试⼀个词法分析程序,对单词进⾏识别和编码,加深对词法分析原理的理解。⼆、实验内容1.选定语⾔,编辑任意的源程序保存在⽂件中;2.对⽂件中的代码预处理,删除制表符、回车符、换⾏符、注释、多余的空格并将预处理后的代码保存在⽂件中;3.扫描处理后的源程序,分离各个单词符号,显⽰分离的单词类型。三、实验思路对于实验内容1,选择编写c语⾔的源程序存放在code.txt中,设计⼀个c语⾔的词法分析器,主要包含三部分,⼀部分是预处理函数,第⼆部分是扫描判断单词类型的函数,第三部分是主函数,调⽤其它函数;对于实验内容2,主要实现在预处理函数processor()中,使⽤⽂档操作函数打开源程序⽂件(code.txt),去除两种类型(“//”,“/*…*/”)的注释、多余的空格合并为⼀个、换⾏符、回车符等,然后将处理后的保存在另⼀个新的⽂件(afterdel.txt)中,最后关闭⽂档。对于实验内容3,打开处理后的⽂件,然后调⽤扫描函数,从⽂件⾥读取⼀个单词调⽤判断单词类型的函数与之前建⽴的符号表进⾏对⽐判断,最后格式化输出。四、编码设计代码参考了两篇博主的,做了部分改动,添加了预处理函数等1#include<iostream>2#include<fstream>3#include<cstdio>4#include<cstring>5#include<string>6#include<cstdlib>78usingnamespacestd;910intaa;//fseek的时候⽤来接着的11stringword="";12stringreserved_word[20];//保留//每次读进来的⼀个字符0;//每个单词中当前字符的位置line=1;//⾏数row=1;//列数,就是每⾏的第⼏个flag;//⽂件是否结束了//单词的类型13charbuffer;14intnum=15int16int17bool18intflag2;192021//预处理函数22intprocessor(){//预处理函数23FILE*p;falg0,=len,i=0,j=0;],str1[1000],c;24int25charstr[100026if((p=fopen("code.txt","rt"))==NULL){27printf("⽆法打开要编译的源程序");28return0;29}30else{31//fgets(str,1000,p);32while((c=getc(p))!=EOF){33str[i++]=c;34}35fclose(p);36str[i]'\;0'=37for(i=0;i<strlen(str);i++){38if(str[i]==39while'\n'){}40}//单⾏注释41elseif(str[i]=='/'&&str[i+1]=='/'){(str[i++]!='/'&&str[i+1]=='*'){(!(str[i]='*'&&str[i+1]=='/')){i++;}42while43i+=2;44}//多⾏注释45elseif(str[i]==''&&str[i+1]==''){46while(str[i]==''){i++;}

4748495051525354555657585960616263i--;if(str1[j-1]!='')str1[j++]='';}//多个空格,去除空格elseif(str[i]=='\n'){if(str1[j-1]!='')str1[j++]='';}//换⾏处理,elseif(str[i]==9){while(str[i]==9){i++;}if(str1[j-1]!='')str1[j++]='';i--;}//tab键处理elsestr1[j++]=str[i];//其他字符处理64}65str1[j]='\0';66if((p=fopen("afterdel.txt","w"))==NULL){6768printf("cannotfindit!");return0;69}70else{71727374if(fputs(str1,p)!=0){printf("预处理失败!");}elseprintf("预处理成功!");75}76fclose(p);77}78return0;79}8081//设置保留字82voidset_reserve()83{84858687888990919293949596}97reserved_word[1]="return";reserved_word[2]="def";reserved_word[3]="if";reserved_word[4]="else";reserved_word[5]="while";reserved_word[6]="return";reserved_word[7]="char";reserved_word[8]="for";reserved_word[9]="and";reserved_word[10]="or";reserved_word[11]="int";reserved_word[12]="bool";98//看这个字是不是字母99booljudge_word(charx)100{101if(x>='a'&&x<='z'||x>='A'&&x<='Z'){returntrue;102103}104elsereturnfalse;105}106107//看这个字是不是数字108booljudge_number(charx)109{110if(x>='0'&&x<='9'){returntrue;111112}113elsereturnfalse;114}115116//看这个字符是不是界符117booljudge_jiefu(charx)118{119if(x=='('||x==')'||x==','||x==';'||x=='{'||x=='}'){returntrue;120121}122elsereturnfalse;123}124125126//加减乘127booljudge_yunsuanfu1(charx)128{129130if(x=='+'||x=='-'||x=='*'){

131returntrue;132}133elsereturnfalse;134}135136//等于赋值,⼤于⼩于⼤于等于,⼩于等于,⼤于⼩于137booljudge_yunsuannfu2(charx)138{139if(x=='='||x=='>'||x=='<'||x=='&'||x=='||'){140returntrue;}141142elsereturnfalse;143}144145146//这个最⼤的函数的总体作⽤是从⽂件⾥读⼀个单词147intscan(FILE*fp)148{149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214buffer=fgetc(fp);//读取⼀个字符if(feof(fp)){//检测结束符flag=0;return0;}elseif(buffer==''){row++;return0;}elseif(buffer=='\n'){row=1;return0;}//如果是字母开头或'_'看关键字还是普通单词elseif(judge_word(buffer)||buffer=='_'){word+=buffer;row++;while((buffer=fgetc(fp))&&(judge_word(buffer)||judge_number(buffer)||buffer=='_')){word+=buffer;row++;}if(feof(fp)){flag=0;return1;}for(inti=1;i<=12;i++){if(word==reserved_word[i]){aa=fseek(fp,-1,SEEK_CUR);//如果执⾏成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。return3;}}aa=fseek(fp,-1,SEEK_CUR);return1;}//开始是加减乘⼀定是类型4elseif(judge_yunsuanfu1(buffer)){word+=buffer;row++;return4;}//开始是数字就⼀定是数字elseif(judge_number(buffer)){word+=buffer;row++;while((buffer=fgetc(fp))&&judge_number(buffer)){word+=buffer;row++;}if(feof(fp)){flag=0;return2;}aa=fseek(fp,-1,SEEK_CUR);return2;}//检验界符elseif(judge_jiefu(buffer))

215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268}269{word+=buffer;row++;return6;}//检验<=、>=、<>、===、<、>elseif(judge_yunsuannfu2(buffer)){row++;word+=buffer;if(buffer=='<')//为了检验题⽬中的<><={buffer=fgetc(fp);if(buffer=='>'||buffer=='='){word+=buffer;row++;return5;}}//检验>===else{buffer=fgetc(fp);if(buffer=='='){word+=buffer;row++;return5;}}if(feof(fp)){flag=0;}aa=fseek(fp,-1,SEEK_CUR);return4;}//⾸字符是/有可能是除号也有可能是注释elseif(buffer=='/'){row++;word+=buffer;buffer=fgetc(fp);aa=fseek(fp,-1,SEEK_CUR);return4;}else{word+=buffer;row++;return-1;}270intmain()271{272273274275276277278279280281282283284285286287288289290291292293294295296297298set_reserve();//设置保留字processor();cout<<"open"<<"afterdel.txt"<<endl;flag=1;FILE*fp;if(!(fp=fopen("afterdel.txt","r"))){cout<<"notfoundthefileorothererror"<<endl;flag=0;}while(flag==1){//flag2返回的类型flag2=scan(fp);//反复调⽤函数提取单词if(flag2==1){cout<<"type:1identifierif(word.length()>20)"<<word<<endl;cout<<"ERRORIdentifierlengthcannotexceed20characters"<<endl;word.erase(word.begin(),word.end());}elseif(flag2==3){cout<<"type:3reservedword"<<word<<endl;word.erase(word.begin(),word.end());

299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337}}elseif(flag2==4){cout<<"type:4unary_operator"<<word<<endl;word.erase(word.begin(),word.end());}elseif(flag2==2){cout<<"type:2positivenumber"<<word<<endl;//if(word[0]=='0')//cout<<"ERROR:Thefirstdigitcannotbe0!"<<endl;word.erase(word.begin(),word.end());}elseif(flag2==6){cout<<"type:6Separator"<<word<<endl;word.erase(word.begin(),word.end());}elseif(flag2==5){cout<<"type:5double_operator<"<word<<endl;word.erase(word.begin(),word.end());}//⾮法字符elseif(flag2==-1){cout<<"Illegalcharacter"<<word<<endl;word.erase(word.begin(),word.end());}}inta=fclose(fp);cout<<"pres

温馨提示

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

评论

0/150

提交评论