编译原理实验报告(共27页).docx
《编译原理实验报告(共27页).docx》由会员分享,可在线阅读,更多相关《编译原理实验报告(共27页).docx(27页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上目录专心-专注-专业专业:计算机科学与技术学生姓名: 学 号: 完成时间:2022年5月3日编译原理实验报告实验一 词法分析器的设计与实现1)实验目的 掌握正规式、状态转换图、C语言单词符号的划分及词法分析器的实现 掌握词法分析程序的作用和接口。2)实验内容设计及实现C语言程序的词法分析器。3)实验要求 对任给的一个C语言源程序,能够虑掉空格、回车换行符、tab键及注释。 识别各类单词符号,如关键字、标识符、运算符、常数、界符,结果以二元式形式输出。并构造符号表。 输出有词法错误的单词及所在行号。4)实验原理根据扫描到的单词符号的第一个字符的种类,分别转到相应的程序进
2、行处理。这些程序的功能就是识别以相应字符开头的各类单词符号。5)实验步骤 根据C语言各类单词的正规式,构造能识别各类单词的状态转换图。 根据状态转换图,构造识别各类单词的词法分析器。6)状态转化图及词法分析程序#include ctype.h#include string.h#include stdio.h FILE *fp;int id;void main() char cbuffer;char alphaprocess(char buffer);char digitprocess(char buffer);char otherprocess(char buffer); if (fp=fop
3、en(example.c,r)=NULL) /*以只读方式打开文件example.c,NULL在 stdio.h文件中已被定义为0*/ printf(error); else cbuffer=fgetc(fp); /*文件不为空则从文件中取字符*/ while (cbuffer!=EOF) /*EOF文件结束标志*/ if(cbuffer= |cbuffer=n) /*掠过空格和回车符*/ cbuffer=fgetc(fp); id=4; else if(isalpha(cbuffer) cbuffer=alphaprocess(cbuffer); /*检查cbuffer是否为字母,是则调用a
4、lphaprocess()函数*/ else if (isdigit(cbuffer) cbuffer=digitprocess(cbuffer); /*检查cbuffer是否为数字09,是则调用digitprocess()函数*/ else cbuffer=otherprocess(cbuffer); /*非上述两者则调用otherprocess()函数*/ char alphaprocess(char buffer) int search(char searchchar,int wordtype); /*函数声明*/int atype; int i=-1;char alphatp20; /
5、*字符数组存储从文件中读取的字符*/ while(isalpha(buffer)|(isdigit(buffer)|buffer=_) /*标识符的组成成分*/ alphatp+i=buffer; /*将当前读取的字符存如数组*/ buffer=fgetc(fp); /*读取下一个字符*/ alphatpi+1=0; /*字符串以0作为结束标志*/ atype=search(alphatp,1); /*调用函数,判断当前字符串是否为关键字*/ if(atype!=0) /*是关键字则输出该关键字,编号为1,并输出该关键字在关键字表中的位子*/ printf(%s, (1,%d)n,alphat
6、p,atype); id=1; /*关键字的ID为1*/ else printf(%s ,2)n,alphatp); /*为标识符时,编号为2*/ id=2; /*标识符的ID为2*/ return(buffer); /*判断字符串是否为关键字*/int search(char searchchar,int wordtype)char * key32=auto,break,case,char,const,continue,default,do, double,else,enum,extern,float,for,goto,if,int,long, register,return,short,s
7、igned,sizeof,static,struct, volatile,while,switch,typedef,union,unsigned,void; /*设置数组指针存储c语言中的32个关键字*/ int i; int p; switch (wordtype) case 1:for (i=0;i=31;i+) if (strcmp(keyi,searchchar)=0) /*比较字符串,为关键字则定位该关键字的序号*/ p=i+1; break; else p=0;return(p); char digitprocess(char buffer)int i=-1;char digitt
8、p20;while (isdigit(buffer)|buffer=.|buffer=e|buffer=E)/考虑数字为小数和指数时的情况 digittp+i=buffer; buffer=fgetc(fp); /*同上*/ digittpi+1=0;printf(%s ,3)n,digittp); /*输出该数字,编号为3*/id=3; /*设置ID为3*/return(buffer);char otherprocess(char buffer) int n=0; char ch20; ch0=buffer; ch1=0;if(ch0=%|ch0=) buffer=fgetc(fp); ch
9、1=buffer; ch2=0; printf(%s ,5)n,ch); id=4; buffer=fgetc(fp); return(buffer);if(ch0=&)buffer=fgetc(fp); if(buffer!=&) printf(%s ,5)n,ch); id=4; return(buffer); if(buffer=&) ch1=buffer; ch2=0; printf(%s ,4)n,ch); id=3; buffer=fgetc(fp); return(buffer); if(ch0=,|ch0=;|ch0=|ch0=|ch0=(|ch0=) printf(%s ,5
10、)n,ch); buffer=fgetc(fp); id=4; return(buffer); if(ch0=*|ch0=/) printf(%s ,4)n,ch); buffer=fgetc(fp); id=4; return(buffer); if(ch0=|ch0=!|ch0=) buffer=fgetc(fp); if(buffer=) /*防止=,!=,=符号的分离*/ ch1=buffer; ch2=0; printf(%s ,4)n,ch); else printf(%s ,4)n,ch);id=4;return(buffer); buffer=fgetc(fp); id=4;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 报告 27
限制150内