c语言词法分析器_第1页
c语言词法分析器_第2页
c语言词法分析器_第3页
c语言词法分析器_第4页
c语言词法分析器_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、# include <string.h># include <stdlib.h># include <time.h># include <ctype.h>file *fr,*fw,*temp1,*temp2;char *key0="main","printf","scanf","else","if","auto","double","int","struct",&quo

3、t;break","long","switch","case","enum","register","typedef","char","extern","return","union","const","float","short","unsigned","continue","

4、for","signed","void","default","goto","sizeof","volatile","do","while","static"/*关键字表*/int islet(char c)/判断是否是字母 if(c>='a'&& c<='z'|c>='a'&&c<='z'

5、;) return 1; else return 0;int isnum(char c)/判断是否是数字if (c>='0'&&c<='9')return 1;else return 0;int iskey(char *word)int m,i;for(i=0;i<36;i+) if(m=strcmp(word,key0i)=0) if(i=0) return 2; else return 1; return 0;int isboudany(char c) if(c='')return 2;elseif(c=&#

6、39;('|c=')'|c=''|c=''|c=''|c=''|c=','|c=''|c='''|c='"'|c='"') return 1;elsereturn 0; void check(file *fr) char word30; while(!feof(fr) memset(word,0,sizeof(word); char ch,temp; ch=fgetc(fr); /获取字符,指针fr并

7、自动指向下一个字符 int i,c; if(ch='#')/预处理 /temp=fgetc(fr); while(ch!='>') 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"); el

8、se 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='

9、;0' /'0' 代表字符结束(空格) fseek(fr,-1,1); c=iskey(word); /判断是否是关键字 if(c=0) /不是关键字 fprintf(temp1,"%s ",word); fprintf(fw,"字符%s是:标识符,种别编码为:%dn",word,2); else if(ch!='"')/判断是否是定义的字符 if(c=2) fprintf(fw,"字符%s是:*主函数,种别编码为:%dn",word,0);/主函数 else fprintf(fw,&

10、quot;字符%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+; ch=fgetc(fr); wordi='0' fseek(fr,-1,1); /回退 fprintf(fw,"字符%s是:常量,种别编码为:%dn",

11、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,"%c ",ch); else switch(ch) case

12、'+': 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)

13、; fprintf(fw,"字符%c是运算符,种别编码为:%dn",ch,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"

14、;,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(isnum(ch) fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,"字符%c:是运算符,种别编码为:%dn"

15、,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

16、(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':'

17、;: case'.': case'=': word0=ch; ch=fgetc(fr); word1=ch; if(ch!='=') fseek(fr,-2,1); 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); word

18、1=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=ch; ch=fgetc(fr); word1=ch; if(ch='=') w

19、ord2='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); w

20、ord1=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

21、=ch; if(ch='=') word2='0' fprintf(fw,"字符%s是:运算符,种别编码为:%dn",word,26); /判断结果为运算符"<=" else if(ch='<') word2='0' fprintf(fw,"字符%s是:运算符,种别编码为:%dn",word,27); /判断结果为运算符"<<" else fseek(fr,-2,1); ch=fgetc(fr); fprintf(fw,&quo

22、t;字符%c是:运算符,种别编码为:%dn",ch,28); /判断结果为"<" break; case'>': 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

23、,30); else fseek(fr,-2,1); 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");sca

24、nf("%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&quo

25、t;);printf("*n");printf("请输入文件的最终结果的写入路径(包含文件的后缀名):n");scanf("%s",str_out);printf("请输入文件的常量表的写入路径(包含文件的后缀名):n");scanf("%s",str_out1);printf("请输入文件的符号表的写入路径(包含文件的后缀名):n");scanf("%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)prin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论