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(); 
}