www.pudn.com > word_analyse.rar > word_analyse.cpp
#include#include #include #include #include struct save /* 用于存储关键字和标识符 */ { char string[64]; struct save *next; }; struct save *key,*pkey,*emkey=NULL,*sign=NULL,*const_list=NULL; int main() { /* 以下是变量声明区 */ FILE *fp,*fpout; char p[8000],buffer[4096],in_ch,*buffer_point=buffer; int i=0,n=0; /* 以下是函数声明区 */ void pre(char *p,char *buffer,char ch); void token(char *p,char ch); /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/ /* 链表的初始化 */ key=(struct save *)malloc(sizeof(struct save)); pkey=key; strcpy(pkey->string,"program"); pkey->next=(struct save *)malloc(sizeof(struct save));pkey=key->next; strcpy(pkey->string,"begin"); pkey->next=(struct save *)malloc(sizeof(struct save));pkey=pkey->next; strcpy(pkey->string,"end"); pkey->next=(struct save *)malloc(sizeof(struct save));pkey=pkey->next; strcpy(pkey->string,"if"); pkey->next=(struct save *)malloc(sizeof(struct save));pkey=pkey->next; strcpy(pkey->string,"then"); pkey->next=NULL; /*-------------------------------------------------------------*/ fp=fopen("test.txt","r"); in_ch=fgetc(fp); while(in_ch!=EOF){ p[n++]=in_ch; in_ch=fgetc(fp); } fclose(fp); pre(p,buffer_point,'#'); puts(buffer_point); printf("\n"); token(buffer,'#'); /* 将关键字、标识符和常数输出到文件中 */ fpout=fopen("out.txt","w"); fputs("keyword list(sort:0)----------------",fpout); fputc('\n',fpout); while(emkey){ fputs(emkey->string,fpout); fputc(' ',fpout); emkey=emkey->next; } fputs("\n\n",fpout); fputs("sign list(sort:1)-------------------",fpout); fputc('\n',fpout); while(sign){ fputs(sign->string,fpout); fputc(' ',fpout); sign=sign->next; } fputs("\n\n",fpout); fputs("constant list(sort:2)---------------",fpout); fputc('\n',fpout); while(const_list){ fputs(const_list->string,fpout); fputc(' ',fpout); const_list=const_list->next; } fclose(fpout); return 0; }/*main 函数结束 */ /* 以下是预处理的代码。 预处理包括:注释、多余的空格,均丢掉。 输入:字符数组形式。 */ void pre(char *p,char buffer[],char ch) { int flag=1,end=0;/*flag=1 表示光标还未遇到首个文字。 */ char *q; /* 处理掉换行符( '\n' )。 */ q=p; while(*q!=ch){ if(*q=='\n')*q=' '; q++; } while(*p!=ch){ if(flag){ if(*p==' ')p++; else if(*p=='/'&&*(p+1)=='*'){ p=p+2; while(*p!='*'&&*(p+1)!='/'){ if(*p==ch){printf("error");exit(0);} else p++;} p=p+2; } else {flag=0;*buffer++=*p++;} } else if(*p==' '){ if(*(p+1)==' ')p++; else if(*(p+1)==ch){*buffer=ch;end=1;*(++buffer)='\0';break;} else *buffer++=*p++;} else if(*p=='/'&&*(p+1)=='*'){ p=p+2; while(*p!='*'&&*(p+1)!='/'){ if(*p==ch){printf("error");exit(0);} else p++;} p=p+2; } else *buffer++=*p++; } if(end); else {*buffer=ch;*(++buffer)='\0';} } /* 识别单词的函数 */ void token(char p[],char ch){ char temp[64],*ptemp=temp; int i=0,first=1; /*first 是用来判别在一个常数中有没有点的标志,如果出现过一次后再就不能出现。 */ struct save * q; struct save * search(char *p,struct save *key); void insert_key(char *s,struct save *p); void insert_sign(char *s,struct save *p); void insert_const(char *s,struct save *p); while(*p!=ch) { /* 处理关键字和标识符 ----------------------------*/ if(isalpha((int)*p)){ *(ptemp+i++)=*p++; while(*p!=ch&&isalnum((int)*p)) *(ptemp+i++)=*p++; *(ptemp+i)='\0'; i=0;/* 临时字符数组使用结束,将其起始位置清零 , 下同。 */ /* 处理 PTEMP( 查找并判断其是否为关键字 )*/ if(q=search(ptemp,key)){ printf("%s is keyword.\n",q->string); if(search(ptemp,emkey)); else insert_key(ptemp,emkey); } else if(q=search(ptemp,sign)) printf("%s was already exist in sign-list.\n",q->string); /* 否则插入到标识符链表中 */ else{insert_sign(ptemp,sign); printf("%s is a sign,it was inserted to sign_list finish.\n",ptemp); } continue; } /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/ /* 处理常数 -------------------------------------*/ else if(isdigit((int)*p)){ *(ptemp+i++)=*p++; while(*p!=ch&&(isdigit((int)*p)||(first&&*p=='.'&&isdigit((int)*(p+1))))){ if(*p=='.')first=0; *(ptemp+i++)=*p++; } *(ptemp+i)='\0'; i=0;first=1; if(q=search(ptemp,const_list)) printf("%s was already exist in constant-list.\n",q->string); /* 否则插入到常数链表中 */ else{insert_const(ptemp,const_list); printf("%s is a constant,it was inserted to constant_list finish.\n",ptemp); } continue; } /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/ /* 处理界限符 -------------------------------------*/ else if(*p==';'){ printf("; is a bounds symbol,its sort code is 3.\n"); if(*(p+1)!=ch) {p++;continue;} else return; } else if(*p=='.'){ printf(".(dot) is a bounds symbol,its sort code is 4.\n"); if(*(p+1)!=ch) {p++;continue;} else return; } else if(*p=='('){ printf("( is a bounds symbol,its sort code is 5.\n"); if(*(p+1)!=ch) {p++;continue;} else return; } else if(*p==')'){ printf(") is a bounds symbol,its sort code is 6.\n"); if(*(p+1)!=ch) {p++;continue;} else return; } /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/ /* 处理界限符 -------------------------------------*/ else if(*p=='+'){ printf("+ is a mathematic symbol,its sort code is 3.\n"); if(*(p+1)!=ch) {p++;continue;} else return; } else if(*p=='-'){ printf("- is a mathematic symbol,its sort code is 4.\n"); if(*(p+1)!=ch) {p++;continue;} else return; } else if(*p=='*'){ printf("* is a mathematic symbol,its sort code is 5.\n"); if(*(p+1)!=ch) {p++;continue;} else return; } else if(*p=='/'){ printf("/ is a mathematic symbol,its sort code is 6.\n"); if(*(p+1)!=ch) {p++;continue;} else return; } /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/ /* 处理赋值运算符 -------------------------------------*/ else if(*p==':'){ if(*(p+1)=='='){ printf(":= is a evaluate symbol,its sort code is 7.\n"); p++; } if(*(p+1)!=ch) {p++;continue;} else return; } /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/ /* 处理比较运算符 -------------------------------------*/ else if(*p=='='){ printf(") is a compare symbol,its sort code is 12.\n"); if(*(p+1)!=ch) {p++;continue;} else return; } else if(*p=='>'){ if(*(p+1)=='='){ printf(">= is a compare symbol,its sort code is 14.\n"); p++; } else printf("> is a compare symbol,its sort code is 13.\n"); if(*(p+1)!=ch) {p++;continue;} else return; } else if(*p=='<'){ if(*(p+1)=='='){ printf("<= is a compare symbol,its sort code is 16.\n"); p++; } else if(*(p+1)=='>'){ printf("<= is a compare symbol,its sort code is 18.\n"); p++; } else printf("< is a compare symbol,its sort code is 15.\n"); if(*(p+1)!=ch) {p++;continue;} else return; } /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/ else if(*p==' ') {p++;continue;} else if(*p==ch)return; else {printf("%c error",*p); return;} } } struct save * search(char *p,struct save *q)/* 搜索某一字符串是否为关键字 */ { struct save *key=q; while(key){ if(strcmp(p,key->string)==0)return key; key=key->next; } return key; } void insert_key(char *s,struct save *p)/* 插入某一字符串到标识符链表中 */ { struct save *q; if(p==NULL){ p=(struct save *)malloc(sizeof(struct save)); emkey=p; } else{ while(p){ q=p; p=p->next; } q->next=(struct save *)malloc(sizeof(struct save)); p=q->next; } strcpy(p->string,s); p->next=NULL; } void insert_sign(char *s,struct save *p)/* 插入某一字符串到标识符链表中 */ { struct save *q; if(p==NULL){ p=(struct save *)malloc(sizeof(struct save)); sign=p; } else{ while(p){ q=p; p=p->next; } q->next=(struct save *)malloc(sizeof(struct save)); p=q->next; } strcpy(p->string,s); p->next=NULL; } void insert_const(char *s,struct save *p)/* 插入某一字符串到常数链表中 */ { struct save *q; if(p==NULL){ p=(struct save *)malloc(sizeof(struct save)); const_list=p; } else{ while(p){ q=p; p=p->next; } q->next=(struct save *)malloc(sizeof(struct save)); p=q->next; } strcpy(p->string,s); p->next=NULL; }