源程序的输入和扫描.doc

上传人:xin****828 文档编号:6678396 上传时间:2020-03-02 格式:DOC 页数:6 大小:48KB
返回 下载 相关 举报
源程序的输入和扫描.doc_第1页
第1页 / 共6页
源程序的输入和扫描.doc_第2页
第2页 / 共6页
源程序的输入和扫描.doc_第3页
第3页 / 共6页
点击查看更多>>
资源描述
湖南农业大学信息科学技术学院学 生 实 验 报 告姓名: 年级专业班级 日期 年 月 日 成绩 课程名称编译原理实验实验名称源程序的输入和扫描 实验类型设计性【实验目的、要求】理解源程序被编译器读取的过程,掌握扫描程序的编写方法。【实验内容】编制一个源程序的输入过程,从键盘、文件或文本框输入若干行语句,依次存入输入缓冲区(字符型数据);并编制一个扫描子程序,该子程序中每次调用能依次从存放源程序的输入缓冲区中读出一个有效字符。【实验环境】计算机 CodeBlocks【实验步骤、过程】1 功能描述 扫描一段源程序,经字符分析后分离出关键字、标识符、运算符、常数和分隔符,并分行显示。2 程序结构描述从文本中读入源程序。利用flag标志记录当前字符的下一个字符的属性(如为空格flag就为0,为分隔符就为-1等)。并用结构体MySplit存储当前字符和其下一位标志flag。用while循环依次读入每个字符并判断。字符串暂存在buf_string中。以判断字符是否结束分为以空格结束,以分隔符结束,以注释结束,以运算符和其他字符合并结束,以及以字符结束。做不同处理。最后再分行显示。3 流程图(或原理图)源程序Buff-textMySplit结构体数组While循环下一个是分隔符? Flag=-1 Y N Flag=0下一个是空格? Flag=-2 Y下一个是注释? N Y Flag=1 下一个是字符? N Y结束4 关键代码源程序:/源程序输入和扫描#include#includestruct MySplitchar c;char c_next;int flag;int Mygetchar(MySplit);int main(int argc,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(int i = 0;i50;i+)buf_texti = 0;for(int g = 0;g10;g+)buf_stringg = 0;char c;int j = 0;int k = 0;int l = 0;int m = 0;FILE *fp = fopen(test.txt,r);/当前文件夹内名为test的txt文件printf(*n);printf(源文件:n);c = fgetc(fp);while( c!= EOF)/一个字符一个字符的读入putchar(c);buf_textj = c;j+;c = fgetc(fp);fclose(fp);printf(*n);printf(经扫描后的源文件如下:n);while(k j)xk.c = buf_textk;xk.c_next = buf_textk+1;xk.flag = Mygetchar(xk);/将当前x是否是最后一个字符的标示flag进行存储k+;while(l j)if(xl.flag = -1)/该字符的下一个是分隔符if(xl-1.flag = 0)/该字符本身是空格elsebuf_stringm = xl.c;printf(%sn,buf_string);for(int g = 0;g10;g+)buf_stringg = 0;m = 0;else if(xl.flag = 0)/该字符的下一个是空格if(xl-1.flag = 0)/该字符本身是空格elsebuf_stringm = xl.c;printf(%sn,buf_string);for(int g = 0;g10;g+)buf_stringg = 0;m = 0;l+;/越过空格else if(xl-1.flag = -1 & xl.flag = 1)/该字符是符号且后紧跟字母或数字(如=b或,b)buf_stringm = xl.c;printf(%sn,buf_string);for(int g = 0;g10;g+)buf_stringg = 0;m = 0;else if(xl.flag = -2)/该字符的下一个是注释起始if(xl-1.flag = 0)/该字符本身是空格elseif(xl-1.flag = 1 | xl-1.flag = -1)/如果注释是紧贴着该行代码的buf_stringm = xl.c;printf(%sn,buf_string);for(int g = 0;g10;g+)buf_stringg = 0;elsewhile(xl+1.c != 10)/未到回车l+;else/该字符的下一个是某字符串中间的一个字符或最后一个字符if(xl-1.flag = 0)/该字符是空格elsebuf_stringm = xl.c;m+;l+;printf(*n);int Mygetchar(MySplit x)switch(x.c_next)case : return 0;break;/空格case 10:return 0;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 : return 1;break; 【实验结果和总结】(对实验结果进行相应分析,或总结实验的心得体会,并提出实验的改进意见)1 实验结果记录 (截图) 2 实验总结 遇到的问题 所用的时间 所用方法和手段以及心得体会1. 通过本次实验,自己收获颇多。对于源程序的输入和扫描有了进一步了解,提高自己的变成水平。2. 利用结构体存储了一个单链表MySplit用于标记下一个字符的属性,并使用while循环处理单个字符存入buf_string中,最后再分行显示。指导教师签名: 20 年 月 日【备注】
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 临时分类 > 人文社科


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!