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

📄 1.c

📁 词法分析器。编译原理实验。输入源程序
💻 C
字号:
#include<stdio.h>
#include<string.h>

char Keyword[32][10]={"auto","break","case","char","const","continue","default","do","double","else","enum",
                      "extern","float","for","goto","if","int","long","register","return","short","signed",
					  "sizeof","static","struct","switch","typedef","union","unsigned","void","volatile","while"};
char Operator[30][3]={"+","-","*","/","%","!","++","--","<",">","=","<=",">=","==","!=","&&","||",
                      "+=","-=","*=","/=","%=","[","]","->",".","&","|","<<",">>"};
char Seperator[8][3]={";",",","{","}","(",")","'","\""};



char after[18]={'+','-','*','/','%','!','<','>','=','&','|',';',',','(',')','\"','{','}'};//可能跟在数字或字母后表表一个数或标识符结束
char first[11]={'+','-','*','/','%','!','<','>','=','&','|'};//需要超前读取来判断是两个还是一个字符组成的算符或界符
char temid[50][20];
char teminum[50][20];
char temfnum[20][20];

int line=1,errnum=1;
int isletter(char c);//判断是不是字母
int isnum(char c);//判断是不是数字
int inafter(char c);//判断数字或标识符后的紧随的一些分割字符
int infirst(char c);//判断是否是需要超前读取的算符或界符
int inkeyword(char str[]);//判断是否是关键字
int inoperator(char str[]);//判断是否在操作符中
int inseperator(char str[]);//判断是否在分隔符中
int isappear(char str[],char tem[][20],int num);//判断标识符或数字是否出现过
int numanalyze(char str[]);//数字分析
main()
{
	int i,j,k;
	int mark,idnum=0,intnum=0,floatnum=0;
	char c;
	char str[30];
	char temst[30];
	FILE *fc;//c语言原程序文件
	FILE *f;//分析结果存放文件
	FILE *fk,*fi,*fin,*ffn,*fo,*fs,*fot;
	//fk:keyword,fi:Indentifier,fin:Intnumber,ffn:Floatnumber,fo:Operator,fs:Seperator,fot:Others

	while((fc=fopen("test1.txt","r"))==NULL);
	while((f=fopen("Analyze_Result.txt","w+"))==NULL);
	while((fk=fopen("Keyword.txt","w+"))==NULL);
    while((fi=fopen("Indentifier.txt","w+"))==NULL);
    while((fin=fopen("Intnumber.txt","w+"))==NULL);
    while((ffn=fopen("Floatnumber.txt","w+"))==NULL);
    while((fo=fopen("Operator.txt","w+"))==NULL);
    while((fs=fopen("Seperator.txt","w+"))==NULL);
    while((fot=fopen("Others.txt","w+"))==NULL);

	fprintf(fk,"  %s\n\n","Keyword_List");//输出关键字文件
	for(i=0;i<32;i++)
		fprintf(fk,"%8s     %d\n",Keyword[i],i+1);
	fclose(fk);

    fprintf(fo,"  %s\n\n","Operator_List");//输出操作符文件
	for(i=0;i<30;i++)
		fprintf(fo,"%5s     %d\n",Operator[i],i+1);
	fclose(fo);

    fprintf(fs,"  %s\n\n","Seperator_List");//输出分割符文件
	for(i=0;i<8;i++)
		fprintf(fs,"%5s     %d\n",Seperator[i],i+1);
	fclose(fs);
	c=fgetc(fc);
	while(c!=EOF)
	{
		if(isletter(c))
		{
		    i=0;
			while(isletter(c)||isnum(c)||c=='_')
			{
				str[i]=c;
				i++;
                c=fgetc(fc);
			}
			fseek(fc,-sizeof(char),1);
			str[i]='\0';
			k=inkeyword(str);
			if(k!=-1)
				fprintf(f,"%10s  (%s,%d)\n",str,"Keyword",k+1);
			else
			{
				if(idnum==0)
				{
			    	fprintf(fi,"  %s\n\n","Indentifier_List");
			    	fprintf(f,"%10s  (%s,%d)\n",str,"Indentifier",idnum+1);
			    	fprintf(fi,"%10s     %d\n",str,idnum+1);
					strcpy(temid[idnum],str);
					idnum++;
				}
				else
				{
    				j=isappear(str,temid,idnum+1);
	    			if(j==-1)
					{
	    				fprintf(f,"%10s  (%s,%d)\n",str,"Indentifier",idnum+1);
	    	     		fprintf(fi,"%10s     %d\n",str,idnum+1);
                        strcpy(temid[idnum],str);
	     			    idnum++;
					}
					else
						fprintf(f,"%10s  (%s,%d)\n",str,"Indentifier",j+1);
				}
			}
		}
		else if(isnum(c))
		{
			i=0;
			while(isnum(c)||isletter(c)||c=='.'||c=='+'||c=='-')
			{
				if(isletter(c)&&c!='E'&&c!='e')
				{
					printf("error %d:(line %d)Indentifier can't begin with numbers.\n",errnum,line);
					errnum++;
					i=0;
					break;
				}
				str[i]=c;
				i++;
				c=fgetc(fc);
			}
			if(i==0)
			{
				while(!inafter(c)&&c!=' ')
					c=fgetc(fc);
				fseek(fc,-sizeof(char),1);
			}
			else
			{
				fseek(fc,-sizeof(char),1);
				str[i]='\0';
                mark=numanalyze(str);
				if(mark==0)//整型数
				{
					if(intnum==0)
					{
						fprintf(fin,"  %s\n\n","Intnumber_List");
                        fprintf(f,"%10s  (%s,%d)\n",str,"Intnumber",intnum+1);
				        fprintf(fin,"%10s     %d\n",str,intnum+1);
						strcpy(teminum[intnum],str);
						intnum++;
					}
					else
					{
                        j=isappear(str,teminum,intnum+1);
						if(j==-1)
						{
							fprintf(f,"%10s  (%s,%d)\n",str,"Intnumber",intnum+1);
				            fprintf(fin,"%10s     %d\n",str,intnum+1);
				    		strcpy(teminum[intnum],str);
				    		intnum++;
						}
						else
                            fprintf(f,"%10s  (%s,%d)\n",str,"Intnumber",j+1);
					}
				}
				else if(mark==1)//浮点数
				{
                    if(floatnum==0)
					{
						fprintf(ffn,"  %s\n\n","Floatnumber_List");
                        fprintf(f,"%10s  (%s,%d)\n",str,"Floatnumber",floatnum+1);
				        fprintf(ffn,"%10s     %d\n",str,floatnum+1);
						strcpy(temfnum[floatnum],str);
				    	floatnum++;
					}
					else
					{
						j=isappear(str,temfnum,intnum+1);
						if(j==-1)
						{
							fprintf(f,"%10s  (%s,%d)\n",str,"Floatnumber",floatnum+1);
				            fprintf(ffn,"%10s     %d\n",str,floatnum+1);
							strcpy(temfnum[floatnum],str);
				          	floatnum++;
						}
						else
							fprintf(f,"%10s  (%s,%d)\n",str,"Floatnumber",j+1);
					}
				}
				
			}
		}
		else if(c==' '||c=='\n')
		{
			while(c==' '||c=='\n')
			{  
				if(c=='\n')
					line++;
				c=fgetc(fc);
			}
			if(c==EOF)
				break;
			fseek(fc,-sizeof(char),1);
		}
		else
		{
			if(infirst(c))
			{
				str[0]=c;
				c=fgetc(fc);
				str[1]=c;
				str[2]='\0';
				if((i=inoperator(str))!=-1)
					fprintf(f,"%10s  (%s,%d)\n",str,"Operator",i+1);
				else
				{
					fseek(fc,-sizeof(char),1);
					str[1]='\0';
					j=inoperator(str);
					if(j!=-1)
						fprintf(f,"%10s  (%s,%d)\n",str,"Operator",j+1);
					else
					{
						k=inseperator(str);
						if(k!=-1)
							fprintf(f,"%10s  (%s,%d)\n",str,"Seperator",k+1);
						else
							fprintf(fot,"line %d:(other operater or seperater)%s\n",line,str);
					}
				}
			}
			else
			{
				if(c=='\'')
				{
					i=0;
					c=fgetc(fc);
					while(c!='\'')
					{
						temst[i]=c;
						c=fgetc(fc);
						i++;
					}
					temst[i]='\0';
					fprintf(fot,"line %d:(character) %s\n",line,temst);
				}
				else if(c=='\"')
				{
					i=0;
					c=fgetc(fc);
					while(c!='\"')
					{
						temst[i]=c;
						c=fgetc(fc);
						i++;
					}
					temst[i]='\0';
					fprintf(fot,"line %d:(string) %s\n",line,temst);
				}
				else
				{
			    	str[0]=c;
			    	str[1]='\0';
			    	j=inoperator(str);
			    	if(j!=-1)
			    		fprintf(f,"%10s  (%s,%d)\n",str,"Operator",j+1);
		    		else
					{
			    		k=inseperator(str);
                        if(k!=-1)
				    		fprintf(f,"%10s  (%s,%d)\n",str,"Seperator",k+1);
				    	else
				    		fprintf(fot,"line %d:(other operater or seperater)%s\n",line,str);
					}
				}
			}
		}
		c=fgetc(fc);
	}
	fclose(f);
	fclose(fc);
	fclose(fi);
	fclose(fin);
	fclose(ffn);
	fclose(fot);

}


int isletter(char c)
{
	if(c>='a'&&c<='z'||c>='A'&&c<='Z')
		return 1;
	else
		return 0;
}

int isnum(char c)
{
	if(c>='0'&&c<='9')
		return 1;
	else
		return 0;
}

int inafter(char c)
{
	int i;
	for(i=0;i<18;i++)
	{
		if(c==after[i])
			return 1;
	}
	return 0;
}

int infirst(char c)
{
	int i;
	for(i=0;i<11;i++)
	{
		if(c==first[i])
			return 1;
	}
	return 0;
}


int inkeyword(char str[])
{
	int i;
	for(i=0;i<32;i++)
	{
		if((strcmp(str,Keyword[i]))==0)
			return i;
	}
	return -1;
}

int inoperator(char str[])
{
	int i;
	for(i=0;i<30;i++)
	{
		if((strcmp(str,Operator[i]))==0)
			return i;
	}
	return -1;
}

int inseperator(char str[])
{
	int i;
	for(i=0;i<8;i++)
	{
		if((strcmp(str,Seperator[i]))==0)
			return i;
	}
	return -1;
}

int isappear(char str[],char tem[][20],int num)
{
	int i;
	for(i=0;i<num;i++)
	{
		if(strcmp(str,tem[i])==0)
			return i;
	}
	return -1;
}
	
int numanalyze(char str[])
{
	int i,j;
	for(i=0;str[i]!='\0';i++)
	{
		if(isnum(str[i])==0)
			break;
	}
	if(str[i]=='\0')
		return 0;
	else
	{
		if(str[i]=='.')
		{
			for(;str[i]!='\0';i++)
			{
				if(str[i]=='+'||str[i]=='-')
				{
					printf("error %d:(line %d)Illegal floatnumber.\n",errnum,line);
			    	errnum++;
			     	return -1;
				}
				if(str[i]=='E'||str[i]=='e')
					break;
			}
			if(str[i]=='\0')
				return 1;
			else
			{
                if(str[i+1]=='.')
				{
					printf("error %d:(line %d)Illegal floatnumber.\n",errnum,line);
			       	errnum++;
			       	return -1;
				}
				else if(str[i+1]=='\0')
					return 1;
				for(j=i+2;str[j]!='\0';j++)
				{
					if(isnum(str[j])==0)
					{
						printf("error %d:(line %d)Illegal floatnumber.\n",errnum,line);
						errnum++;
						return -1;
					}
				}
				return 1;
			}
		}
	}
}
					

					

⌨️ 快捷键说明

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