📄 zhaoshiwei.c
字号:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <malloc.h>
#define N 50
#define M 500
char *a[34]={"auto","break","case","char","const","continue","default","do",
"double","else","enum","extern","float","for","goto","if",
"int","long","main","printf","register","return","short","signed","sizeof","static",
"struct","switch","typedef","union","unsigned","void","while","volatile"};
char *b[13]={"&&","||","++","--","+","-","*","/","=",">=","<=","==","!="};
char *c[11]={"[","]","{","}","(",")",",",";","'","#",";"};
char scmp(char *str) /*此函数判断单词类型*/
{
int i;
for(i=0;i<34;i++) /*a中的关键字*/
{
if(strcmp(str,a[i])==0)
return 'K';
}
for(i=0;i<13;i++) /*b 中的符号*/
{
if(strcmp(str,b[i])==0)
return 'A';
}
for(i=0;i<11;i++) /*c中符号*/
{
if(strcmp(str,c[i])==0)
return 'R';
}
if(isdigit(str[0])) /*0-9是数字返回num*/
{
return 'N';
}
/*一般的变量与字符*/
if(!isalnum(str[0]))
return 'R';
else return 'C';/*变量*/
}
void main(void)
{
FILE *in,*out,*fp,*table, *test;
char ch,cha,buffer[N],*link[M],link2[M][32];
int i=0,j=0,k,numLink=0;
if((in=fopen("source.txt","r+"))==NULL)
{
printf("source.txt can't open or doesn't exist...\n");
getch();exit(0);
}
if((out=fopen("token.txt","w+"))==NULL)
{
printf("output file can not open...\n");
getch();exit(0);
}
if((table=fopen("table.txt","w+"))==NULL)
{
printf("output file can not open...\n");
getch();exit(0);
}
while(!feof(in))
{
ch=fgetc(in);
if(ch=='\t' || ch==' ' || ch== '\n')
continue;
if(isalpha(ch)) /*如果首字符是字母*/
{
while(isalpha(ch)&&(i<N))
{
buffer[i++]=ch;
ch=fgetc(in);
}
buffer[i]='\0';
link[j++]=(char *)malloc(sizeof(char)*(strlen(buffer)+1));
strcpy(link[j-1],buffer);
i=0;
fseek(in,-1L,1);
}
else if(isdigit(ch)) /*如果首字符是数字*/
{
while(isdigit(ch)&&(i<N))
{
buffer[i++]=ch;
ch=fgetc(in);
}
buffer[i]='\0';
link[j++]=(char *)malloc(sizeof(char)*(strlen(buffer)+1));
strcpy(link[j-1],buffer);
i=0;
fseek(in,-1L,1);
}
else if(!isalnum(ch)) /*如果首字符既不是数字也不是字母的话*/
{
if(ch!='\n'&&ch!=' ')
{
if(ch=='>'||ch=='<'||ch=='!') /* 以下代码实现超前搜索 */
{
if((cha=fgetc(in))=='=')
{
buffer[i++]=ch;
buffer[i++]=cha;buffer[i]='\0';
link[j++]=(char *)malloc(sizeof(char)*3);
strcpy(link[j-1],buffer);
i=0;
}
else
{
buffer[i++]=ch;buffer[i]='\0';
link[j++]=(char *)malloc(sizeof(char)*2);
strcpy(link[j-1],buffer);
i=0;
fseek(in,-1L,1);
}
}
else if(ch=='+'||ch=='-'||ch=='&'||ch=='|'||ch=='=')
{
if((cha=fgetc(in))==ch)
{
buffer[i++]=ch;buffer[i++]=cha;buffer[i]='\0';
link[j++]=(char *)malloc(sizeof(char)*3);
strcpy(link[j-1],buffer);
i=0;
}
else
{
buffer[i++]=ch;buffer[i]='\0';
link[j++]=(char *)malloc(sizeof(char)*2);
strcpy(link[j-1],buffer);
i=0;
fseek(in,-1L,1);
}
}
else
{
buffer[i++]=ch;buffer[i]='\0';
link[j++]=(char *)malloc(sizeof(char)*2);
strcpy(link[j-1],buffer);
i=0;
}
}
}
}
numLink = j-1;
k = 0;
for(i=0;i<numLink;i++)
{
for(j=0;j<i;j++)
{
if(strcmp(link[i],link[j])==0)
break;
}
if(i==j)
{
/*link2[k]==(char*)(malloc)(32*sizeof(char));*/
strcpy(link2[k++],link[i]);
}
}
fprintf(out,"************************\n");
fprintf(out,"K means keyword \n");
fprintf(out,"A means addop\n");
fprintf(out,"R means relop\n");
fprintf(out,"N means num\n");
fprintf(out,"C means id\n");
fprintf(out,"************************\n");
for(i=0;i<numLink;i++)
{
cha=scmp(link[i]); /*判断单词的类型*/
fputc('(',out);
fputc(cha,out);
fputc(',',out);
fputs(link[i],out);
for(j=0;j<k;j++)
{
if(strcmp(link[i],link2[j])==0)
{
fputc(',',out);
fprintf(out,"%d",j);
fputc(')',out);
fputc('\n',out);
}
}
}
for(i=0;i<k;i++)
{
cha=scmp(link2[i]);
if(cha=='A'||cha=='R')/*符号 在符号表中保留*/
{
fputc('(',table);
fputs(link2[i],table);
fputc(',',table);
fputs(link2[i],table);
fputc(',',table);
fprintf(table,"%d",i);
fputc(')',table);
fputc('\n',table);
}
if(cha=='N'||cha=='C') /*数字和变量 均替换为id*/
{
fputc('(',table);
fputs(link2[i],table);
fputc(',',table);
fputs("id",table);
fputc(',',table);
fprintf(table,"%d",i);
fputc(')',table);
fputc('\n',table);
}
if(cha=='K')/*关键字不变*/
{
fputc('(',table);
fputs(link2[i],table);
fputc(',',table);
fputs(link2[i],table);
fputc(',',table);
fprintf(table,"%d",i);
fputc(')',table);
fputc('\n',table);
}
/*输出*/
}
getch();
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -