CP实验一词法分析程序.doc_第1页
CP实验一词法分析程序.doc_第2页
CP实验一词法分析程序.doc_第3页
CP实验一词法分析程序.doc_第4页
CP实验一词法分析程序.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

河南工业大学实验报告课 程 编译原理 实验名称 实验一 词法分析 院 系_信息科学与工程学院 _ 专业班级_ 计科F1301 _ 姓 名_ 司如言_ 学 号_ 201316010508_ 指导老师: 王 峰 日 期 2016/4/23 一. 实验目的1. 深入理解有限自动机及其应用;2. 掌握根据语言的词法规则构造识别其单词的有限自动机的方法;3. 基本掌握词法分析程序的开发。二. 实验内容及要求编制一个词法分析程序,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出由各个单词的内部编码及单词符号自身值所组成的二元式序列。三. 实验环境PC机一台Windows操作系统实验语言: C语言Code:Blocks 集成开发环境四. 实验过程及结果l 过程一:编写实验源代码#include #include / 判断输入类型函数库#include #include FILE *fp;char cbuffer;char *key8= if,else,for,while,do,return,break,continue;char *border6= ,;,(,);char *arithsymbols4= +,-,*,/;char *relation6= ,=,;char *consts20;char *label20;int constnum=0,labelnum=0;int search(char searchchar,int wordtype) int i=0; switch (wordtype) case 1: / 1 匹配是否是关键字 for (i=0; i=7; i+) if (strcmp(keyi,searchchar)=0) return(i+1); case 2: / 2 匹配是否是边界符 for (i=0; i=5; i+) if (strcmp(borderi,searchchar)=0) return(i+1); return(0); case 3: / 3 匹配是否是算术符号 for (i=0; i=3; i+) if (strcmp(arithsymbolsi,searchchar)=0) return(i+1); return(0); case 4: / 4 匹配是大小关系 for (i=0; i=5; i+) if (strcmp(relationi,searchchar)=0) return(i+1); return(0); case 5: / 5 匹配是否是数字常量 for (i=0; i=constnum; i+) if (strcmp(constsi,searchchar)=0) return(i+1); constsi-1=(char *)malloc(sizeof(searchchar); strcpy(constsi-1,searchchar); constnum+; return(i); case 6: / 6 匹配是否是字母符号 for (i=0; i=labelnum; i+) if (strcmp(labeli,searchchar)=0) return(i+1); labeli-1=(char *)malloc(sizeof(searchchar); strcpy(labeli-1,searchchar); labelnum+; return(i); return 0;char alphaprocess(char buffer) / 字符处理方法 int atype; int i=-1; char alphatp20; / isalpha()是否为字符,isdigit()是否为阿拉伯数字 while (isalpha(buffer)|(isdigit(buffer) alphatp+i=buffer; buffer=fgetc(fp); / 移动文件指针 alphatpi+1=0; if (atype=search(alphatp,1) printf(%s (1,%d)n,alphatp,atype-1); else atype=search(alphatp,6); printf(%s (6,%d)n,alphatp,atype-1); return(buffer);/ 数字处理方法char digitprocess(char buffer) int i=-1; char digittp20; int dtype; while (isdigit(buffer) digittp+i=buffer; buffer=fgetc(fp); digittpi+1=0; dtype=search(digittp,5); printf(%s (5,%d)n,digittp,dtype-1); return(buffer);/ 其他处理方法char otherprocess(char buffer) char othertp20; int otype,otypetp; othertp0=buffer; othertp1=0; if (otype=search(othertp,3) printf(%s (3,%d)n,othertp,otype-1); buffer=fgetc(fp); goto out; if (otype=search(othertp,4) buffer=fgetc(fp); othertp1=buffer; othertp2=0; if (otypetp=search(othertp,4) printf(%s (4,%d)n,othertp,otypetp-1); goto out; else othertp1=0; printf(%s (4,%d)n,othertp,otype-1); goto out; if (buffer=:) buffer=fgetc(fp); if (buffer=) printf(:= (2,2)n); buffer=fgetc(fp); goto out; else if (otype=search(othertp,2) printf(%s (2,%d)n,othertp,otype-1); buffer=fgetc(fp); goto out; if (buffer!=n)&(buffer!= ) printf(%c error,not a wordn,buffer); buffer=fgetc(fp);out: return(buffer);int main() int i; char filename20; char *str=hello; scanf(%s,filename); for (i=0; i=20; i+) labeli=str; constsi=str; printf(数组初始化完毕!nn); if (fp=fopen(filename,r)=NULL) printf(文件为空,发生读错误!nn); else printf(-解析 开始!-nn); cbuffer = fgetc(fp); while (cbuffer!=EOF) if (isalpha(cbuffer) cbuffer=alphaprocess(cbuffer); else if (isdigit(cbuffer) cbuffer=digitprocess(cbuffer); else cbuffer=otherprocess(cbuffer); printf(-解析 结束!-n); getchar(); return 0;l 过程二:运行结果截图2.1 编写的方法出现Bug,出现红色警告如截图示:程序 Bug截图(1)修改调试程序 Bug截图(2)2.2 程序调试成功后,运行结果截图:五. 实验中的问题及心得实验中,把shiyanyi.txt文件中的输入单词符号分为5类,预先定义好分析的类别,例如本实验中的6 类,预先定义了4个常量数组:关键字、运算符、边界符、关系符,通过循环遍历记录各个的位置以及类型。举例:如上图示截图中,+ 表示的是第3中类型(元素符),其在常量数组中的位置是第1个。应实验中的要求,编制一个词法分析程序,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出由各个单词的内部编码及单词符号自身值所组成的二元式序列。其中涉及的数据结构方面设计,空白和注释的处理等一些细节都会影响到程序的执行效率。由于大部分的编译时间都是花费在扫描字符以把单词符号分离出来,所以我们可以把词法分析独立出来,采用专门的读字符和分离单词的知识大大加快编译技术的速度,或是建立此法分析程序分析程序的自动构造工具,以改进我们的编译效率。对于我们所掌握的课本上的知识来说对于保留关键字,界符,运算

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论