编译原理实验报告

上传人:枫** 文档编号:496871218 上传时间:2022-09-04 格式:DOCX 页数:27 大小:38.17KB
返回 下载 相关 举报
编译原理实验报告_第1页
第1页 / 共27页
编译原理实验报告_第2页
第2页 / 共27页
编译原理实验报告_第3页
第3页 / 共27页
编译原理实验报告_第4页
第4页 / 共27页
编译原理实验报告_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《编译原理实验报告》由会员分享,可在线阅读,更多相关《编译原理实验报告(27页珍藏版)》请在金锄头文库上搜索。

1、精选优质文档-倾情为你奉上目录专心-专注-专业专业:计算机科学与技术学生姓名: 学 号: 完成时间:2016年6月25日编译原理实验报告实验一 词法分析器的设计与实现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=fo

3、pen(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是否为字母,是则调用

4、alphaprocess()函数*/ 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,alpha

6、tp,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,

7、signed,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 digit

8、tp20;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); c

9、h1=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 ,

10、5)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; return(buffer); if(ch0=+|ch0=-) if(id=4) /*如果+,-前ID为4的字符则可能为正负数或+,-,否则为加减号*/ for(int i=1;i10;i+) buffer=fgetc(fp); if(

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号