收藏 分销(赏)

编译原理实验报告-编写词法分析程序.doc

上传人:仙人****88 文档编号:12072961 上传时间:2025-09-06 格式:DOC 页数:8 大小:189.50KB 下载积分:10 金币
下载 相关 举报
编译原理实验报告-编写词法分析程序.doc_第1页
第1页 / 共8页
编译原理实验报告-编写词法分析程序.doc_第2页
第2页 / 共8页


点击查看更多>>
资源描述
编译原理实验报告 实验名称: 编写词法分析程序 实验类型: 验证型实验 指导教师: 专业班级: 姓名: 学号: 电子邮件: 实验地点: 实验成绩: 日期:201 年 4 月 20 日 一、 实验目的 通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法; 熟悉词法分析程序所用的工具自动机,进一步理解自动机理论; 掌握文法转换成自动机的技术及有穷自动机实现的方法; 确定词法分析器的输出形式及标识符与关键字的区分方法; 加深对课堂教学的理解; 提高词法分析方法的实践能力; 通过本实验,应达到以下目标: 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、 实验过程 先思考如何实现,画出流程图,然后变成实现所需功能。 流程图如下: 三、实验结果 词法分析实验成功。 四、讨论与分析 本以为这个程序会很难,没想到真正写起来感觉还不错。 主要是要先画好流程图,有个自己的思路,这样才好进行下一步。 流程图很关键,一方面在自己写起来的时候,思路清晰,明了;另一方面,也可以让别人很轻松的看懂你的程序思想。 五、附录:关键代码(给出适当注释,可读性高) #include<stdio.h> #include<ctype.h> #include <string.h> //保留字表 char* keyword[8] = {"if","else","for","while","do","int","read","write"}; //纯单分界符 char singleword[50] = "+-*(){};,:#&|"; //双分界符 char doubleword[10] = "><=!&"; //用于接收输入输出文件名 char Scanin[300],Scanout[300]; //用于指向输入输出文件的指针 FILE* fin,* fout; //词法分析函数 int TESTscan() { char ch,token[40]; int es = 0,j,n; printf("请输入源程序文件名(包括路径):"); scanf("%s",Scanin); printf("请输入词法分析输出文件名(包括路径):"); scanf("%s",Scanout); if((fin = fopen(Scanin,"r")) == NULL) { printf("\n打开词法分析输入文件出错!\n"); es=1; } if((fout = fopen(Scanout,"w")) == NULL) { printf("\n创建词法分析输出文件出错!\n"); es=2; } ch = getc(fin); while(ch!=EOF) { while(ch==' '||ch=='\n'||ch=='\t') ch=getc(fin); if(isalpha(ch)) { token[0] = ch; j = 1; ch = getc(fin); while(isalnum(ch)) { token[j++] = ch; ch = getc(fin); } token[j] = '\0'; n = 0; while((n<8)&&strcmp(token,keyword[n])) n++; if(n >= 8) { fprintf(fout,"%s\t%s\n","标识符",token); printf("%s\t%s\n","标识符",token); } else //是保留字 输出保留字 { fprintf(fout,"%s\t%s\n","保留字",token); printf("%s\t%s\n","保留字",token); } } else if(isdigit(ch)) { token[0] = ch; j = 1; ch = getc(fin); while(isdigit(ch)) { token[j++] = ch; ch = getc(fin); } token[j] = '\0'; fprintf(fout,"%s\t%s\n","无符号整数",token); printf("%s\t%s\n","无符号整数",token); } else if(strchr(singleword,ch)>0) { token[0] = ch; token[1] = '\0'; ch = getc(fin); fprintf(fout,"%s\t%s\n","单分界符",token); printf("%s\t%s\n","单分界符",token); } else if(strchr(doubleword,ch)>0) { token[0] = ch; ch = getc(fin); if(ch == '=') { token[1] = ch; token[2] = '\0'; ch = getc(fin); } else if(ch == '&') { token[1] = ch; token[2] = '\0'; ch = getc(fin); } else token[1] = '\0'; fprintf(fout,"%s\t%s\n","双分界符",token); printf("%s\t%s\n","双分界符",token); } else if(ch=='/') { ch = getc(fin); if(ch == '*') { char ch1; ch1 = getc(fin); do { ch = ch1; ch1 = getc(fin); } while((ch !='*'||ch1 != '/')&&(ch1 !=EOF)); ch = getc(fin); } else { token[0] = '/'; token[1] = '\0'; fprintf(fout,"%s\t%s\n","单分界符",token); printf("%s\t%s\n","单分界符",token); } } else { token[0] = ch; token[1] = '\0'; ch = getc(fin); es = 0; fprintf(fout,"%s\t%s\n","ERROR",token); printf("%s\t%s\n","ERROR",token); } } fclose(fin); fclose(fout); return es; } int main() { int es = 0; es = TESTscan(); if(es>0) printf("词法分析有错!\n"); else printf("词法分析成功!\n"); return 0; } 六、实验者自评 这次最大的收获就是学会画流程图。先给自己一个明确思路,再进行下一步。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服