www.pudn.com > eva.rar > 002.c
#include "safx.h" #include#include #include #include #include #include #include #define NULL 0 FILE *fp; char ch; char *keyword[8]={"do","begin","else","end","if","then","var","while"}; char *operatornum[4]={" ","-","*","/"}; char *comparison[6]={"<","<=","=",">",">=","<>"}; char *interpunction[6]={",",";",":=",".","(",")"}; ////////////////////////////////////////////////////////////////////////////////////////// bool search(char searchs[],int wordtype) { int i; switch (wordtype) { case 1:for(i=0;i<=7;i ) { if(scmp(keyword[i],searchs)==0) return(ue); } case 2:{ for(i=0;i<=3;i ) { if(scmp(operatornum[i],searchs)==0) return(ue); } break; } case 3: for(i=0;i<=5;i ) { if(scmp(comparison[i],searchs)==0) return(ue); } case 4: for(i=0;i<=5;i ) { if(scmp(interpunction[i],searchs)==0) return(ue); } } return(false); } /////////////////////////////////////////////////////////////////////////////////////////// char letterprocess (char ch)//字母处理函数 { int i=-1; char letter[20]; while (isalnum(ch)!=0) { letter[ i]=ch; ch=fgetc(fp); }; letter[i 1]='\0'; if (search(letter,1)) { printf("<%s,->\n",letter); //scat(letter,"\n"); //fputs('<' letter '>\n',outp); } else { printf(" \n",letter); //scat(letter,"\n"); //fputs(letter,outp); } return(ch); } /////////////////////////////////////////////////////////////////////////////////////////// char numberprocess(char ch)//数字处理程序 { int i=-1; char num[20]; while (isdigit(ch)!=0) { num[ i]=ch; ch=fgetc(fp); } if(isalpha(ch)!=0) { while(isspace(ch)==0) { num[ i]=ch; ch=fgetc(fp); } num[i 1]='\0'; printf("错误!非法标识符:%s\n",num); goto u; } num[i 1]='\0'; printf(" \n",num); //scat(num,"\n"); //fputs(num,outp); u: return(ch); } ////////////////////////////////////////////////////////////////////////////////////////////// char otherprocess(char ch) { int i=-1; char other[20]; if (isspace(ch)!=0) { ch=fgetc(fp); goto u; } while ((isspace(ch)==0)&&(isalnum(ch)==0)) { other[ i]=ch; ch=fgetc(fp); } other[i 1]='\0'; if (search(other,2)) printf(" \n",other); else if (search(other,3)) printf("<%s,->\n",other); else if (search(other,4)) printf("<%s,->\n",other); else printf("错误!非法字符:%s\n",other); u: return (ch); } ///////////////////////////////////////////////////////////////////////////////////////////// void main () { char s,c; printf("**********************************词法分析器************************************\n"); //outp=fopen("二元式表.txt","w"); if ((fp=fopen("源程序.txt","r"))==NULL) printf("源程序无法打开!\n"); else { s =fgetc(fp); while (s!=EOF) { if (isalpha(s)!=0) s=letterprocess(s); else { if (isdigit(s)!=0) s=numberprocess(s); else s=otherprocess(s); } }; printf("词法分析结束,谢谢使用!\n"); printf("点任意键退出!\n"); } c=getch(); }