您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 编译原理-设计c语言的词法分析器
编译原理课程设计报告题目:学院:教师:姓名:学号:班级:评分:签字:编译原理课程设计一:设计c语言的词法分析器一、实验目的了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程,加深对词法原理的理解。二、实验要求了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。三、实验设计3.1.单词分类及表示3.1.1C语言的子集分类(1)标识符:以字母开头的字母数字串(2)整数或浮点型。(3)保留字:for,while,do,else,if,static,int,sizeof,break,continue(4)运算符:+,-,*,/,%,,,=,!=,==,=,=,!,&,&&,||;(5)界符:(,),,,:,;,{,}3.1.2单词二元组(单词分类号、单词自身值)单词分类号标识符1整数或浮点型2保留字3运算符4界符53.2词法分析器的设计3.2.1算法设计3.2.1.1概要设计从文件中逐个读取字符,只要这五大类的状态序列则继续读取,否则回退字符,在对应类别进行查找,输出单元二次组至另一文件夹。开始打开txt文件读取c语言代码扫描是否读取到相应字符常数?标识符保留字运算符记录标号结束界符?YYY3.2.1.2状态图设计3.2.2输入输出设计输入:通过文件指针从文件中一个一个读取字符输出:输出单词二元组至文件。格式为(种别码,值)3.2.3主要函数voidGetchar(FILE*fp)//读入一个字符voidGetBC(FILE*fp)//读入一个非空字符voidcontacat()//连接字符intletter()//判断是否为字母intdigit()//判断是否为字母voidretract(FILE*fp,char*c)//回退intreserve(char**k)//处理保留字intsysmbol(identifier*id)//处理标识符,查找符号表并存放位置若没有则添加intconstant(constnumber*con)//存入常数表,并返回它在常数表中的位置voidTofile(intnum,intval,identifier*id,constnumber*con,FILE*fw)//写到文件voidWordAnalyze(char**k,char*c,char**CODE,identifier*id,constnumber*con,FILE*fp,FILE*fw)//词法分析函数四、结果测试文件输入intmain(){inta=1,b=3;if(a1)b=b-2;}输出结果:结论:程序输出结果与期望输出结果相符。四、收获与感想通过我本次课程设计掌握了词法分析器设计的基本方法与相关知识。词法分析的关键是明确各类字符的状态转换过程。同时辅助标识符、常量结构体与保留字表用于查找返回值。同时我也对分析问题解决问题有了更深入全面的认识与理解。面对一个大的问题,需要理清解决的步骤再将其分解成小的模块逐个解决最后再串联在一起,问题就会变得更容易,思路也会更加清晰。五、实验代码#includeiostreamusingnamespacestd;#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(char**k){inti;for(i=0;iLENGTH;i++){if(strcmp(token,k[i])==0)return(i+1);}return0;}//处理标识符,查找符号表并存放位置若没有则添加intsysmbol(identifier*id){inti;for(i=0;iid-len;i++)if(strcmp(token,id-I[i])==0)returni+1;if(id-len256){couterror;}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(num4){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(char**k,char*c,char**CODE,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]=F://1.txt;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,F://2.txt,w);if(err1!=0){printf(Thefilewasnotopened\n);exit(0);}identifier*id=(identifier*)malloc(sizeof(identifier));id-len=0;constnumber*con=(constnumber*)malloc(sizeof(constnumber));con-len=0;WordAnalyze(k,c,CODE,id,con,fp,fw);while(1){WordAnalyze(k,c,CODE,id,con,fp,fw);if(feof(fp))break;}fclose(fw);fclose(fp);return0;}
本文标题:编译原理-设计c语言的词法分析器
链接地址:https://www.777doc.com/doc-1615882 .html