




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验内容: 实现标准C语言词法分析器实验目的:1掌握程序设计语言词法分析的设计方法;2掌握DFA的设计与使用方法;3掌握正规式到有限自动机的构造方法;实验要求:1单词种别编码要求 基本字(关键字)、运算符、界符:一符一种; 标识符(变量名):统一为一种; 常量():按类型编码;2词法分析工作过程中建立符号表、常量表,并以文本文件形式输出;3词法分析的最后结果以文本文件形式输出;4完成对所设计词法分析器的功能测试,并给出测试数据和实验结果;5为增加程序可读性,请在程序中进行适当注释说明;6整理上机步骤,总结经验和体会;7认真完成并按时提交实验报告。# include# include # include # include # include FILE *fr,*fw,*temp1,*temp2;char *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=,%,(,),;,;/*边界符表*/char *key2= ,+,-,*,/,%,=,=,=,!=,!,&,|,|,&,=,?:,-,+,-,.,+=,-=,*=,/=;/*运算符表*/ int isLet(char c)/判断是否是字母 if(c=a& c=A&c=0&c=9)return 1;else return 0;int isKey(char *word)int m,i;for(i=0;i36;i+) if(m=strcmp(word,key0i)=0) if(i=0) return 2; else return 1; return 0;int isBoudany(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); else if (ch=*) ch=fgetc(fr); temp=fgetc(fr); do ch=fgetc(fr); temp=fgetc(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是:标识符n,word); /不是关键字 else if(ch!=)/判断是否是定义的字符 if(c=2) fprintf(fw,字符%s是:*主函数n,word);/主函数 else fprintf(fw,字符%s是:关键字n,word);/关键字 else fprintf(fw,字符%s是:定义的字符常量n,word); else /开始判断的字符不是字母 if(isNum(ch) /判断是否是数字 word0=ch; ch=fgetc(fr); i=1; while(isNum(ch) wordi=ch; i+; ch=fgetc(fr); wordi=0; fseek(fr,-1,1); /回退 fprintf(fw,字符%s是:常量n,word); else /开始判断的字符不是字母也不是数字word0=ch; word1=0;c=isBoudany(word);if(c)if(c=2)/判断是否是转义字符ch=fgetc(fr);word1=ch;word2=0;fprintf(fw,字符%s是:转义字符n,word);elseif(c=1) fprintf(fw,字符%c是:界符n,ch); fprintf(temp2,%s ,word); elseswitch(ch) case+: ch=fgetc(fr); word0=ch; ch=fgetc(fr); word1=ch; if(ch=) word2=0; fprintf(fw,字符%s是:运算符n,word);/运算符+= else if(ch=+) word2=0; fprintf(fw,字符%s是运算符n,word); /判断结果为+ else fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c是运算符n,ch); /判断结果为+ break; case-: ch=fgetc(fr); word0=ch; ch=fgetc(fr); word1=ch; if(ch=) word2=0; fprintf(fw,字符%s是:运算符n,word); else if(ch=-) word2=0; fprintf(fw,字符%s是运算符n,word); /判断结果为- else fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c是运算符n,ch); /判断结果为- break; case*: word0=ch; ch=fgetc(fr); word1=ch; if(ch!=) if(isNum(ch) fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c:是运算符n,ch);/判断结果为* else /判断是否是指针i=2;ch=fgetc(fr);while(isLet(ch) wordi=ch;ch=fgetc(fr);i+;fprintf(fw,字符%s:是指针定义运算符n,word); else word2=0; fprintf(fw,字符%s:是运算符n,word);/判断结果为*= break; case/: ch=fgetc(fr); word0=ch; ch=fgetc(fr); word1=ch; if(ch!=) if(isNum(ch) fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c:是运算符n,ch);/判断结果为/ else word2=0; fprintf(fw,字符%s:是运算符n,word);/判断结果为/= break; case!: case?: case: case.: case#: case=: ch=fgetc(fr); word0=ch; ch=fgetc(fr); word1=ch; if(ch!=) fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c:是运算符n,ch); else word2=0; fprintf(fw,字符%s:是运算符n,word); break; case|: ch=fgetc(fr); word0=ch; ch=fgetc(fr); word1=ch; if(ch=|) word2=0; fprintf(fw,字符%c是运算符n,ch); /判断结果为运算符| else fseek(fr,-2,1);ch=fgetc(fr); fprintf(fw,字符%c是运算符n,ch); /判断结果为| break; case %: word0=ch; ch=fgetc(fr); word1=ch; if(ch=) word2=0; fprintf(fw,字符%s是运算符n,word); elseif(isLet(ch) word2=0; fprintf(fw,字符%s是输出类型标识符n,word); else fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c是取余运算符n,ch); break; case&: ch=fgetc(fr); word0=ch; ch=fgetc(fr); word1=ch; if(ch=&) word2=0; fprintf(fw,字符%s是:运算符n,word); /判断结果为运算符& else fseek(fr,-2,1);ch=getc(fr);fprintf(fw,字符%c是:运算符n,ch); /判断结果为& break; case: ch=fgetc(fr); word0=ch; ch=fgetc(fr); word1=ch; if(ch=) word2=0; fprintf(fw,字符%s是:运算符n,word); /判断结果为运算符= else if(ch=) word2=0; fprintf(fw,字符%s是:运算符n,word); /判断结果为运算符 else fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c是:运算符n,ch); /判断结果为: ch=fgetc(fr); word0=ch; ch=fgetc(fr); word1=ch; if(ch=) word2=0; fprintf(fw,字符%s是运算符n,word); else if(ch=) word2=0; fprintf(fw,字符%s是运算符n,word); else fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,字符%c是运算符n,ch); break;default: break; fprintf(fw,n); int main()clock_t start,end;char cr;/string str_in,str_out;str_out25char 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);printf(*n);printf(请输入文件的最终结果的写入路径(包含文件的后缀名):n);scanf(%s,str_out);printf(请输入文件的常量表的写入路径(包含文件的后缀名):n);scanf(%s,str_out1);printf(请输入文件的符号表的写入路径(包含文件的后缀名):n);scanf(%s,str_out2); fw=fopen(str_out,w); temp1=fopen(str_out1,w); temp2=fopen(str_out2,w);while(fw=NULL|temp1=NULL|temp2=NULL)printf(文件路径输入错误!请重新输入:n);if(fw=NULL)scanf(%s,str_out);fr=fopen(str_out,w);elseif(temp1=NULL)scanf(%s,str_out1);fr=fopen(str_out1,w);elseif (temp2=NULL) scanf(%s,str_out2);fr=fopen(str_out2,w);fprintf(temp1,文件中依次出现的标识
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年G2电站锅炉司炉理论考试题及答案
- 口才考试题及答案
- 钢筋考试题及答案
- 中华传统文化知到智慧树答案
- 药品知识竞赛考试题目及答案
- 中西医临床骨伤科学(运动健康与创伤防治)知到智慧树答案
- 中学生物学教学论知到智慧树答案
- 公需科目考试试题及答案
- 2025版清尾款支付与产品验收标准合同范本
- VR技能考核系统设计-洞察及研究
- 客服人员岗位月度绩效考核表
- 清洁消毒隔离技术课件
- 2025年云南省高考生物试卷真题(含答案)
- 中国美容仪器市场调研及发展策略研究报告2025-2028版
- 2025年浙江省山海联盟中考数学模拟试卷(五)
- Q-CSG1211016-2025 光伏发电站接入电网技术规范
- JG/T 162-2009住宅远传抄表系统
- 人工智能与无人机课件
- 5步打造孩子内驱力
- 物业管理项目可行性分析报告(模板参考范文)
- 贷款中介代办协议书
评论
0/150
提交评论