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

📄 main.cpp

📁 一个C语言词法分析器,一般本科生课程设计都用得上
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>


//一些定义--------------------------------------------------------------------
typedef struct
{
	char ID[2];
	char num[11];
}Code;


char* KeyWord[]={
				"bool","break","case","char","continue","do","double",//7
				"else","float","for","if","int","main","return","struct","switch",//8
				"typedef","union",//2
				"void","while"//2
				};//19
//-----------------------------------------------------------------------------

//所定义函数-------------------------------------------------------------------
bool isDigital(char ch)
{
	if(ch>='0' && ch<='9')
		return true;
	else
		return false;
}

bool isLetter(char ch)
{
	if( (ch>='a' && ch<='z') || (ch>='A' && ch<='Z') )
		return true;
	else
		return false;
}

bool isDivide(char ch)
{
	if(ch=='{' || ch=='}' || ch=='(' || ch==')' || ch=='\'' || ch=='\"' || ch==',' || ch==';' || ch==':')
		return true;
	else
		return false;
}


bool isOperator(char ch)
{
	if(ch=='+' || ch=='-' || ch=='*' || ch=='/' || ch=='=' /*|| ch=='>' || ch=='<'*/)
		return true;
	else
		return false;
}

bool isKeyword(char* str)
{
	int i=0;
	for(i=0;i<19;i++)
	{
		if(strcmp(str,KeyWord[i])==0)
		{
			return true;
		}
	}
	return false;
}

//-----------------------------------------------------------------------------





//全局变量---------------------------------------------------------------------

char file[2000];
Code myCode[100];
int count=0;

bool strFlag=false;

//------------------------------------------------------------------------------

