您好,欢迎访问三七文档
编译原理实验报告姓名:学号:班级:实验时间:实验一:词法分析设计一、实验性质和目的(1)深刻理解程序语言编译系统的结构及各部分的功能。(2)熟练掌握设计和构造程序语言编译系统的基本原理和技术。(3)能独立编写清晰、工整、结论正确的编译原理的源程序。(4)能学会上机进行正确调试,并进行程序修改。即培养发现程序错误,排除错误的能力和经验。二、数据结构及生成算法描述1.利用结构体类型存储所有的表。2.定义以下函数:1)boolischar(charc)//判断是否为关系运算符;2)boolIsDigit(charc)//判断是否为数字;3)boolisInTable1(char*c)//在关键字表中查找;4)boolisInTable2(charc)//判断是否为分界符;5)boolisInTable3(charc)//算符表中查找输出算符;6)boolisintable3(charc)//是否为算符;7)boolisInTable4(char*c)//判断是否为关系运算符;8)boolisInTable5(char*c)//判断是否在标识符表中;9)boolisInTable6(char*c)//判断是否在常数表中;10)boolIsLetter(charc)//判断是否为字母;11)boolIsnoshow(charc)//判断是否为空格,\t,\n;12)chargetChar()//读入字符;13)intinput()//读入c语言程序;14)voidConcat(charc)//连接;15)voidinit()//初始化构建表;16)voidinsert5(char*c)//插入;17)voidinsert6(char*c)//类似标识符插入;18)voidout()//输出构建表中的数据;19)intinput()//读入c语言程序;20)voidrun()//词法分析;3.定义全局变量1)charch;//全局变量ch用于读入字符;2)charinstring[100];//输入语句;3)charstrToken[10];//字符串缓冲数组;4)intcode=0,step=0,value=1;//code用于控制读入字符的位置,step标记列,value标记行;5)table1t1[8];table2t2[6];table3t3[4];table4t4[6];table5t5[10];table6t6[10];//表的声明4.算法分析:1)初始化;2)移进下一字符3)循环判断整体:查找标识符或关键字;判断是否为关键字或标识符,并进行相应的移进操作;判断是否为算符;断是否为关系运算符;循环判断常数;若果换行,则行加一,列清零;错误。三、算法流程图四、打印出源程序代码和给出测试的结果(运行环境devc++5.0)#includeiostream#includestring#includefstreamusingnamespacestd;charinstring[100];//输入语句intcode=0,step=0,value=1;//code用于控制读入字符的位置,step标记列,value标记行charstrToken[10];//字符串缓冲数组charch;//全局变量ch用于读入字符structtable1//关键字表{charc[10];inta;};structtable2//分界符表{charc[2];inta;};structtable3//算符表{charc[2];inta;};structtable4//关系运算符表{charc[2];inta;};structtable5//标识符表{charc[10];inta;};structtable6//常数表{charc[10];inta;};table1t1[8];//表的声明table2t2[6];table3t3[4];table4t4[6];table5t5[10];table6t6[10];voidinit()//初始化构建表{inti=0;fstreamfile1(t1.txt,ios::in);//打开文件1,2,3,4从文件中读取数据if(!file1){cerropenerror!endl;exit(1);}fstreamfile2(t2.txt,ios::in);if(!file2){cerropenerror!endl;exit(1);}fstreamfile3(t3.txt,ios::in);if(!file3){cerropenerror!endl;exit(1);}fstreamfile4(t4.txt,ios::in);if(!file4){cerropenerror!endl;exit(1);}do{file1.getline(t1[i].c,10,'\n');//关键字表t1[i].a=1;i++;}while(!file1.eof());i=0;do{file2.getline(t2[i].c,2,'\n');//分界符表t2[i].a=2;i++;}while(!file2.eof());i=0;do{file3.getline(t3[i].c,2,'\n');//算符表t3[i].a=3;i++;}while(!file3.eof());i=0;do{file4.getline(t4[i].c,3,'\n');//关系运算符表t4[i].a=4;i++;}while(!file4.eof());file1.close();//关闭文件file2.close();file3.close();file4.close();for(inti=0;i10;i++)//初始化表5,6{t5[i].a=0;t5[i].c[0]='';t6[i].a=0;t6[i].c[0]='';}}voidout()//输出构建表中的数据{for(inti=0;i8;i++)coutt1[i].ct1[i].aendl;for(inti=0;i6;i++)coutt2[i].ct2[i].aendl;for(inti=0;i4;i++)coutt3[i].ct3[i].aendl;for(inti=0;i6;i++)coutt4[i].ct4[i].aendl;for(inti=0;t5[i].a!=0;i++)coutt5[i].ct5[i].aendl;for(inti=0;t6[i].a!=0;i++)coutt6[i].ct6[i].aendl;}intinput()//读入c语言程序{inti=0;fstreamfile(1.txt,ios::in);if(!file){cerropenerror!endl;exit(1);}do{instring[i]=file.get();//逐个读入i++;}while(!file.eof());//结束file.close();returni;//返回字符个数}chargetChar()//读入字符{charc=instring[code];code++;//移进一位returnc;}boolIsnoshow(charc)//判断是否为空格,\t,\n{if(c=='\n'||c=='\t'||c=='')returntrue;returnfalse;}boolIsLetter(charc)//判断是否为字母{if(((c='a')&&(c='z'))||((c='A')&&(c='Z')))returntrue;returnfalse;}boolIsDigit(charc)//判断是否为数字{if((c='0')&&(c='9'))returntrue;returnfalse;}boolischar(charc)//判断是否为关系运算符{if((c=='=')||(c=='')||(c==''))returntrue;returnfalse;}boolisInTable1(char*c)//在关键字表中查找{inti=0;boolflag=true;for(;i8;i++){flag=true;for(intj=0;c[j]!='';j++)//循环查找{if(t1[i].c[j]!=c[j])//逐位比较,此处用strcmp有问题flag=false;if(c[1]=='')flag=false;}if(flag)//找到{coutt1[i].c(t1[i].a,t1[i].c)关键字;//输出returntrue;}}returnfalse;}boolisInTable2(charc)//判断是否为分界符{for(inti=0;i6;i++)//循环查找,找到则输出if(c==t2[i].c[0]){coutt2[i].c(t2[i].a,t2[i].c)分界符;returntrue;}returnfalse;}boolisintable3(charc)//是否为算符{for(inti=0;i4;i++)//循环查找,找到则输出if((c==t3[i].c[0]))returntrue;returnfalse;}boolisInTable3(charc)//算符表中查找输出,算符{for(inti=0;i4;i++)//循环查找,找到则输出if((c==t3[i].c[0])){coutt3[i].c(t3[i].a,t3[i].c)算符;returntrue;}returnfalse;}boolisInTable4(char*c)//判断是否为关系运算符{for(inti=0;i6;i++)//循环查找,找到则输出,逐位比较,不能用strcmp()函数{if(((t4[i].c[0]==c[0])&&(c[1]==''))||((t4[i].c[0]==c[0])&&(t4[i].c[1]==c[1]))){coutt4[i].c(t4[i].a,t4[i].c)关系运算符;returntrue;}}returnfalse;}boolisInTable5(char*c)//判断是否在标识符表中{boolflag=true;for(inti=0;i10;i++)//类似于查找关键字{flag=true;for(intj=0;c[j]!='';j++){if(t5[i].c[j]!=c[j])flag=false;}if(flag){for(intj=0;t5[i].c[j]!='';j++)coutt5[i].c[j];cout(t5[i].a,;for(intj=0;t5[i].c[j]!='';j++)coutt5[i].c[j];cout)标识符;returntrue;}}returnfalse;}voidinsert5(char*c)//插入{for(inti=0;i10;i++)//不在标识符表中,则添加进去if(t5[i].a==0){for(intj=0;j10;j++)t5[i].c[j]=c[j];t5[i].a=i+1;for(intj=0;t5[i].c[j]!='';j++)coutt5[i].c[j];cout(t5[i].a,;for(intj=0;t5[i].c[j]!='';j++)coutt5[i].c[j];cout)标识符;return;}}boolisInTable6(char*c)//判断是否在常数表中{boolflag=true;//类似标识符查找for(inti=0;i10;i++){flag=true;for(intj=0;c[j]!='';j+
本文标题:编译原理实验报告
链接地址:https://www.777doc.com/doc-3854795 .html