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

📄 test.cpp

📁 词法分析 输入文法后 可以对输入的文法进行词法分析 列出一个2为表 显示出他是表示副
💻 CPP
字号:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

void Init()
{
	char *ke[]={"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"};//关键字32个

	char *op[]={"(",")","[","]","->",".","!","++","--","&","~","*","/","%","+","-","<<",
				 ">>","<","<=",">",">=","==","!=","&&","||","sizeof","=","+=","-=","*=",
				 "/=",","};//运算符33个

	char *li[]={";","{","}","#","_","'"};//限界符6个

	FILE *fp;
	fp=fopen("key.txt","w");
	for(int i=0;i<32;i++)
		fprintf(fp,"%s\n",ke[i]);
	fclose(fp);

	fp=fopen("operation.txt","w");
	for(i=0;i<33;i++)
		fprintf(fp,"%s\n",op[i]);
	fclose(fp);

	fp=fopen("limitation.txt","w");
	for(i=0;i<6;i++)
		fprintf(fp,"%s\n",li[i]);
	fclose(fp);

	fp=fopen("output.txt","w");
	fprintf(fp,"%s\n","1------标识符\n2------常数\n3------关键字\n4------运算符\n5------限界符\n");
	fclose(fp);

	if((fp=fopen("programme.txt","r"))==NULL)
	{
		printf("没有programme.txt文件!\n此文件用于输入您想分析的代码.\n请新建一个programme.txt文件,并输入您想要分析的代码!\n");
		exit(0);
	}
	printf("1------标识符\n2------常数\n3------关键字\n4------运算符\n5------限界符\n");

}

void Find_Ke(char *buf)//不是关键字就是标识符
{
	char temp[30];
	char ch;
	int i=0;
	int flag=0;
	FILE *fp,*fp1;
	fp=fopen("key.txt","r");
	ch=fgetc(fp);
	while(ch!=EOF)
    { 
        while(ch!='\n'&&ch!=EOF)
        {
            temp[i]=ch;
            ch=fgetc(fp);
			i++;
        }
        temp[i]='\0';
		if(strcmp(temp,buf)==0)
			flag=1;
		if(ch==EOF)
			break;
		ch=fgetc(fp);
		i=0;
    }
	if(flag==0)
	{
		fp1=fopen("output.txt","a");
		fprintf(fp1,"<%d  '%s'>\n",1,buf);
		fclose(fp1);               //是标识符
	}
	else
	{
		fp1=fopen("output.txt","a");
		fprintf(fp1,"<%d  '%s'>\n",3,buf);
		fclose(fp1);               //是关键字
	}
}

int Find_Op(char *buf)
{
	char temp[30];
	char ch;
	int i=0;
	int flag=0;
	FILE *fp,*fp1;
	fp=fopen("operation.txt","r");
	ch=fgetc(fp);
	while(ch!=EOF)
    { 
        while(ch!='\n'&&ch!=EOF)
        {
            temp[i]=ch;
            ch=fgetc(fp);
			i++;
        }
        temp[i]='\0';
		if(strcmp(temp,buf)==0)
			flag=1;
		if(ch==EOF)
			break;
		ch=fgetc(fp);
		i=0;
    }
	if(flag==1)
    {  
		fp1=fopen("output.txt","a");
		fprintf(fp1,"<%d  '%s'>\n",4,buf);
		fclose(fp1);               //是运算符
		return 1;
    }
	else
		return 0;
}

void Find_Nu(char *buf)
{
	FILE *fp;
	fp=fopen("output.txt","a");
	fprintf(fp,"<%d  '%s'>\n",2,buf);
	fclose(fp);               //是常数
}

void Unknown(char *buf)
{
	FILE *fp;
	fp=fopen("output.txt","a");
	fprintf(fp,"<%s  %s>\n","无法识别",buf);
	fclose(fp);               //无法识别
}

void Scan()
{
	char ch;
	char temp[30];
	int i=0;
	int result;
	FILE *fp,*fp1;
	fp=fopen("programme.txt","r");
	ch=fgetc(fp);

    while(ch!=EOF)
    {
		if(((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')||ch=='_'))//字母开头
		{
			while((((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z'))||(ch=='_')||((ch>='0')&&(ch<='9')))&&ch!=EOF)
			{
				temp[i]=ch;
				ch=fgetc(fp);
				i++;
			}
			temp[i]='\0';
			Find_Ke(temp);
			i=0;
			if(ch==EOF)
				break;
		}
		else if((ch>='0'&&ch<='9'))
        {          //以数字开头
            while((ch>='0'&&ch<='9')&&ch!=EOF)
            {
				temp[i]=ch;
                ch=fgetc(fp);
				i++;
            }
			temp[i]='\0';
            Find_Nu(temp);
			i=0;
			if(ch==EOF)
				break;
        }
		else if((ch==' ')||(ch=='\t')||(ch=='\n'))
		{
			ch=fgetc(fp);       //消除空格符和水平制表符
		}
		else if(ch==';'||ch=='{'||ch=='}'||ch=='#'||ch=='_'||ch=='\'')//限界符
		{
			fp1=fopen("output.txt","a");
			fprintf(fp1,"<%d  '%c'>\n",5,ch);
			fclose(fp1);               //是限界符
			ch=fgetc(fp);
		}
		else
        {         //首字符为其它字符,即运算限界符或非法字符
            temp[0]=ch;
            ch=fgetc(fp);       //再读入下一个字符,判断是否为双字符运算、限界符
			if(ch==EOF)
			{	
				temp[1]='\0';
				Find_Op(temp);
				if(result==0)                     //若不是,则为非法字符
					Unknown(temp);
			}
            else
            {           
                temp[1]=ch;
				temp[2]='\0';
				result=Find_Op(temp);      /*先检索是否为双字符运算符*/
				if(result==0)//若不是,检索是否为单字符运算、限界符
				{
					i=0;
					temp[1]='\0';
					result=Find_Op(temp);
					if(result==0)
                    {                           //若还不是,则为非法字符
						Unknown(temp);
                    }
				}
				else
					ch=fgetc(fp);
            }
        }
	
     }
	fclose(fp);
}

int main()
{
	Init();
	Scan();
	printf("词法分析已经完成!请查看文件output.txt!\n");
	return 0;
}


⌨️ 快捷键说明

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