int main()
{
	int i=0;
	FILE* fp;
	fp=fopen("s.txt","r");

	while( !feof(fp) )
	{
		file[i++]=fgetc(fp);	
	}

	file[i-1]='\0';

	for(i=0;file[i]!='\0';i++)
	{
		if(file[i]==' ' || file[i]=='\t' || file[i]=='\r' || file[i]=='\n')
			file[i]='#';
	}
	printf("%s\n",file);
	printf("-----------------------------------------\n");
//-----------------------------------------------------------------------------
	i=0;
	while(file[i]!='\0')
	{
		if(file[i]=='#')
		{
			i++;
			continue;
		}//end if file[i]=='#'

		if( isLetter(file[i]) )
		{
			char tmp[10];
			int begin=i;
//			int end;
			int pos=0;
			///////////////////////////////////////////////////
			while( isDigital(file[i]) || isLetter(file[i]) )
			{
				tmp[pos]=file[i];
				i++;
				pos++;
			}
			tmp[pos]='\0';
			pos=0;

//			printf("%s",tmp);

//			end=i;

			if( isKeyword(tmp) )
			{
				int k;
				for(k=0;k<19;k++)
				{
					if(strcmp(tmp,KeyWord[k])==0)
					{
						strcpy(myCode[count].ID,"00");
						strcpy(myCode[count].num,tmp);

						printf("%4s%10s\n",myCode[count].ID,myCode[count].num);
						count++;
					}
					
				}
//				printf("%d",myCode[count-1].Num);
			}

			else
			{
				int len=strlen(tmp);
				int sum=0;
				int t;
				for(t=0;t<len;t++)
				{
					sum+=tmp[t];
				}
				strcpy(myCode[count].num,tmp);
				strcpy(myCode[count].ID,"03");

				printf("%4s%10s\n",myCode[count].ID,myCode[count].num);

				count++;
			}//肯定为标识符

			
			/////////////////////////////////////////////////////
		}//end if  判断完保留字或标识符

		if( isDigital(file[i]) )
		{
			char tmp[10];
			int pos=0;
			while( isDigital(file[i]) )
			{
				tmp[pos]=file[i];
				pos++;
				i++;
			}

			if(file[i]=='.')
			{
				tmp[pos]='.';
				i++;
				pos++;
				while( isDigital(file[i]) )
				{
					tmp[pos]=file[i];
					pos++;
					i++;
				}

			}
			tmp[pos]='\0';
			pos=0;
			int sum=0;
			int len=strlen(tmp);
			int j;
			for(j=0;j<len;j++)
			{
				sum+=(tmp[j]-32)*int(pow(10,len-j));
			}

//			printf("%s",tmp);

			strcpy(myCode[count].num,tmp);
			strcpy(myCode[count].ID,"40");

			printf("%4s%10s\n",myCode[count].ID,myCode[count].num);

			count++;
		}//判断整数或者实数

		if(  isDivide(file[i]) )
		{
			char tmp[10];
			tmp[0]=file[i];
			tmp[1]='\0';
		//	myCode[count].Num=file[i];
			strcpy(myCode[count].num,tmp);
			strcpy(myCode[count].ID,"01");
			
			printf("%s",tmp);

			i++;
			count++;
		}

		if( isOperator(file[i]) )
		{
			char tmp[10];
	//		myCode[count].Num=file[i];
			tmp[0]=file[i];
			tmp[1]='\0';
			strcpy(myCode[count].num,tmp);
			strcpy(myCode[count].ID,"02");

			printf("%4s%10s\n",myCode[count].ID,myCode[count].num);
			
//			printf("%s",tmp);

			i++;
			count++;
		}

		if(file[i]=='"' && strFlag==false)//进入字符串常量
		{
			char tmp1[10];
			tmp1[0]='"';
			tmp1[1]='\0';
	//		myCode[count].Num=file[i];
			strcpy(myCode[count].num,tmp1);
			strcpy(myCode[count].ID,"01");

			printf("%4s%10s\n",myCode[count].ID,myCode[count].num);

//			printf("%s",tmp1);

			i++;
			count++;
			
			char tmp[10];//记录常量字符串

			int pos=0;

			while(!isDivide(file[i]) )
			{
				tmp[pos]=file[i];
				pos++;
				i++;
			}

			tmp[pos]='\0';

//			printf("%s",tmp);

			int len=strlen(tmp);
			int sum=0;
			int y;
			for(y=0;y<len;y++)
			{
				sum+=tmp[y];
			}
	//		myCode[count].Num=sum;
			strcpy(myCode[count].num,tmp);
			strcpy(myCode[count].ID,"42");

			printf("%4s%10s\n",myCode[count].ID,myCode[count].num);

			count++;
			
			strFlag=true;
		}
		
		if(file[i]=='"' && strFlag==true)//出字符串常量
		{
			char tmp[10];
		//	myCode[count].Num=file[i];
			tmp[0]='"';
			tmp[1]='\0';

			strcpy(myCode[count].num,tmp);
			strcpy(myCode[count].ID,"01");

	//		printf("%s",tmp);


			printf("%4s%10s\n",myCode[count].ID,myCode[count].num);

			i++;
			count++;

			strFlag=false;
		}

		if(file[i]=='>' || file[i]=='<')
		{
			char tmp[10];
			int iTmp=i;
			i++;
			if(file[i]=='=')
			{
				tmp[0]=file[iTmp];
				tmp[1]=file[i];
				tmp[2]='\0';
				strcpy(myCode[count].num,tmp);
				strcpy(myCode[count].ID,"01");

				printf("%4s%10s\n",myCode[count].ID,myCode[count].num);

				i++;
				count++;
			}
			else
			{
				i=iTmp;
				tmp[0]=file[i];
				tmp[1]='\0';
				strcpy(myCode[count].num,tmp);
				strcpy(myCode[count].ID,"01");

				printf("%-4s%-10s\n",myCode[count].ID,myCode[count].num);

				i++;
				count++;
			}
		}



	}//end while

	printf("\n----------------------------------------------------\n");

//	int h;
//	for(h=0;h<count;h++)
//	{
//		printf("%s%s\n",myCode[h].ID,myCode[h].num);
		
//	}

//-----------------------------------------------------------------------------
	
	return 0;
}

⌨️ 快捷键说明

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