⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cifa.cpp

📁 词法分析器
💻 CPP
字号:
#include"stdio.h" 
#include"string.h" 

int compare (char a); 
void explain (FILE *fp1, FILE *fp2); 
void doshu (char a,char b[],char *pb,int d,FILE *fp1,FILE *fp2);
void dozimu (char a,char b[],char *pb,int d,FILE *fp1,FILE *fp2);
void dofuhao1 (char a,char b[],char *pb,int d,FILE *fp1,FILE *fp2);
void dofuhao2 (char a,char b[],char *pb,int d,FILE *fp1,FILE *fp2);

void doshu (char a,char b[],char *pb,int d,FILE *fp1,FILE *fp2){
	int e=3;
	while (d==3 || d==1 &&!feof(fp1)){
		if (d!=3)
			e=d;
		*pb=a;
		a=fgetc(fp1);
		d=compare (a);
		pb++;
	}
	if (e==3){
		fputc('3',fp2);
		fputc(':',fp2);
		fprintf(fp2,"%s",b);
		fputc('\n',fp2);
	}
	else{
		fprintf(fp2,"error");
		fputc(':',fp2);
		fprintf(fp2,"%s",b);
		fputc('\n',fp2);
	}
	if (d==4 && !feof(fp1))
		dofuhao1(a,b,pb,d,fp1,fp2);
	if (d==5 && !feof(fp1))
		dofuhao2(a,b,pb,d,fp1,fp2);
}		

void dozimu (char a,char b[],char *pb,int d,FILE *fp1,FILE *fp2){
	char *a4[]={"main","int","char","if","else"};
	int i;
	int c=2;
	while (d==3 || d==1 && !feof(fp1)){
		*pb=a;
		a=fgetc(fp1);
		d=compare (a);
		pb++;
	}
	for (i=0;i<5;i++){
		if (strcmp(b,a4[i])==0){
			c=1;
			break;
		}
	}
	fprintf(fp2,"%d",c);
	fputc(':',fp2);
	fprintf(fp2,"%s",b);
	fputc('\n',fp2);

	if (d==4 && !feof(fp1))
		dofuhao1(a,b,pb,d,fp1,fp2);
	if (d==5 && !feof(fp1))
		dofuhao2(a,b,pb,d,fp1,fp2);
}

void dofuhao1 (char a,char b[],char *pb,int d,FILE *fp1,FILE *fp2){
		*pb=NULL;
		fputc('4',fp2);
		fputc(':',fp2);
		fputc(a,fp2);
		fputc('\n',fp2);
}

void dofuhao2 (char a,char b[],char *pb,int d,FILE *fp1,FILE *fp2){
		*pb=NULL;
		fputc('5',fp2);
		fputc(':',fp2);
		fputc(a,fp2);
		fputc('\n',fp2);
}

void main() 
{ 
FILE *fp1, *fp2; 
char loadname[100]; 
char savename[100]; 
printf ("您要解析的文件名?(包含扩展名)\n"); 
scanf ("%s", loadname); 
fp1 = fopen (loadname, "r"); 
if (fp1 == NULL) 
{ 
printf ("打开文件失败!\n"); 
goto ending; 
} 
printf ("解析的结果保存在...?(包含扩展名)\n"); 
scanf("%s", savename); 
fp2 = fopen (savename, "w"); 
if (fp2 == NULL) 
{ 
printf ("打开文件失败!\n"); 
goto ending; 
} 
explain (fp1, fp2); 
fclose (fp1); 
fclose (fp2); 
printf ("解析成功!\n"); 
ending: 
if (fp1==NULL || fp2==NULL) 
{ 
printf ("解析失败!\n"); 
} 
} 

int compare (char a) 
{
	int i;
	int j;
	char a1[] ="1234567890.";
	char a2[] ="()[]{}<>,; \n";
	char a3[] ="+-*/=";
	char *a4[] ={"main","int","char","if","while"};
	for (i=0;a1[i] != NULL && a2[i] != NULL && a3[i] != NULL;i++){
		if (a != a1[i]&& a!=a2[i] && a!=a3[i]){
			j=1;
			break;
		}
	}
	for (i=0;a1[i] != NULL;i++){
		if (a == a1[i]){
			j=3;
			break;
		}
	}
	for (i=0;a2[i] != NULL;i++){
		if (a == a2[i]){
			j=4;
			break;
		}
	}
	for (i=0;a3[i] != NULL;i++){
		if (a == a3[i]){
			j=5;
			break;
		}
	}
	return j;
}

void explain (FILE *fp1, FILE *fp2) 
{ 
char a; 
char b[100]; 
char *pb = NULL; 
int d; 
char *a4[] ={"main","int","char","if","while"};
if (fp1 != NULL)
{ 
	while (!feof(fp1))
	{ 
		memset (b, NULL, 100); 
		pb = b;
		a = fgetc (fp1); 
		d = compare (a); 
		
		if (d==3 && !feof(fp1))
			doshu(a,b,pb,d,fp1,fp2);
		if (d==1 && !feof(fp1))
			dozimu(a,b,pb,d,fp1,fp2);
		if (d==4 && !feof(fp1))
			dofuhao1(a,b,pb,d,fp1,fp2);
		if (d==5 && !feof(fp1))
			dofuhao2(a,b,pb,d,fp1,fp2);
	}
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -