ImageVerifierCode 换一换
格式:DOCX , 页数:32 ,大小:173.76KB ,
资源ID:7431776      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7431776.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编译原理实验一.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

编译原理实验一.docx

1、编译原理实验一实验内容: 实现标准C语言词法分析器实验目的:1掌握程序设计语言词法分析的设计方法;2掌握DFA的设计与使用方法;3掌握正规式到有限自动机的构造方法;实验要求:1单词种别编码要求 基本字(关键字)、运算符、界符:一符一种; 标识符(变量名):统一为一种; 常量():按类型编码;2词法分析工作过程中建立符号表、常量表,并以文本文件形式输出;3词法分析的最后结果以文本文件形式输出;4完成对所设计词法分析器的功能测试,并给出测试数据和实验结果;5为增加程序可读性,请在程序中进行适当注释说明;6整理上机步骤,总结经验和体会;7认真完成并按时提交实验报告。二、设计方案: 这个词法分析器分析

2、的主要关键字有:main, int, float, char, if, else, for, while, do, switch, case, break; default。选择要分析的c文件,首先对其去掉注释和与空格处理,再根据字符的不同类型分析。1、全局数据结构: *key : 关键字表全局文件指针*fr,*fw, *temp1,*temp2用于文件的读写。2、以层次图模块的组成及调用关系 3、主要函数的设计要求(功能、参数、返回值):isKey:判断ch中的字符是否为关键字;isLer 和isNum:布尔函数过程,分别判断ch中的字符是否为字母和数字;isBoudany(): 布尔函数过

3、程,分别判断ch组成的字符否为边界符号;check:词法分析;clock:时间函数,计算程序运行所需的时间main:主函数。4、状态转换图: 字母或数字 字母 非字母或数字 数字 数字 非数字 字符a 字符a 字符b = 字符c字符a包括:= , & , | , + , -字符b包括:- , , | , * 字符c包括:, , : , ( , ) , , , , , ! ,# , % , ” , / , * , + , - , , , .# include# include # include # include # include FILE *fr,*fw,*temp1,*temp2;cha

4、r *key0=main,printf,scanf,else,if,auto,double,int,struct,break,long,switch,case,enum,register,typedef,char,extern,return,union,const,float,short,unsigned,continue,for,signed,void,default,goto,sizeof,volatile,do,while,static;/*关键字表*/char *key1=,(,),;,;/*边界符表*/ int isLet(char c)/判断是否是字母 if(c=a& c=A&c=

5、0&c=9) return 1; else return 0;int isKey(char *word)int m,i;for(i=0;i) ch=fgetc(fr); ch=fgetc(fr); fprintf(fw,*跳过头文件和文件宏定义n); else if (ch=/)/跳过注释/*/类型 ch=fgetc(fr); if (ch=/)/跳过注释/类型 while(ch!=n) ch=fgetc(fr); fprintf(fw,*跳过注释n); else if (ch=*) ch=fgetc(fr); temp=fgetc(fr); do ch=fgetc(fr); temp=fge

6、tc(fr); while (ch!=*|temp!=/); fprintf(fw,*跳过注释n); ch=fgetc(fr); else if(isLet(ch) word0=ch; ch=fgetc(fr); i=1; while(isNum(ch)|isLet(ch)/判断该字符是否是字母或数字 wordi=ch; i+; ch=fgetc(fr); wordi=0; /0 代表字符结束(空格) fseek(fr,-1,1); c=isKey(word); /判断是否是关键字 if(c=0) /不是关键字 fprintf(temp1,%s ,word); fprintf(fw,字符%s是

7、:标识符,种别编码为:%dn,word,2); else if(ch!=)/判断是否是定义的字符 if(c=2) fprintf(fw,字符%s是:*主函数,种别编码为:%dn,word,0);/主函数 else fprintf(fw,字符%s是:关键字,种别编码为:%dn,word,1);/关键字 else fprintf(fw,字符%s是:定义的字符常量,种别编码为:%dnn,word,32); else /开始判断的字符不是字母 if(isNum(ch) /判断是否是数字 word0=ch; ch=fgetc(fr); i=1; while(isNum(ch) wordi=ch; i+;

8、 ch=fgetc(fr); wordi=0; fseek(fr,-1,1); /回退 fprintf(fw,字符%s是:常量,种别编码为:%dn,word,3); else c=isBoudany(ch); /开始判断的字符不是字母也不是数字 /边界符 if(c) if(c=2)/判断是否是转义字符 word0=ch; ch=fgetc(fr); word1=ch; word2=0; fprintf(fw,字符%s是:转义字符,种别编码为:%dn,word,4); else if(c=1) fprintf(fw,字符%c是:界符,种别编码为:%dn,ch,5); fprintf(temp2,

9、%c ,ch); else switch(ch) case+: word0=ch; ch=fgetc(fr); word1=ch; if(ch=) word2=0; fprintf(fw,字符%s是:运算符,种别编码为:%dn,word,6);/运算符+= else if(ch=+) word2=0; fprintf(fw,字符%s是运算符,种别编码为:%dn,word,7); /判断结果为+ else fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c是运算符,种别编码为:%dn,ch,8); /判断结果为+ break; case-: word0=c

10、h; ch=fgetc(fr); word1=ch; if(ch=) word2=0; fprintf(fw,字符%s是:运算符,种别编码为:%dn,word,9); else if(ch=-) word2=0; fprintf(fw,字符%s是运算符,种别编码为:%dn,word,10); /判断结果为- else fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c是运算符,种别编码为:%dn,ch,11); /判断结果为- break; case*: word0=ch; ch=fgetc(fr); word1=ch; if(ch!=) if(isNu

11、m(ch) fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c:是运算符,种别编码为:%dn,ch,12);/判断结果为* else /判断是否是指针 i=2; ch=fgetc(fr); while(isLet(ch) wordi=ch; ch=fgetc(fr); i+; fprintf(fw,字符%s:是指针定义运算符,种别编码为:%dn,word,13); else word2=0; fprintf(fw,字符%s:是运算符,种别编码为:%dn,word,14);/判断结果为*= break; case/: word0=ch; ch=fgetc(

12、fr); word1=ch; if(ch!=) if(isNum(ch) fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c:是运算符,种别编码为:%dn,ch,15);/判断结果为/ else word2=0; fprintf(fw,字符%s:是运算符,种别编码为:%dn,word,16);/判断结果为/= break; case!: case?: case: case.: case=: word0=ch; ch=fgetc(fr); word1=ch; if(ch!=) fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw

13、,字符%c:是运算符,种别编码为:%dn,ch,17); else word2=0; fprintf(fw,字符%s:是运算符,种别编码为:%dn,word,18); break; case|: word0=ch; ch=fgetc(fr); word1=ch; if(ch=|) word2=0; fprintf(fw,字符%c是运算符,种别编码为:%dn,ch,19); /判断结果为运算符| else fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c是运算符,种别编码为:%dn,ch,20); /判断结果为| break; case %: word0

14、=ch; ch=fgetc(fr); word1=ch; if(ch=) word2=0; fprintf(fw,字符%s是运算符,种别编码为:%dn,word,21); else if(isLet(ch) word2=0; fprintf(fw,字符%s是输出类型标识符,种别编码为:%dn,word,22); else fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c是取余运算符,种别编码为:%dn,ch,23); break; case&: word0=ch; ch=fgetc(fr); word1=ch; if(ch=&) word2=0; fp

15、rintf(fw,字符%s是:运算符,种别编码为:%dn,word,24); /判断结果为运算符& else fseek(fr,-2,1); ch=getc(fr); fprintf(fw,字符%c是:运算符,种别编码为:%dn,ch,25); /判断结果为& break; case: word0=ch; ch=fgetc(fr); word1=ch; if(ch=) word2=0; fprintf(fw,字符%s是:运算符,种别编码为:%dn,word,26); /判断结果为运算符= else if(ch=) word2=0; fprintf(fw,字符%s是:运算符,种别编码为:%dn,

16、word,27); /判断结果为运算符 else fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c是:运算符,种别编码为:%dn,ch,28); /判断结果为: word0=ch; ch=fgetc(fr); word1=ch; if(ch=) word2=0; fprintf(fw,字符%s是运算符,种别编码为:%dn,word,29); else if(ch=) word2=0; fprintf(fw,字符%s是运算符,种别编码为:%dn,word,30); else fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw

17、,字符%c是运算符,种别编码为:%dn,ch,31); break; default: break; fprintf(fw,n); int main() clock_t start,end; char cr; char str_in25,str_out25,str_out125,str_out225; double duration; start=clock(); printf(请输入文件的读取路径(包含文件的后缀名):n); scanf(%s,str_in); fr=fopen(str_in,r); while(fr=NULL) printf(文件路径输入错误!请重新输入:n); scanf(%s,str_in); fr=fopen(str_in,r); printf(文件读入成功!内容显示如下:n); printf(*n); cr=fgetc(fr); while (cr!=EOF) putchar(cr); cr=fgetc(fr); printf(n);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1