📄 analysis.cpp
字号:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define MaxLength 100
const int WORDNUM = 32,OPERATORNUM = 44;
const int SPECIALNUM = 3,TYPENUM = 6;
char *Words[]={"char", "double", "enum", "float", "int", "long", "short",
"signed", "struct", "union", "unsigned", "void","break",
"case", "continue", "default", "do", "else", "for", "goto",
"if", "return", "switch", "while","auto", "extern", "register",
"static","const", "sizeof", "typedef", "volatile"
};
char *Operators[]={
"+","-","*","/","%","++","#","\"",
"--",">","<","==",">=","<=","'",
"!=","&&","||","!","&","|","~",
"^","<<",">>","=","+=","-=","*=",
"/=","%=","&=","|=","^=",">>=",";",
"<<=",",","*","&","(",")","[","]"
};
char *Type[] = {"关键字","运算符","数 字","标示符","其 它","特殊字",};
char *Scope[] = {"1--32","33--76","77","78","79","80--82"};
FILE *outPutFile;
int IsMatchOperators(char *str,int length)
{
int i,temp;
for(i=0;i<OPERATORNUM;i++)
{
temp = strlen(Operators[i]);
if(temp == length)
{
if(!strcmp(Operators[i],str)) // 匹配
return (i+33);
}
}
return 0;
}
int IsMatchWords(char *word,int length)
{
int i,temp;
for(i=0;i<WORDNUM;i++)
{
temp = strlen(Words[i]);
if(temp == length)
{
if(!strcmp(Words[i],word))
return (i+1);
}
}
return 0;
}
int IsNumber(char C)
{
return (C>='0' && C<='9');
}
int IsLetter(char C)
{
return ((C>='A' && C<='Z') || (C>='a' && C<='z'));
}
void Analysis(char *str)
{
int i,index,num = 0,length = strlen(str);
char *curStr = (char *)malloc(MaxLength*sizeof(char));
if(str[(int)(strlen(str)-1)]=='\n')
length -= 1;
for(i=0;i<length;i++)
{
while(i<length && (str[i] == ' ' || str[i] == '\t')) // 过滤空格
i++;
if(i>=length || str[i] == '\n')
break;
num = 0;
if(IsNumber(str[i])) // 数字
{
while(i<length && IsNumber(str[i])) // 数字
curStr[num++] = str[i++];
curStr[num]='\0';
printf(" ");
fprintf(outPutFile," ");
printf("(%s,%s)\n",Scope[2],curStr);
fprintf(outPutFile,"(%s,%s)\n",Scope[2],curStr);
}
else if(IsLetter(str[i])) // 字母
{
while(i<length && (IsLetter(str[i]) || IsNumber(str[i]))) // 字母或数字
curStr[num++] = str[i++];
curStr[num]='\0';
//index = IsMatchSpecialWords(curStr,num);
index = IsMatchWords(curStr,num);
printf(" ");
fprintf(outPutFile," ");
if(index)
{
printf("(%d,%s)\n",index,curStr);
fprintf(outPutFile,"(%d,%s)\n",index,curStr);
}
else
{
printf("(%s,%s)\n",Scope[3],curStr);
fprintf(outPutFile,"(%s,%s)\n",Scope[3],curStr);
}
}
else // 其他
{
if(str[i] == ';')
{
curStr[num++] = str[i++];
}
else
{
while(i<length && str[i] != ' ' && str[i] != ';' && str[i] != '\0')
{
if(!IsLetter(str[i]) && !IsNumber(str[i])) // 字母或数字
{
curStr[num++] = str[i++];
curStr[num] = '\0';
index = IsMatchOperators(curStr,num);
if(index)
{
curStr[num] = str[i];
curStr[num+1] = '\0';
if(IsMatchOperators(curStr,num+1))
continue;
break;
}
}
else
break;
}
}
curStr[num]='\0';
index = IsMatchOperators(curStr,num);
printf(" ");
fprintf(outPutFile," ");
if(index)
{
printf("(%d,%s)\n",index,curStr);
fprintf(outPutFile,"(%d,%s)\n",index,curStr);
}
else
{
printf("(%s,%s)\n",Scope[4],curStr);
fprintf(outPutFile,"(%s,%s)\n",Scope[4],curStr);
}
}
i--;
}
}
void main()
{
int j,length;
char *path = (char *)malloc(MaxLength*sizeof(char));
char *outPutPath = (char *)malloc(MaxLength*sizeof(char));
char *str = (char *)malloc(MaxLength*sizeof(char));
char *str2 = (char *)malloc(MaxLength*sizeof(char));
FILE *file;
while(true)
{
printf("Please input the path of your file: ");
scanf("%s",path);
if(file = fopen(path,"r"))
{
printf("Please input the output path of file: ");
scanf("%s",outPutPath);
if(outPutFile = fopen(outPutPath,"w"))
{
printf("*****************************\n");
fprintf(outPutFile,"*****************************\n");
for(int i=0;i<TYPENUM;i++)
{
printf("%s: %s\n",Type[i],Scope[i]);
fprintf(outPutFile,"%s: %s\n",Type[i],Scope[i]);
}
printf("*****************************\n");
fprintf(outPutFile,"*****************************\n");
//while(fscanf(file,"%s",str) > 0)
while(fgets(str,MaxLength,file))
{
length = (int)strlen(str);
for(i=0,j=0;i<length;i++)
{
if(str[i] != ' ' && str[i] != '\t')
break;
}
while(i<length)
str2[j++] = str[i++];
str2[j] = '\0';
printf("%s",str2);
fprintf(outPutFile,"%s",str2);
if(str[length-1]!='\n')
{
printf("\n");
fprintf(outPutFile,"\n");
}
Analysis(str);
}
fclose(file);
return;
}
}
else
{
printf("\nInvalid Path!!\n");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -