📄 kcsj.cpp
字号:
#include<string.h>//字符串处理
#include<stdio.h>
#include<stdlib.h>//通用函数
char blz[37][50]={"auto","_bool","break","case","char","_complex","const","continue","default",
"restrict","do","double","else","enum","extern","float","for","goto","if",
"_imaginary","inline","int","long","register","return","short","signed",
"sizeof","static","struct","switch","typedef","union","unsigned","void",
"volatile","while"}; /*定义保留字数组*/
char fgf[14]={'#','(',')','[',']','\'','|',';',':','"','{','}',',','\\'}; /*分隔符数组*/
char ysf[36][50]={"!","%","^","&","*","-","+","=","~","|",".","<",">","/","?","+=","-=",
"*=","/=","%=","<<=",">>=","&=","^=","|=","->","++","--","<<",">>","<=",
">=","==","!=","&&","||"}; /*运算符数组*/
int Jwl=0;
int Pwl=0;
int Qwl=0;
int Ywl=0;
int Nwl=0;
int Mwl=0;
int Hwl=0;
FILE *fpout;
FILE *fptmp;
int IsYsf(char n) /*判断一个字符是否是运算符的组成部分*/
{
int i,j;
for(i=0;i<36;i++)
for(j=0;j<50;j++)
if(n==ysf[i][j])return(1);
return(0);
}
int IsFgf(char n) /*判断一个字符是否是分隔符*/
{
int i;
for(i=0;i<14;i++)
if(n==fgf[i])return(1);
return(0);
}
int IsNum(int n) /*判断一个字符是否是数字*/
{
if(n>='0'&&n<='9')return(1);
else return(0);
}
int IsChar(char a) /*判断一个字符是否是浮点型常量的独有字符*/
{
int i;
char na[5]={'.','+','-','e','E'};
for(i=0;i<5;i++)
if(na[i]==a)
return(1);
return(0);
}
int Judge(int n) /*判断一个字符是否是标识符的首字符*/
{
if((n>='a'&&n<='z')||(n>='A'&&n<='Z')||n=='_')
return(1);
return(0);
}
void writefile(FILE *fptmp,FILE *fpout) /*将输出内容写入指定文件*/
{
char c;
c=fgetc(fptmp);
while(c!=EOF)
{
fprintf(fpout,"%c",c);
c=fgetc(fptmp);
}
}
char name[50];
char path[50]; /*输出文件的路径*/
int Cheak(FILE *fp) /*主判断函数*/
{
char dd[40];
int i,j,k;
int flag=1;
char cc=fgetc(fp);
if(cc=='\'') /*对字符型常量的处理*/
{
dd[0]='\'';
j=1;
cc=fgetc(fp);
while(cc!='\'')
{
dd[j]=cc;
cc=fgetc(fp);
j++;
}
dd[j]='\'';
dd[++j]='\0';
printf("4 2 %d %s\r\n",Pwl,dd);
Pwl++;
return(1);
}
else if(cc=='"') /*对字符串型常量的处理*/
{
j=1;
dd[0]=cc;
cc=fgetc(fp);
while(cc!='"' && cc!=EOF)
{
dd[j]=cc;
cc=fgetc(fp);
j++;
}
dd[j]=cc;
dd[++j]='\0';
printf("4 3 %d %s\r\n",Qwl,dd);
Qwl++;
return(1);
}
else if(cc=='0') /*对以0开头的常量的处理*/
{
i=1;
dd[0]=cc;
cc=fgetc(fp);
if(cc=='.')
{
dd[i]=cc;
i++;
while(IsNum(cc)||IsChar(cc))
{
dd[i]=cc;
cc=fgetc(fp);
i++;
}
dd[i]='\0';
fseek(fp,-1,1);
printf("4 1 %d %s\r\n",Ywl,dd);
Ywl++;
return(1);
}
else
fseek(fp,-1,1);
printf("4 0 %d 0\r\n",Nwl);
Nwl++;
return(1);
}
else if(cc>'0'&&cc<='9') /*对浮点和整型常量的处理*/
{
j=1;
dd[0]=cc;
cc=fgetc(fp);
while(IsNum(cc)||IsChar(cc))
{
dd[j]=cc;
cc=fgetc(fp);
j++;
}
dd[j]='\0';
fseek(fp,-1,1);
for(k=0;k<j;k++)
if(IsChar(dd[k]))
{
flag=0;
printf("4 1 %d %s\r\n",Mwl,dd);
Mwl++;
return(1);
}
if(flag)
{
printf("4 0 %d %s\r\n",Hwl,dd);
Hwl++;
return(1);
}
}
else if(Judge(cc)) /*对标识符的处理*/
{
i=1;
dd[0]=cc;
cc=fgetc(fp);
while(Judge(cc)||(cc>='0'&&cc<='9'))
{
dd[i]=cc;
cc=fgetc(fp);
i++;
}
fseek(fp,-1,1);
dd[i]='\0';
for(j=0;j<37;j++)
{
if(strcmp(dd,blz[j])==0)
{
printf("0 %d %s\r\n",j,blz[j]);
return(1);
}
else
{
printf("3 %d %s\r\n",Jwl,dd);
Jwl++;
return(1);
}
}
}
else if(IsFgf(cc)) /*对分隔符的处理*/
{
for(i=0;i<14;i++)
if(cc==fgf[i])
printf("1 %d %c\r\n",i,cc);
return(1);
}
else if(IsYsf(cc))
{
j=1;
dd[0]=cc;
cc=fgetc(fp);
while(IsYsf(cc)) /*对运算符的处理,完成*/
{
dd[j]=cc;
j++;
cc=fgetc(fp);
}
dd[j]='\0';
fseek(fp,-1,1);
if(j<3)
{
for(k=0;k<35;k++)
if(strcmp(dd,ysf[k])==0)
{
printf("2 %d %s\r\n",k,ysf[k]);
return(1);
}
}
else
{
printf("This string is not exist!\n");
return(0);
}
}
return(0);
}
void scanner_Chuiser(FILE *fp){ /*主处理函数*/
char ch;
ch=fgetc(fp);
while(ch!=EOF)
{
if(ch=='/')
{ /*对注释的处理*/
ch=fgetc(fp);
if(ch=='*')
{
while ((ch=fgetc(fp))!='*'){}
ch=fgetc(fp);
if (ch=='/');
else
{
printf ("The remark of the source file error!\n");
exit(0);
}
}
else {
fseek(fp,-2,1);Cheak(fp);
}
}
else {
fseek(fp,-1,1);Cheak(fp);
}
ch=fgetc(fp);
}
}
void main(int argc,char *argv[]) /*主函数*/
{ FILE *fp;
if((fptmp=fopen("tmp.txt","w"))==NULL) /*tmp.txt用于暂存输出内容*/
{
exit(0);
}
printf ("Please input the name of the source file\n");
printf ("For example: -> c:\\project\\file.c <- \n");
printf ("Enter: ");
gets(name);
printf ("The internal code translation list:\n");
if ((fp=fopen(name,"r"))==NULL)
{
printf ("Can't open the file\n");
exit(0);
}
scanner_Chuiser(fp);
fclose(fp);
fclose(fptmp);
printf ("Please input the path of the destination file\n");
printf ("For example: -> c:\\project\\output.txt <- \n");
printf ("Enter: ");
gets(path);
if ((fpout=fopen(path,"w"))==NULL)
{
printf ("Can't open the output file!\n");
exit(0);
}
if ((fptmp=fopen("tmp.txt","r"))==NULL)
{
exit(0);
}
writefile(fptmp,fpout);
printf ("Save completed! \n");
fclose(fpout);
fclose(fptmp);
}
//FILE *fp;
//printf ("Please input the name of the source file\n");
//printf ("For example: -> c:\\project\\file.c <- \n");
//printf ("Enter: ");
// scanf ("%s",name);
//printf ("Stdio.h文件中的程序代码部分 :\n");
//if ((fp=fopen(name,"r"))==NULL)
//{
// printf ("Can't open the file\n");
// exit(0);
//}
// scanner_Chuiser(fp);
// fclose(fp);
//}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -