湖南农业大学信息科学技术学院学生实验报告姓名:年级专业班级日期年月日成绩课程名称编译原理实验实验名称源程序的输入和扫描实验类型设计性【实验目的、要求】理解源程序被编译器读取的过程,掌握扫描程序的编写方法。【实验内容】编制一个源程序的输入过程,从键盘、文件或文本框输入若干行语句,依次存入输入缓冲区(字符型数据);并编制一个扫描子程序,该子程序中每次调用能依次从存放源程序的输入缓冲区中读出一个有效字符。【实验环境】计算机CodeBlocks【实验步骤、过程】1功能描述扫描一段源程序,经字符分析后分离出关键字、标识符、运算符、常数和分隔符,并分行显示。2程序结构描述从文本中读入源程序。利用flag标志记录当前字符的下一个字符的属性(如为空格flag就为0,为分隔符就为-1等)。并用结构体MySplit存储当前字符和其下一位标志flag。用while循环依次读入每个字符并判断。字符串暂存在buf_string中。以判断字符是否结束分为以空格结束,以分隔符结束,以注释结束,以运算符和其他字符合并结束,以及以字符结束。做不同处理。最后再分行显示。3流程图(或原理图)Flag=-1YNFlag=0Flag=-2YNYFlag=1NY4关键代码源程序://源程序输入和扫描#includestdio.h#includemalloc.h源程序Buff-text[]MySplit结构体数组While循环下一个是分隔符?下一个是空格?下一个是注释?下一个是字符?结束structMySplit{charc;charc_next;intflag;};intMygetchar(MySplit);intmain(intargc,char*argv[]){char*buf_text;//用来暂存键盘输入的文本char*buf_string;//用来暂存一个字符串的(如一个关键字)MySplit*x;buf_text=(char*)malloc(sizeof(char)*50);//文本有多少个字母、数字、符号buf_string=(char*)malloc(sizeof(char)*10);//存储当前标识符、关键字x=(MySplit*)malloc(sizeof(MySplit)*50);for(inti=0;i50;i++)buf_text[i]='\0';for(intg=0;g10;g++)buf_string[g]='\0';charc;intj=0;intk=0;intl=0;intm=0;FILE*fp=fopen(test.txt,r);//当前文件夹内名为test的txt文件printf(***************************************\n);printf(源文件:\n);c=fgetc(fp);while(c!=EOF)//一个字符一个字符的读入{putchar(c);buf_text[j]=c;j++;c=fgetc(fp);}fclose(fp);printf(***************************************\n);printf(经扫描后的源文件如下:\n);while(kj){x[k].c=buf_text[k];x[k].c_next=buf_text[k+1];x[k].flag=Mygetchar(x[k]);//将当前x是否是最后一个字符的标示flag进行存储k++;}while(lj){if(x[l].flag==-1)//该字符的下一个是分隔符{if(x[l-1].flag==0)//该字符本身是空格{}else{buf_string[m]=x[l].c;printf(%s\n,buf_string);for(intg=0;g10;g++)buf_string[g]='\0';m=0;}}elseif(x[l].flag==0)//该字符的下一个是空格{if(x[l-1].flag==0)//该字符本身是空格{}else{buf_string[m]=x[l].c;printf(%s\n,buf_string);for(intg=0;g10;g++)buf_string[g]='\0';m=0;}l++;//越过空格}elseif(x[l-1].flag==-1&&x[l].flag==1)//该字符是符号且后紧跟字母或数字(如=b或,b){buf_string[m]=x[l].c;printf(%s\n,buf_string);for(intg=0;g10;g++)buf_string[g]='\0';m=0;}elseif(x[l].flag==-2)//该字符的下一个是注释起始{if(x[l-1].flag==0)//该字符本身是空格{}else{if(x[l-1].flag==1||x[l-1].flag==-1)//如果注释是紧贴着该行代码的{buf_string[m]=x[l].c;printf(%s\n,buf_string);for(intg=0;g10;g++)buf_string[g]='\0';}else{}while(x[l+1].c!=10)//未到回车l++;}}else//该字符的下一个是某字符串中间的一个字符或最后一个字符{if(x[l-1].flag==0)//该字符是空格{}else{buf_string[m]=x[l].c;m++;}}l++;}printf(***************************************\n);}intMygetchar(MySplitx){switch(x.c_next){case'':return0;break;//空格case10:return0;break;//回车case'/':return-2;break;//注释case'{':return-1;break;case'}':return-1;break;case'(':return-1;break;case')':return-1;break;case',':return-1;break;case';':return-1;break;case'=':return-1;break;case'+':return-1;break;default:return1;break;}}【实验结果和总结】(对实验结果进行相应分析,或总结实验的心得体会,并提出实验的改进意见)1实验结果记录(截图)2实验总结遇到的问题所用的时间所用方法和手段以及心得体会1.通过本次实验,自己收获颇多。对于源程序的输入和扫描有了进一步了解,提高自己的变成水平。2.利用结构体存储了一个单链表MySplit用于标记下一个字符的属性,并使用while循环处理单个字符存入buf_string中,最后再分行显示。指导教师签名:20年月日【备注】