c语言词法分析器.doc

上传人:PIYPING 文档编号:11371851 上传时间:2021-07-31 格式:DOC 页数:18 大小:74.50KB
返回 下载 相关 举报
c语言词法分析器.doc_第1页
第1页 / 共18页
c语言词法分析器.doc_第2页
第2页 / 共18页
c语言词法分析器.doc_第3页
第3页 / 共18页
c语言词法分析器.doc_第4页
第4页 / 共18页
c语言词法分析器.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《c语言词法分析器.doc》由会员分享,可在线阅读,更多相关《c语言词法分析器.doc(18页珍藏版)》请在三一文库上搜索。

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

2、lude # 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;/*关键字表*/int isLet(cha

3、r 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;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);

4、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

5、 ,word); fprintf(fw,字符%s是:标识符,种别编码为:%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; whil

6、e(isNum(ch) wordi=ch; i+; 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是:界符,种别编码为:

7、%dn,ch,5); fprintf(temp2,%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); /判断结

8、果为+ break; case-: word0=ch; 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); w

9、ord1=ch; if(ch!=) if(isNum(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; c

10、ase/: word0=ch; ch=fgetc(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);

11、 ch=fgetc(fr); fprintf(fw,字符%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); /判断

12、结果为| break; case %: word0=ch; ch=fgetc(fr); word1=ch; if(ch=) word2=0; fprintf(fw,字符%s是运算符,种别编码为:%dn,word,21); elseif(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=

13、ch; if(ch=&) word2=0; fprintf(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

14、(fw,字符%s是:运算符,种别编码为:%dn,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);

15、ch=fgetc(fr); fprintf(fw,字符%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(文件路径输入错误

16、!请重新输入: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);s

17、canf(%s,str_out2);while(str_in=str_out|str_in=str_out1|str_in=str_out2)if(str_out=str_in)printf(请输入文件的最终结果的写入路径(包含文件的后缀名):n);scanf(%s,str_out);elseif(str_in=str_out1)printf(请输入文件的常量表的写入路径(包含文件的后缀名):n);scanf(%s,str_out1);elseif(str_in=str_out2)printf(请输入文件的符号表的写入路径(包含文件的后缀名):n);scanf(%s,str_out2);fw=

18、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);fw=fopen(str_out,w);elseif(temp1=NULL)scanf(%s,str_out1);temp1=fopen(str_out1,w);elseif (temp2=NULL) scanf(%s,str_out2);temp2=fopen(str_out2,w);fprintf(temp1,文件中依次出现的标识符n);fprintf(temp2,文件中依次出现的符号n);fr=fopen(str_in,r);check(fr);printf(文件写入成功!编译结果已写入指定文件区域!请注意查看.nn);fclose(fw);fclose(temp1);fclose(temp2);fclose(fr);printf(n);end=clock();duration=(double)(end-start)/CLOCKS_PER_SEC * 1000;printf(该词法分析程序共运行约%lf msn, duration);return 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1