📄 compile.c
字号:
/*1、2、3、4、5,分别代表单词为关键字、标识符、常数、运算符和分隔符
识别关键字:if、int、string、void、for、while、return、break、continue、read、write
其他的都识别为标识符;
常数为无符号整形数和字符串;
运算符包括:+、-、*、/、=、>、<、>=、<=、!=
分隔符包括:,、;、{、}、(、)、"
空格和注释(包括单行注释和多行注释)不输出*/
#include<stdio.h>
#include<string.h>
main()
{
FILE *fp;
int flag,count=0,i=0;
long int number=0;
char ch,filename[10];
char temp[10]={'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'};
printf("关键字(1)--标识符(2)--常数(3)--运算符(4)--分隔符(5)");
printf("\n请输入编译的文件名:");
scanf("%s",filename);
if((fp=fopen(filename,"rb"))==NULL)/*以二进制打开文件*/
{
printf("Loading file error!\n");
return 0;
}
ch=fgetc(fp);/*从原文件以二进制读1个字节*/
while((ch==' ')||(ch==13))
{
ch=fgetc(fp);
}
flag=letter(ch);
if(flag==2)//第一个是字母
{
while(flag==2)
{
temp[count]=ch;count++;
ch=fgetc(fp);
flag=letter(ch);
}
flag=keyword(temp);
if(flag==1)
{
printf("(%d,'%s')\n",flag,temp);
}
else
{
printf("(%d,'%s')\n",flag,temp);
}
}
else
{
flag=seperator(ch);//分隔符(5)
if(flag==5)
{
printf("(%d,'%c')\n",flag,ch);
}
else
{
flag=operater(ch);//运算符(4)
if(flag==4)
{
if(ch=='/')
{
ch=fgetc(fp);
flag=operater(ch);
while((flag==4)&&(ch=='/'))
{
while(ch!=10)
{ch=fgetc(fp);}
}
}
else
printf("(%d,'%c')\n",flag,ch);
}
}
}
if(flag==-1)
{
flag=constant(ch);//常数(3)
count=0;
for(i=0;i<10;i++)
{temp[i]='\0';}
if(flag==3)
{
while(flag==3)
{
temp[count]=ch;count++;
ch=fgetc(fp);
flag=constant(ch);
}
flag=letter(ch);
if(flag==2)//常数后跟字母
{
while(flag==2)
{
ch=fgetc(fp);
flag=letter(ch);
}
printf("词法错误----------标识符定义出错!\n");
}
else//常数后不跟字母
{
fp=fp-3;
printf("(3,'%s')\n",temp);
}
}
}
while(ch!=EOF)
{
while((ch==' ')||(ch==13)||(ch==10))
{
ch=fgetc(fp);
}
flag=letter(ch);
if(flag==2)//第一个是字母
{
count=0;
for(i=0;i<10;i++)
{temp[i]='\0';}
while(flag==2)
{
temp[count]=ch;count++;
ch=fgetc(fp);
flag=letter(ch);
}
flag=keyword(temp);
if(flag==1)
{
printf("(%d,'%s')\n",flag,temp);
}
else
{
printf("(%d,'%s')\n",flag,temp);
}
}
else
{
flag=seperator(ch);//分隔符(5)
if(flag==5)
{
printf("(%d,'%c')\n",flag,ch);
ch=fgetc(fp);
}
else
{
flag=operater(ch);//运算符(4)
if(flag==4)
{
if(ch=='/')
{
ch=fgetc(fp);
flag=operater(ch);
while((flag==4)&&(ch=='/'))
{
while(ch!=10)
{ch=fgetc(fp);}
}
}
else
printf("(%d,'%c')\n",flag,ch);
ch=fgetc(fp);
}
}
}
if(flag==-1)
{
count=0;
for(i=0;i<10;i++)
{temp[i]='\0';}
flag=constant(ch);//常数(3)
if(flag==3)
{
while(flag==3)
{
temp[count]=ch;count++;
ch=fgetc(fp);
flag=constant(ch);
}
flag=letter(ch);
if(flag==2)//常数后跟字母
{
while(flag==2)
{
ch=fgetc(fp);
flag=letter(ch);
}
printf("词法错误----------标识符定义出错!\n");
}
else//常数后不跟字母
{
printf("(3,'%s')\n",temp);
}
}
}
}
fclose(fp);
}
int seperator(char a)//分隔符(5)
{
int i=0,flaga;
char *a1[]={",", ";", "{", "}", "(", ")","\""};
for(i=0;i<6;i++)
{
if(a==*(a1[i]))
{
flaga=5;break;
}
else
flaga=-1;
}
return(flaga);
}
int operater(char o)//运算符(4)
{
int i=0,flago;
char *operater1[]={"+", "-", "*", "=", ">", "<", ">=", "<=","/","!="};
for(i=0;i<10;i++)
{
if(o==*(operater1[i]))
{
flago=4;break;
}
else
flago=-1;
}
return(flago);
}
int constant(char c)//常数(3)
{
int i=0,flagc;
char *constant1[]={"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
for(i=0;i<9;i++)
{
if(c==*(constant1[i]))
{
flagc=3;break;
}
else
flagc=-1;
}
return(flagc);
}
int keyword(char *k)//关键字(1)
{
int i=0,flagk;
char *keyword1[11]={"if","int","string","void","for","while","return","break","continue","read","write"};
for(i=0;i<10;i++)
{
if(strcmp(k,keyword1[i])==0)
{
flagk=1;break;//关键字(1)
}
else
flagk=2;//标识符(2)
}
return(flagk);
}
int letter(char l)//读入字母
{
int flagl;
if(((l>='A')&&(l<='Z'))||(l>='a')&&(l<='z'))
{
flagl=2;
}
else
flagl=-1;
return(flagl);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -