📄 1.c
字号:
#include<stdio.h>
#include<string.h>
char Keyword[32][10]={"auto","break","case","char","const","continue","default","do","double","else","enum",
"extern","float","for","goto","if","int","long","register","return","short","signed",
"sizeof","static","struct","switch","typedef","union","unsigned","void","volatile","while"};
char Operator[30][3]={"+","-","*","/","%","!","++","--","<",">","=","<=",">=","==","!=","&&","||",
"+=","-=","*=","/=","%=","[","]","->",".","&","|","<<",">>"};
char Seperator[8][3]={";",",","{","}","(",")","'","\""};
char after[18]={'+','-','*','/','%','!','<','>','=','&','|',';',',','(',')','\"','{','}'};//可能跟在数字或字母后表表一个数或标识符结束
char first[11]={'+','-','*','/','%','!','<','>','=','&','|'};//需要超前读取来判断是两个还是一个字符组成的算符或界符
char temid[50][20];
char teminum[50][20];
char temfnum[20][20];
int line=1,errnum=1;
int isletter(char c);//判断是不是字母
int isnum(char c);//判断是不是数字
int inafter(char c);//判断数字或标识符后的紧随的一些分割字符
int infirst(char c);//判断是否是需要超前读取的算符或界符
int inkeyword(char str[]);//判断是否是关键字
int inoperator(char str[]);//判断是否在操作符中
int inseperator(char str[]);//判断是否在分隔符中
int isappear(char str[],char tem[][20],int num);//判断标识符或数字是否出现过
int numanalyze(char str[]);//数字分析
main()
{
int i,j,k;
int mark,idnum=0,intnum=0,floatnum=0;
char c;
char str[30];
char temst[30];
FILE *fc;//c语言原程序文件
FILE *f;//分析结果存放文件
FILE *fk,*fi,*fin,*ffn,*fo,*fs,*fot;
//fk:keyword,fi:Indentifier,fin:Intnumber,ffn:Floatnumber,fo:Operator,fs:Seperator,fot:Others
while((fc=fopen("test1.txt","r"))==NULL);
while((f=fopen("Analyze_Result.txt","w+"))==NULL);
while((fk=fopen("Keyword.txt","w+"))==NULL);
while((fi=fopen("Indentifier.txt","w+"))==NULL);
while((fin=fopen("Intnumber.txt","w+"))==NULL);
while((ffn=fopen("Floatnumber.txt","w+"))==NULL);
while((fo=fopen("Operator.txt","w+"))==NULL);
while((fs=fopen("Seperator.txt","w+"))==NULL);
while((fot=fopen("Others.txt","w+"))==NULL);
fprintf(fk," %s\n\n","Keyword_List");//输出关键字文件
for(i=0;i<32;i++)
fprintf(fk,"%8s %d\n",Keyword[i],i+1);
fclose(fk);
fprintf(fo," %s\n\n","Operator_List");//输出操作符文件
for(i=0;i<30;i++)
fprintf(fo,"%5s %d\n",Operator[i],i+1);
fclose(fo);
fprintf(fs," %s\n\n","Seperator_List");//输出分割符文件
for(i=0;i<8;i++)
fprintf(fs,"%5s %d\n",Seperator[i],i+1);
fclose(fs);
c=fgetc(fc);
while(c!=EOF)
{
if(isletter(c))
{
i=0;
while(isletter(c)||isnum(c)||c=='_')
{
str[i]=c;
i++;
c=fgetc(fc);
}
fseek(fc,-sizeof(char),1);
str[i]='\0';
k=inkeyword(str);
if(k!=-1)
fprintf(f,"%10s (%s,%d)\n",str,"Keyword",k+1);
else
{
if(idnum==0)
{
fprintf(fi," %s\n\n","Indentifier_List");
fprintf(f,"%10s (%s,%d)\n",str,"Indentifier",idnum+1);
fprintf(fi,"%10s %d\n",str,idnum+1);
strcpy(temid[idnum],str);
idnum++;
}
else
{
j=isappear(str,temid,idnum+1);
if(j==-1)
{
fprintf(f,"%10s (%s,%d)\n",str,"Indentifier",idnum+1);
fprintf(fi,"%10s %d\n",str,idnum+1);
strcpy(temid[idnum],str);
idnum++;
}
else
fprintf(f,"%10s (%s,%d)\n",str,"Indentifier",j+1);
}
}
}
else if(isnum(c))
{
i=0;
while(isnum(c)||isletter(c)||c=='.'||c=='+'||c=='-')
{
if(isletter(c)&&c!='E'&&c!='e')
{
printf("error %d:(line %d)Indentifier can't begin with numbers.\n",errnum,line);
errnum++;
i=0;
break;
}
str[i]=c;
i++;
c=fgetc(fc);
}
if(i==0)
{
while(!inafter(c)&&c!=' ')
c=fgetc(fc);
fseek(fc,-sizeof(char),1);
}
else
{
fseek(fc,-sizeof(char),1);
str[i]='\0';
mark=numanalyze(str);
if(mark==0)//整型数
{
if(intnum==0)
{
fprintf(fin," %s\n\n","Intnumber_List");
fprintf(f,"%10s (%s,%d)\n",str,"Intnumber",intnum+1);
fprintf(fin,"%10s %d\n",str,intnum+1);
strcpy(teminum[intnum],str);
intnum++;
}
else
{
j=isappear(str,teminum,intnum+1);
if(j==-1)
{
fprintf(f,"%10s (%s,%d)\n",str,"Intnumber",intnum+1);
fprintf(fin,"%10s %d\n",str,intnum+1);
strcpy(teminum[intnum],str);
intnum++;
}
else
fprintf(f,"%10s (%s,%d)\n",str,"Intnumber",j+1);
}
}
else if(mark==1)//浮点数
{
if(floatnum==0)
{
fprintf(ffn," %s\n\n","Floatnumber_List");
fprintf(f,"%10s (%s,%d)\n",str,"Floatnumber",floatnum+1);
fprintf(ffn,"%10s %d\n",str,floatnum+1);
strcpy(temfnum[floatnum],str);
floatnum++;
}
else
{
j=isappear(str,temfnum,intnum+1);
if(j==-1)
{
fprintf(f,"%10s (%s,%d)\n",str,"Floatnumber",floatnum+1);
fprintf(ffn,"%10s %d\n",str,floatnum+1);
strcpy(temfnum[floatnum],str);
floatnum++;
}
else
fprintf(f,"%10s (%s,%d)\n",str,"Floatnumber",j+1);
}
}
}
}
else if(c==' '||c=='\n')
{
while(c==' '||c=='\n')
{
if(c=='\n')
line++;
c=fgetc(fc);
}
if(c==EOF)
break;
fseek(fc,-sizeof(char),1);
}
else
{
if(infirst(c))
{
str[0]=c;
c=fgetc(fc);
str[1]=c;
str[2]='\0';
if((i=inoperator(str))!=-1)
fprintf(f,"%10s (%s,%d)\n",str,"Operator",i+1);
else
{
fseek(fc,-sizeof(char),1);
str[1]='\0';
j=inoperator(str);
if(j!=-1)
fprintf(f,"%10s (%s,%d)\n",str,"Operator",j+1);
else
{
k=inseperator(str);
if(k!=-1)
fprintf(f,"%10s (%s,%d)\n",str,"Seperator",k+1);
else
fprintf(fot,"line %d:(other operater or seperater)%s\n",line,str);
}
}
}
else
{
if(c=='\'')
{
i=0;
c=fgetc(fc);
while(c!='\'')
{
temst[i]=c;
c=fgetc(fc);
i++;
}
temst[i]='\0';
fprintf(fot,"line %d:(character) %s\n",line,temst);
}
else if(c=='\"')
{
i=0;
c=fgetc(fc);
while(c!='\"')
{
temst[i]=c;
c=fgetc(fc);
i++;
}
temst[i]='\0';
fprintf(fot,"line %d:(string) %s\n",line,temst);
}
else
{
str[0]=c;
str[1]='\0';
j=inoperator(str);
if(j!=-1)
fprintf(f,"%10s (%s,%d)\n",str,"Operator",j+1);
else
{
k=inseperator(str);
if(k!=-1)
fprintf(f,"%10s (%s,%d)\n",str,"Seperator",k+1);
else
fprintf(fot,"line %d:(other operater or seperater)%s\n",line,str);
}
}
}
}
c=fgetc(fc);
}
fclose(f);
fclose(fc);
fclose(fi);
fclose(fin);
fclose(ffn);
fclose(fot);
}
int isletter(char c)
{
if(c>='a'&&c<='z'||c>='A'&&c<='Z')
return 1;
else
return 0;
}
int isnum(char c)
{
if(c>='0'&&c<='9')
return 1;
else
return 0;
}
int inafter(char c)
{
int i;
for(i=0;i<18;i++)
{
if(c==after[i])
return 1;
}
return 0;
}
int infirst(char c)
{
int i;
for(i=0;i<11;i++)
{
if(c==first[i])
return 1;
}
return 0;
}
int inkeyword(char str[])
{
int i;
for(i=0;i<32;i++)
{
if((strcmp(str,Keyword[i]))==0)
return i;
}
return -1;
}
int inoperator(char str[])
{
int i;
for(i=0;i<30;i++)
{
if((strcmp(str,Operator[i]))==0)
return i;
}
return -1;
}
int inseperator(char str[])
{
int i;
for(i=0;i<8;i++)
{
if((strcmp(str,Seperator[i]))==0)
return i;
}
return -1;
}
int isappear(char str[],char tem[][20],int num)
{
int i;
for(i=0;i<num;i++)
{
if(strcmp(str,tem[i])==0)
return i;
}
return -1;
}
int numanalyze(char str[])
{
int i,j;
for(i=0;str[i]!='\0';i++)
{
if(isnum(str[i])==0)
break;
}
if(str[i]=='\0')
return 0;
else
{
if(str[i]=='.')
{
for(;str[i]!='\0';i++)
{
if(str[i]=='+'||str[i]=='-')
{
printf("error %d:(line %d)Illegal floatnumber.\n",errnum,line);
errnum++;
return -1;
}
if(str[i]=='E'||str[i]=='e')
break;
}
if(str[i]=='\0')
return 1;
else
{
if(str[i+1]=='.')
{
printf("error %d:(line %d)Illegal floatnumber.\n",errnum,line);
errnum++;
return -1;
}
else if(str[i+1]=='\0')
return 1;
for(j=i+2;str[j]!='\0';j++)
{
if(isnum(str[j])==0)
{
printf("error %d:(line %d)Illegal floatnumber.\n",errnum,line);
errnum++;
return -1;
}
}
return 1;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -