您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > C语言词法分析器构造实验报告
编译原理C语言词法分析器构造学院:信工班级:140学号:201114002姓名:马鹏程指导教师:张帆2014年6月12日一、实验题目:编译原理词法分析二、实验内容:2.1主程序设计考虑:主程序的说明部分为各种表格和变量安排空间(关键字和特殊符号表)。id和ci数组分别存放标识符和常数;还有一些为造表填表设置的变量。主程序的工作部分建议设计成便于调试的循环结构。每个循环处理一个单词;调用词法分析过程;输出每个单词的内部码(种别编码,属性值)。建议从文件中读取要分析的符号串。2.2词法分析过程考虑该过程根据输入单词的第一个有效字符(有时还需读第二个字符),判断单词种别,产生种别编码。对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id中,将常数存入数组中ci中,并记录其在表中的位置。注:所有识别出的单词都用二元组表示。第一个表示单词的种别编码。例如:关键字的t=1;标识符的t=2;常数t=3;运算符t=4;界符t=5。第二个为该单词在各自表中的指针或内部码值(常数表和标识符表是在编译过程中建立起来的。其i值是根据它们在源程序中出现的顺序确定的)。关键字和特殊符号如下(表中数字只是标记,不代表种别编码,种别编码自己定义):编号12345678910名字intcharfloatvoidconstifelsedowhilescanf编号11121314151617181920名字printfreturnmainread+–*/%=编号21222324252627282930名字==!===&&||!编号31323334353637383940名字(){};,“‘++--将词法分析程序设计成独立一遍扫描源程序的结构。其主流程图如下:入口开工操作读源程序字符是字母?是数字?其它单词分析程序输出单词的内部表示是有字符?出口关键字和标识符分析程序常数分析程序NYYNNY图1词法分析程序流程图三、程序源代码:#includestdafx.h#includeiostream#includestring#includemath.h#includefstreamusingnamespacestd;//关键字结构体structkey{stringkey_word;intbm;stringzjf;};//界符结构体structJF{charjf_ch;intbm;stringzjf;};//运算符结构体structysf{stringysf_w;intbm;stringzjf;};//得到关键字字母表voidfuc_K_table(keyK_w[]){inti=0;ifstreaminfile(E:\\cffx\\key.txt,ios::in);if(!infile){cerropenerror!endl;}for(i=0;i12;i++){infileK_w[i].key_word;infileK_w[i].bm;infileK_w[i].zjf;}infile.close();}//得到界符字母表voidfuc_JF_table(JFJ_CHAR[]){inti=0;ifstreaminfile(E:\\cffx\\jf.txt,ios::in);if(!infile){cerropenerror!endl;}for(i=0;i9;i++){infileJ_CHAR[i].jf_ch;infileJ_CHAR[i].bm;infileJ_CHAR[i].zjf;}infile.close();}//得到运算符表voidfuc_ysf_table(ysfYSF_W[]){inti=0;ifstreaminfile(E:\\cffx\\ysf.txt,ios::in);if(!infile){cerropenerror!endl;}for(i=0;i18;i++){infileYSF_W[i].ysf_w;infileYSF_W[i].bm;infileYSF_W[i].zjf;}infile.close();}//查找是否为保留字intReserve(stringstrToken,keyK_w[]){inti=0;for(i=0;i12;i++)if(strToken==K_w[i].key_word)returnK_w[i].bm;if(i=12)return-1;}//查找是否为界符intReservejf(charch,JFJ_CHAR[]){inti=0;for(i=0;i9;i++)if(ch==J_CHAR[i].jf_ch)returnJ_CHAR[i].bm;if(i=9)return-1;}//查找是否为运算符intReserveysf(stringstrToken,ysfYSF_W[]){inti=0;for(i=0;i18;i++)if(strToken==YSF_W[i].ysf_w)returnYSF_W[i].bm;if(i=18)return-1;}//将strToken中的常数插入常数表intInsertConst(stringstrToken,keyK_w[]){inti=0,j=0,m=0;while(strToken[i]!='\0')i++;for(j=0;ji;j++)m=10*m+((int)strToken[j]-48);returnm;}//判断是否为字母boolIsLetter(charch){if((ch=97&&ch=122)||(ch=65&&ch=90))returntrue;elsereturnfalse;}//判断是否为数字boolIsDigit(charch){if((ch=48&&ch=57))returntrue;elsereturnfalse;}//判断是否为界符boolIsJF(charch){switch(ch){case'{':case'}':case'[':case']':case'(':case')':case';':case',':case'':returntrue;default:returnfalse;}}//判断是否为运算符boolIsYSF(charch){boolre=false;switch(ch){case'':case'':case'=':case'+':case'-':case'*':case'/':case'%':case'&':case'|':case'!':case'':{re=true;break;}}returnre;}//主函数intmain(intargc,char*argv[]){keyK_w[12];JFJ_CHAR[9];ysfYSF_W[18];fuc_K_table(K_w);fuc_JF_table(J_CHAR);fuc_ysf_table(YSF_W);inti=0;cout关键字种别编码表:endl;for(i=0;i12;i++)coutK_w[i].key_wordK_w[i].bmendl;cout界符种别编码表:endl;for(i=0;i9;i++)coutJ_CHAR[i].jf_chJ_CHAR[i].bmendl;cout运算符种别编码表:endl;for(i=0;i18;i++)coutYSF_W[i].ysf_wYSF_W[i].bmendl;cout常数的种别编码为:50endl;cout普通标识符的种别编码为:51endl;FILE*fp;fp=fopen(E:\\cffx\\f1.txt,r);cout词法分析器输出结果为:endl;charch;intdigit=0;stringstrToken;if(fp==NULL){couterror;exit(0);}else{while(ch!='#'){strToken=\0;ch=fgetc(fp);if(ch==''||ch=='\t'||ch=='\n'){}elseif(IsLetter(ch)){while(IsLetter(ch)||IsDigit(ch)){strToken=strToken+ch;ch=fgetc(fp);}fseek(fp,-1L,SEEK_CUR);i=Reserve(strToken,K_w);if(i-1)cout'('strToken','i')'endl;elsecout'('strToken,51)endl;}elseif(IsDigit(ch)){while(IsDigit(ch)){strToken=strToken+ch;ch=fgetc(fp);}fseek(fp,-1L,SEEK_CUR);digit=InsertConst(strToken,K_w);cout'('digit,50')'endl;}elseif(IsJF(ch)){intjfcount=Reservejf(ch,J_CHAR);cout'('ch','jfcount')'endl;}elseif(IsYSF(ch)){while(IsYSF(ch)){strToken=strToken+ch;ch=fgetc(fp);}fseek(fp,-1L,SEEK_CUR);i=Reserveysf(strToken,YSF_W);if(i-1)cout'('strToken','i')'endl;elsecout输入符号错误!endl;}}fclose(fp);}return0;}四、实验截图:F1中是数据为:实验结果为:五、实验总结:这个程序主要参考书上关于词法分析器的设计。在设计过程中仍有遇到很多困难,但经请教同学后,好多问题都并不是想象中的困难。尽管如此,分析考虑还不全面,例如没有创建符号表和常数表。这些情况将在在语法和语义分析时进行完善。
本文标题:C语言词法分析器构造实验报告
链接地址:https://www.777doc.com/doc-6280043 .html