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

📄 词法分析器.cpp

📁 简单语法分析器,是编译原理的作业,放在这里交流一下
💻 CPP
字号:
#include<stdio.h>
#include<malloc.h>
#include<string.h>
char B[76][10]={"#include","#define","#if","#else","#elif",//5
"auto","break","case","char","const","continue","default","do",//+8=13
"double","else","enum","extern","float","for","goto","if","int",//+9=22
"long","register","return","short","signed","sizeof","static",//+7=29
"struct","switch","typedef","union","unsigned","void","volatile","while",//+8=37
"(",")","[","]","{","}",",",";","\"","->","'",".","_","\\",//+14=51
"++","--","+","-","*","/","%",//+7=58
"==","!=",">","<","<=",">=",//+6=64
"&","&&","|","||",">>","<<","!",//+7=71
"=","+=","-=","*=","/="};//+5=76
char buffer[30];
int m=0;
int NR=1;
struct fa
{
	int grade;
	int nr;
	char ch[30];
	char di[30];
	struct fa *next;
};
fa *head=NULL,*p=NULL,*q=NULL;

void end()
{
	int i;
	if(buffer[0]>='0'&&buffer[0]<='9'||buffer[0]=='-'&&buffer[1]!='-'&&buffer[1]!='>')
	{
		p=(fa *)malloc(sizeof(fa));
		p->nr=NR;
		p->next=NULL;
		p->grade=77;
		strcpy(p->di,buffer);
		if(p->di[strlen(buffer)-1]=='.')
		{
			p->di[strlen(buffer)]='0';
			p->di[strlen(buffer)+1]='\0';
		}
		if(head==NULL){head=p;q=p;}
		else{q->next=p;q=p;}
	}
	else 
	{
		p=(fa *)malloc(sizeof(fa));
		p->nr=NR;
		p->next=NULL;
		for(i=0;i<76;i++)
		{
			if(strcmp(buffer,B[i])==0)break;
		}
		if(i<76)p->grade=i;
		else if(buffer[0]>='a'&&buffer[0]<='z'||
			buffer[0]>='A'&&buffer[0]<='Z'||buffer[0]=='_')p->grade=i;
		else p->grade=78;
		strcpy(p->ch,buffer);
		if(head==NULL){head=p;q=p;}
		else{q->next=p;q=p;}
	}
	for(i=0;i<30;i++)buffer[i]='\0';
}
void fun()
{
	FILE *in=NULL,*out=NULL;
	char c;int i,j;
	for(i=0;i<30;i++)buffer[i]='\0';
	if(in=fopen("experiment.c","r"))
	{
		while(fscanf(in,"%c",&c)!=EOF)
		{
			if(c>='a'&&c<='z'||c>='A'&&c<='Z'||c=='_')
			{
				if(m==0)buffer[m++]=c;
				else if(buffer[m-1]>='a'&&buffer[m-1]<='z'||
						buffer[m-1]>='A'&&buffer[m-1]<='Z'||
						buffer[0]=='#'||buffer[m-1]=='_')
						buffer[m++]=c;
				else
				{
					if(m>0)
					{
						m=0;
						end();
					}
					buffer[m++]=c;
				}
				
			}
			else if(c>='0'&&c<='9')
			{
				if(m==0)buffer[m++]=c;
				else if(buffer[0]>='0'&&buffer[0]<='9'||
						buffer[0]>='a'&&buffer[0]<='z'||
						buffer[0]>='A'&&buffer[0]<='Z'||
						buffer[0]=='_'||
						buffer[0]=='-'&&buffer[1]!='-'&&buffer[1]!='>')
						buffer[m++]=c;
				else
				{
					if(m>0)
					{
						m=0;
						end();
					}
					buffer[m++]=c;
				}
				
			}
			else if(c==' '||c==10||c==13||c=='\n'||c=='\t')
			{
				if(m>0)
				{
					m=0;
					end();
				}
				if(c==10||c==13||c=='\n')
				{
					NR++;
				}
			}
			else
			{
				if(m==0)buffer[m++]=c;
				else if(buffer[m-1]>='a'&&buffer[m-1]<='z'||
						buffer[m-1]>='A'&&buffer[m-1]<='Z'||
						buffer[m-1]=='_'||
						buffer[m-1]>='0'&&buffer[m-1]<='9'&&c!='.')
				{
					if(m>0)
					{
						m=0;
						end();
					}
					buffer[m++]=c;
				}
				else
				{
					if(c=='+'&&buffer[0]=='+')
					{
						buffer[m++]=c;
						end();
						m=0;
					}
					else if(c=='='&&(buffer[0]=='+'||buffer[0]=='-'||
						buffer[0]=='*'||buffer[0]=='/'||buffer[0]=='>'||
						buffer[0]=='<'||buffer[0]=='='||buffer[0]=='!'))
					{
						buffer[m++]=c;
						end();
						m=0;
					}
					else if(c=='>'&&(buffer[0]=='-'||buffer[0]=='>'))
					{
						buffer[m++]=c;
						end();
						m=0;
					}
					else if(c=='<'&&buffer[0]=='<')
					{
						buffer[m++]=c;
						end();
						m=0;
					}
					else if(c=='&'&&buffer[0]=='&')
					{
						buffer[m++]=c;
						end();
						m=0;
					}
					else if(c=='|'&&buffer[0]=='|')
					{
						buffer[m++]=c;
						end();
						m=0;
					}
					else if(c=='.'&&(buffer[0]>='0'&&buffer[0]<='9'||buffer[0]=='-'&&buffer[1]>='0'&&buffer[1]<='9'))
					{
						j=1;
						for(i=0;i<m;i++)if(buffer[i]=='.')break;
						if(i<m)j=0;
						if(j==1)buffer[m++]=c;
						else
						{
							m=0;
							end();
							buffer[m++]=c;
						}
					}
					else
					{
						m=0;
						end();
						buffer[m++]=c;
					}
				}
			}
		}
		if(m>0)
		{
			end();
		}
		fclose(in);
		p=head;i=1;
		out=fopen("result.txt","w");
		while(p)
		{
			fprintf(out,"%d行:\t%d\t\t",p->nr,p->grade);
			if(p->grade<5)fprintf(out,"%s\t\t预定义字\n",p->ch);
			else if(p->grade<37)fprintf(out,"%s\t\t基本保留字\n",p->ch);
			else if(p->grade<43)fprintf(out,"%s\t\t符号(括号)\n",p->ch);
			else if(p->grade<51)fprintf(out,"%s\t\t符号\n",p->ch);
			else if(p->grade<58)fprintf(out,"%s\t\t符号(算术运算符)\n",p->ch);
			else if(p->grade<64)fprintf(out,"%s\t\t符号(判别大小符)\n",p->ch);
			else if(p->grade<71)fprintf(out,"%s\t\t符号(逻辑运算符)\n",p->ch);
			else if(p->grade<76)fprintf(out,"%s\t\t符号(赋值运算符)\n",p->ch);
			else if(p->grade==76)fprintf(out,"%s\t\t其他单词\n",p->ch);
			else if(p->grade==77)fprintf(out,"%s\t\t数字\n",p->di);
			else fprintf(out,"%s\t\tunknown_?\n",p->ch);
			p=p->next;
		}
	}
}
int main()
{
	//printf("%s",B[74]);
	fun();
	return 0;
}

⌨️ 快捷键说明

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