版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编译原理实验-词法分析器⼀、实验⽬的设计、编制、调试⼀个词法分析程序,对单词进⾏识别和编码,加深对词法分析原理的理解。⼆、实验内容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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 齐齐哈尔大学《机械精度设计基础》2023-2024学年第一学期期末试卷
- 2024年专业月嫂服务协议模板
- 药品装卸合同范本
- 电梯电子广告投放合同范本
- 动物转让合同范本
- 2024正式员工聘用协议模板
- 培训加盟合同范本
- 台历制作合同范本
- 2024年气体检测仪市场前景分析:全球气体检测仪市场规模为48.2亿美元
- 土地合作合同范本
- 成人住院患者静脉血栓栓塞症Caprini、Padua风险评估量表
- 小班安全我要跟着老师走
- (正式版)JBT 14795-2024 内燃机禁用物质要求
- 基于核心素养初中数学跨学科教学融合策略
- 200TEU 长江集装箱船设计
- 办公楼物业服务管理的培训
- 智慧能源管理平台建设项目解决方案
- JTG∕T F30-2014 公路水泥混凝土路面施工技术细则
- 2024年高中语文学业水平过关测试四-名句名篇默写积累过关训练(全国通用)学生版
- 糖尿病性舞蹈病
- 医学类-教学查房异位妊娠(宫外孕)
评论
0/150
提交评论