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

📄 analysis.cpp

📁 一个简单的词法分析程序
💻 CPP
字号:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define MaxLength 100
const int WORDNUM = 32,OPERATORNUM = 44;
const int SPECIALNUM = 3,TYPENUM = 6;
char *Words[]={"char", "double", "enum", "float", "int", "long", "short",
"signed", "struct", "union", "unsigned", "void","break",
"case", "continue", "default", "do", "else", "for", "goto",
"if", "return", "switch", "while","auto", "extern", "register",
"static","const", "sizeof", "typedef", "volatile"
};
char *Operators[]={
	"+","-","*","/","%","++","#","\"",
		"--",">","<","==",">=","<=","'",
		"!=","&&","||","!","&","|","~",
		"^","<<",">>","=","+=","-=","*=",
		"/=","%=","&=","|=","^=",">>=",";",
		"<<=",",","*","&","(",")","[","]"
};
char *Type[] = {"关键字","运算符","数  字","标示符","其  它","特殊字",};
char *Scope[] = {"1--32","33--76","77","78","79","80--82"};
FILE *outPutFile;
int IsMatchOperators(char *str,int length)
{
	int i,temp;
	for(i=0;i<OPERATORNUM;i++)
	{
		temp = strlen(Operators[i]);
		if(temp == length)
		{
			if(!strcmp(Operators[i],str)) // 匹配
				return (i+33);
		}
	}
	return 0;
}
int IsMatchWords(char *word,int length)
{
	int i,temp;
	for(i=0;i<WORDNUM;i++)
	{
		temp = strlen(Words[i]);
		if(temp == length)
		{
			if(!strcmp(Words[i],word))
				return (i+1);
		}
	}
	return 0;
}
int IsNumber(char C)
{
	return (C>='0' && C<='9');
}
int IsLetter(char C)
{
	return ((C>='A' && C<='Z') || (C>='a' && C<='z'));
}
void Analysis(char *str)
{
	int i,index,num = 0,length = strlen(str);
	char *curStr = (char *)malloc(MaxLength*sizeof(char));
	if(str[(int)(strlen(str)-1)]=='\n')
		length -= 1;
	for(i=0;i<length;i++)
	{
		while(i<length && (str[i] == ' ' || str[i] == '\t')) // 过滤空格
			i++;
		if(i>=length || str[i] == '\n')
			break;		
		num = 0;
		if(IsNumber(str[i])) // 数字
		{
			while(i<length && IsNumber(str[i])) // 数字
				curStr[num++] = str[i++];
			curStr[num]='\0';
			printf("    ");
			fprintf(outPutFile,"    ");
			printf("(%s,%s)\n",Scope[2],curStr);
			fprintf(outPutFile,"(%s,%s)\n",Scope[2],curStr);
		}
		else if(IsLetter(str[i])) // 字母
		{
			while(i<length && (IsLetter(str[i]) || IsNumber(str[i]))) // 字母或数字
				curStr[num++] = str[i++];
			curStr[num]='\0';
			//index = IsMatchSpecialWords(curStr,num);
			index = IsMatchWords(curStr,num);
			printf("    ");
			fprintf(outPutFile,"    ");
			if(index)
			{
				printf("(%d,%s)\n",index,curStr);
				fprintf(outPutFile,"(%d,%s)\n",index,curStr);
			}
			else
			{
				printf("(%s,%s)\n",Scope[3],curStr);
				fprintf(outPutFile,"(%s,%s)\n",Scope[3],curStr);
			}
		}
		else // 其他
		{
			if(str[i] == ';')
			{
				curStr[num++] = str[i++];
			}
			else
			{
				while(i<length && str[i] != ' ' && str[i] != ';' && str[i] != '\0')
				{
					if(!IsLetter(str[i]) && !IsNumber(str[i])) // 字母或数字
					{
						curStr[num++] = str[i++];
						curStr[num] = '\0';
						index = IsMatchOperators(curStr,num);
						if(index)
						{
							curStr[num] = str[i];
							curStr[num+1] = '\0';
							if(IsMatchOperators(curStr,num+1))
								continue;
							break;
						}
					}
					else
						break;
				}
			}
			curStr[num]='\0';
			index = IsMatchOperators(curStr,num);
			printf("    ");
			fprintf(outPutFile,"    ");
			if(index)
			{
				printf("(%d,%s)\n",index,curStr);
				fprintf(outPutFile,"(%d,%s)\n",index,curStr);
			}
			else
			{
				printf("(%s,%s)\n",Scope[4],curStr);
				fprintf(outPutFile,"(%s,%s)\n",Scope[4],curStr);
			}
		}
		i--;
	}
}
void main()
{
	int j,length;
	char *path = (char *)malloc(MaxLength*sizeof(char));
	char *outPutPath = (char *)malloc(MaxLength*sizeof(char));
	char *str = (char *)malloc(MaxLength*sizeof(char));
	char *str2 = (char *)malloc(MaxLength*sizeof(char));
	FILE *file;	
	while(true)
	{
		printf("Please input the path of your file: ");
		scanf("%s",path);
		if(file = fopen(path,"r"))
		{
			printf("Please input the output path of file: ");
			scanf("%s",outPutPath);			
			if(outPutFile = fopen(outPutPath,"w"))
			{
				printf("*****************************\n");
				fprintf(outPutFile,"*****************************\n");
				for(int i=0;i<TYPENUM;i++)
				{
					printf("%s: %s\n",Type[i],Scope[i]);
					fprintf(outPutFile,"%s: %s\n",Type[i],Scope[i]);
				}
				printf("*****************************\n");
				fprintf(outPutFile,"*****************************\n");
				
				//while(fscanf(file,"%s",str) > 0)
				while(fgets(str,MaxLength,file))
                {
					length = (int)strlen(str);
					for(i=0,j=0;i<length;i++)
					{
						if(str[i] != ' ' && str[i] != '\t')
							break;
					}
					while(i<length)
						str2[j++] = str[i++];
					str2[j] = '\0';
                    printf("%s",str2);
					fprintf(outPutFile,"%s",str2);
					if(str[length-1]!='\n')
					{
						printf("\n");
						fprintf(outPutFile,"\n");
					}
					Analysis(str);
				}
				fclose(file);
				return;
			}
		}
		else
		{
			printf("\nInvalid Path!!\n");
		}
	}
}

⌨️ 快捷键说明

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