编译原理设计c语言词法解析总结器_第1页
编译原理设计c语言词法解析总结器_第2页
编译原理设计c语言词法解析总结器_第3页
编译原理设计c语言词法解析总结器_第4页
编译原理设计c语言词法解析总结器_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

编译原理设计c语言词法分析总结器编译原理设计c语言词法分析总结器18/18编译原理设计c语言词法分析总结器编译原理课程设计报告题目:学院:教师:姓名:学号:班级:评分:署名:编译原理课程设计一:设计c语言的词法剖析器一、实验目的认识高级语言单词的分类,认识状态图以及怎样表示并辨别单词规那么,掌握状态图到识别程序的编程,加深对词法原理的理解。二、实验要求认识高级语言单词的分类,认识状态图以及怎样表示并辨别单词规那么,掌握状态图到识别程序的编程。三、实验设计.单词分类及表示语言的子集分类1〕表记符:以字母开头的字母数字串2〕整数或浮点型。3〕保存字:for,while,do,else,if,static,int,sizeof,break,continue4〕运算符:+,-,*,/,%,>,<,=,!=,==,<=,>=,!,&,&&,||;5〕界符:"(",")",",",":",";","{","}"单词二元组〔单词分类号、单词自己值〕单词分类号表记符1整数或浮点型2保存字3运算符4界符5词法剖析器的设计算法设计纲要设计从文件中逐一读取字符,只需这五大类的状态序列那么持续读取,否那么回退字符,在对应类型进行查找,输出单元二次组至另一文件夹。开始打开txt文件读取c语言代码扫描Y能否读取到Y相应字符Y常数?表记符保存字运算符界符?记录标号结束状态图设计输入输出设计输入:经过文件指针从文件中一个一个读取字符输出:输出单词二元组至文件。格式为〔种别码,值〕主要函数voidGetchar(FILE*fp)//读入一个字符voidGetBC(FILE*fp)//读入一个非空字符voidcontacat()//连结字符intletter()//判断能否为字母intdigit()//判断能否为字母voidretract(FILE*fp,char*c)//回退intreserve(chark)//办理保存字intsysmbol(identifier*id)//办理表记符,查找符号表并寄存地点假定没有那么增添intconstant(constnumber*con)//存入常数表,并返回它在常数表中的地点voidTofile(intnum,intval,identifier*id,constnumber*con,FILE*fw)//写到文件voidWordAnalyze(chark,char*c,charCODE,identifier*id,constnumber*con,FILE*fp,FILE*fw)//词法剖析函数四、结果测试文件输入intmain(){inta=1,b=3;if(a>1)b=b-2;}输出结果:结论:程序输出结果与希望输出结果符合。四、收获与感想经过我本次课程设计掌握了词法剖析器设计的根本方法与有关知识。词法剖析的重点是明确各种字符的状态变换过程。同时协助表记符、常量构造体与保存字表用于查找返回值。同时我也对剖析问题解决问题有了更深入全面的认识与理解。面对一个大的问题,需要理清解决的步骤再将其分解成小的模块逐一解决最后再串连在一同,问题就会变得更简单,思路也会更为清楚。五、实验代码#include<iostream>usingnamespacestd;#defineLENGTH10charch;char*CODE[]={"identifier","constant","keyword"/*保存字*/,"+","-","*","/","<","<=",">",">=","!=","==","=","(",")",",",":",";","{","}"};char*k[]={"for","while","do","else","if","static","int","sizeof","break","continue"};//保存字chartoken[16];//寄存办理后的字符串表记符构造体typedefstruct{char*I[256];intlen;}identifier;typedefstruct{intcont[300];intlen;}constnumber;读入一个字符voidGetchar(FILE*fp){if((ch=getc(fp))==EOF)exit(1);}读入一个非空字符voidGetBC(FILE*fp){while(ch==''||ch=='\n'||ch==9)Getchar(fp);}连结字符voidcontacat(){char*cht=&(ch);strcat_s(token,cht);}判断能否为字母intletter(){returnisalpha(ch);}intdigit(){returnisdigit(ch);}回退voidretract(FILE*fp,char*c){inta=ftell(fp);fseek(fp,0,SEEK_SET);fprintf_s(fp,"%c",ch);ch='';fseek(fp,a,SEEK_SET);}办理保存字intreserve(chark){inti;for(i=0;i<LENGTH;i++){if(strcmp(token,k[i])==0)return(i+1);}return0;}办理表记符,查找符号表并寄存地点假定没有那么增添intsysmbol(identifier*id){inti;for(i=0;i<id->len;i++)if(strcmp(token,id->I[i])==0)returni+1;if(id->len>256){cout<<"error";}id->I[id->len]=token;id->len++;returnid->len;}数字字符串转变为整数intstr_to_num(){inti=0;intk=token[i]-'0';for(i=1;token[i]!='\0';i++){k=k*10+token[i]-'0';}returnk;}存入常数表,并返回它在常数表中的地点intconstant(constnumber*con){con->cont[con->len]=str_to_num();con->len++;returncon->len;}写到文件voidTofile(intnum,intval,identifier*id,constnumber*con,FILE*fw){intnum_=num;fprintf_s(fw,"(%d,",num);if(num>=4)fprintf_s(fw,"%s",CODE[num-1]);if(num<4){switch(num){case1:fprintf_s(fw,"%s",id->I[val-1]);break;case2:fprintf_s(fw,"%d",con->cont[val-1]);break;case3:fprintf_s(fw,"%s",k[val-1]);break;}}fprintf_s(fw,")\n");}voiderror(FILE*fw){cout<<"(Error,"<<ch<<")"<<endl;fprintf_s(fw,"(Error,%c\n)",ch);}//词法剖析函数voidWordAnalyze(chark,char*c,charCODE,identifier*id,constnumber*con,FILE*fp,FILE*fw){intnum,val;strcpy_s(token,"");//初始化为空字符串Getchar(fp);GetBC(fp);if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))//剖析表记符和保存字{假定字符为A~Z或0~9,那么持续读取while(letter()||digit()){contacat();Getchar(fp);}retract(fp,c);num=reserve(k);if(num!=0)Tofile(3,num,id,con,fw);else{val=sysmbol(id);Tofile(1,val,id,con,fw);}}elseif(digit())//办理常数{while(digit()){contacat();Getchar(fp);}retract(fp,c);val=constant(con);Tofile(2,val,id,con,fw);}else//剖析符号{switch(ch){case'<':Getchar(fp);if(ch=='=')Tofile(9,0,id,con,fw);else{retract(fp,c);Tofile(8,0,id,con,fw);}break;case'>':Getchar(fp);if(ch=='=')Tofile(11,0,id,con,fw);else{retract(fp,c);Tofile(10,0,id,con,fw);}break;case'=':Getchar(fp);if(ch=='=')Tofile(13,0,id,con,fw);else{retract(fp,c);Tofile(14,0,id,con,fw);}break;case'!':Getchar(fp);if(ch=='=')Tofile(12,0,id,con,fw);elseerror(fw);break;case'+':Tofile(4,0,id,con,fw);break;case'-':Tofile(5,0,id,con,fw);break;case'*':Tofile(6,0,id,con,fw);break;case'/':Tofile(7,0,id,con,fw);break;case'(':Tofile(15,0,id,con,fw);break;case')':Tofile(16,0,id,con,fw);break;case',':Tofile(17,0,id,con,fw);break;case':':Tofile(18,0,id,con,fw);break;case';':Tofile(19,0,id,con,fw);break;case'{':Tofile(20,0,id,con,fw);break;case'}':Tofile(21,0,id,con,fw);break;default:error(fw);}}}intmain(){charc[100]="";FILE*fp,*fw;errno_terr;err=fopen_s(&fp,c,"r");if(err!=0){printf("Thefilewasnotopened\n");exit(0);}errno_terr1;err1=fopen_s(&fw,"","w");if(err1!=0){printf("Thefilewasnotopened\n");exit(0);}identifier*id=(identif

温馨提示

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

评论

0/150

提交评论