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

📄 compile.c

📁 编译原理的词法语法分析程序
💻 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 + -