analyzer

所属分类:自然语言处理
开发工具:Visual C++
文件大小:80KB
下载次数:62
上传日期:2006-12-22 20:26:24
上 传 者tyfhxb
说明:  c语言词法分析器,不错的,大家进来看一看吧
(c language lexical analyzer, yes, we come to look at it)

文件列表:
词法分析器 (0, 2005-05-30)
词法分析器\www.cnzz.cn (0, 2005-05-30)
词法分析器\www.cnzz.cn\by.aps (39132, 2005-05-22)
词法分析器\www.cnzz.cn\by.clw (1354, 2005-05-22)
词法分析器\www.cnzz.cn\by.cpp (2007, 2005-05-22)
词法分析器\www.cnzz.cn\by.dsp (3163, 2005-05-22)
词法分析器\www.cnzz.cn\by.dsw (527, 2005-05-22)
词法分析器\www.cnzz.cn\by.h (1280, 2005-05-22)
词法分析器\www.cnzz.cn\by.rc (5871, 2005-05-22)
词法分析器\www.cnzz.cn\byDlg.cpp (10113, 2005-05-22)
词法分析器\www.cnzz.cn\byDlg.h (1702, 2005-05-22)
词法分析器\www.cnzz.cn\input.txt (66, 2005-05-22)
词法分析器\www.cnzz.cn\Link.cpp (3102, 2005-01-03)
词法分析器\www.cnzz.cn\Link.h (1213, 2005-01-03)
词法分析器\www.cnzz.cn\res (0, 2005-05-22)
词法分析器\www.cnzz.cn\Resource.h (910, 2005-05-22)
词法分析器\www.cnzz.cn\res\1.ico (3638, 2005-05-22)
词法分析器\www.cnzz.cn\res\by.ico (1078, 2005-05-22)
词法分析器\www.cnzz.cn\res\by.rc2 (394, 2005-05-22)
词法分析器\www.cnzz.cn\res\HAND.CUR (2238, 2005-05-22)
词法分析器\www.cnzz.cn\res\xptheme.bin (653, 2005-05-22)
词法分析器\www.cnzz.cn\StdAfx.cpp (204, 2005-05-22)
词法分析器\www.cnzz.cn\StdAfx.h (1054, 2005-05-22)
词法分析器\www.cnzz.cn\词法分析器.exe (32768, 2005-05-22)
词法分析器\使用说明.CHM (50118, 2004-11-30)

主要的代码如下(这里给出的是命令行代码,稍加修改就可以做成源码中国演示图片的界面了)   #include #include #include #include #define MAX 18 //分析表的最大容量 #define MAXBUF 255 char ch =' '; // 存放读入当前的输入字符 int lineno; struct reserve //关键字 { char lexptr[MAXBUF]; int token; }; struct reserve symtable[MAX]; char * str[]={"program","input","output","begin","end","var","integer","real","for","to","if","then","else","do","while","write","array","proceure" }; void init() //对符号表进行初始化 { for( int j=0; j<18; j++) { strcpy(symtable[j].lexptr,str[j]); symtable[j].token=j+3; } } int search(char *temp) { for(int i=0; i { if(!strcmp(symtable[i].lexptr ,temp)) { return symtable[i].token; } } return 0; } void analyse(FILE *fpin,FILE *fpout) //分析程序 { char arr[MAXBUF]; int i=0; int j=0; while((ch=fgetc(fpin))!=EOF) //读入字符判断,空格、字母、数字、界符 { if(ch==' '||ch=='\t') { } else if(ch=='\n') //如果是换行符,则行号加1 { lineno++; } else if(isdigit(ch)) //如果是数字 { while(isdigit(ch)) //判断和读取数字 { arr[j]=ch; j++; ch=fgetc(fpin); } arr[j]='\0'; j=0; fseek(fpin,-1L,SEEK_CUR); fprintf(fpout,"%s\t%d\n",arr,2) ; } else if (isalpha(ch)) //如果是字母 { while(isalpha(ch)||isdigit(ch)) { arr[j]=ch; j++; ch=fgetc(fpin); } fseek(fpin,-1L,SEEK_CUR); arr[j]='\0'; j=0; if (search(arr)) //如果是关键字 { fprintf(fpout,"%s\t%d\n",arr,search(arr)); } else fprintf(fpout,"%s\t%d\n",arr,1); //普通标志符 } else if(ch==':') { ch=fgetc(fpin); if(ch=='=') { fprintf(fpout,"%s\t%d\n",":=",29); //如果是 := } else { fprintf(fpout,"%s\t%d\n",":",30); //如果是 : fseek(fpin,-1L,SEEK_CUR); } } else if (ch=='>') { ch=fgetc(fpin); if(ch=='=') //如果是 >= { fprintf(fpout,"%s\t%d\n",">=",32); } else { fprintf(fpout,"%s\t%d\n",">",31); //如果是 > fseek(fpin,-1L,SEEK_CUR); } } else if(ch=='<') { ch=fgetc(fpin); if(ch=='>') { fprintf(fpout,"%s\t%d\n","<>",35); // 如果是 <> } else if(ch=='=') { fprintf(fpout,"%s\t%d\n","<=",34); //如果是 <= } else { fprintf(fpout,"%s\t%d\n","<",33); //如果是 < fseek(fpin,-1L,SEEK_CUR); } } else if(ch=='/') { ch=fgetc(fpin); if(ch=='*') { ch=fgetc(fpin); s: while(ch!='*') { ch=fgetc(fpin); } while(ch=='*') { ch=fgetc(fpin); while(ch!='/') { goto s; //如果是注释 /* */ } } } else if(ch=='/') { ch=fgetc(fpin); while(ch!='\n') { ch=fgetc(fpin); //如果是注释 // } } else { fprintf(fpout,"%s\t%d\n","/",24); fseek(fpin,-1L,SEEK_CUR); } } else if(ch=='+') { fprintf(fpout,"%s\t%d\n","+",21); } else if(ch=='-') { fprintf(fpout,"%s\t%d\n","-",22); } else if(ch=='*') { fprintf(fpout,"%s\t%d\n","*",23); } else if(ch=='(') { fprintf(fpout,"%s\t%d\n","(",25); } else if(ch==')') { fprintf(fpout,"%s\t%d\n",")",26); } else if(ch=='[') { fprintf(fpout,"%s\t%d\n","[",27); } else if(ch==']') { fprintf(fpout,"%s\t%d\n","]",28); } else if(ch=='.') { fprintf(fpout,"%s\t%d\n",".",39); } else if(ch==';') { fprintf(fpout,"%s\t%d\n",";",36); } else if(ch=='=') { fprintf(fpout,"%s\t%d\n","=",38); } else if(ch==',') { fprintf(fpout,"%s\t%d\n",",",40); } else fprintf(fpout,"无法识别的字符 %c\n",ch) ; } } void main() { printf("***************************词法分析器*************************\n\n\n"); printf("直接输入源代码请按1,从文件中读入源代码请按2 \n") ; char filenamein[10]; char filenameout[10]; printf("请输入源文件名:\n"); scanf("%s",filenamein); printf("请输入保存词法分析结果的文件名:\n"); scanf("%s",filenameout); FILE* fpin=fopen(filenamein,"r"); FILE* fpout=fopen(filenameout,"w"); init(); analyse(fpin,fpout); fclose(fpin); fclose(fpout); _getch(); }

近期下载者

相关文件


收藏者