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

📄 语法分析.cpp

📁 简单语法分析器,是编译原理的作业,放在这里交流一下
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include<iostream>
#include<malloc.h>
using namespace std;
void start();
void dy();
void dan();
void yu();
void can();
void tiao();
void biao();
void jia();
struct shu
{
	int hang;
	int zhi;
	struct shu *next;
};
struct shu *head=NULL,*p=NULL,*q=NULL;
FILE *in=NULL,*out=NULL;
int count=1;
int sti(char s[])
{
	int l=0;
	unsigned i=0;
	for(;i<strlen(s);i++)
	{
		l=10*l+(int)(s[i]-48);
	}
	return l;
}
int main()
{
	int h,z,m=0,i=0;char c,b[5];
	if(in=fopen("result.txt","r"))
	{
		for(int j=0;j<5;j++)
			b[j]='\0';
		while(fscanf(in,"%c",&c)!=EOF)
		{
			if(i==0)
			{
				if(c>='0'&&c<='9')
				{
					b[m++]=c;
				}
				else if(m>0)
				{
					h=sti(b);
					i++;
					m=0;
					for(int j=0;j<5;j++)
						b[j]='\0';
				}
			}
			else if(i==1)
			{
				if(c>='0'&&c<='9')
				{
					b[m++]=c;
				}
				else if(m>0)
				{
					z=sti(b);
					i++;
					m=0;
					for(int j=0;j<5;j++)
						b[j]='\0';
				}
			}
			else if(c=='\n'||c==10||c==13)
			{
				p=(struct shu *)malloc(sizeof(struct shu));
				p->next=NULL;
				p->hang=h;
				p->zhi=z;
				if(head==NULL)
				{
					head=p;q=p;
				}
				else
				{
					q->next=p;q=p;
				}
				i=0;
			}
		}
		fclose(in);
		if(out=fopen("语法分析.txt","w"))
		{
			p=head;
			start();
			if(count==1)
			{
				fprintf(out,"编译完毕 ! 没有发现错误语法 !\n");
			}
			else
			{
				fprintf(out,"编译完毕 ! 发现错误 %d 个 !\n",count-1);
			}
			q=head;
			while(q!=NULL)
			{
				printf("%d   %d\n",q->hang,q->zhi);
				q=q->next;
			}
			fclose(out);
		}
	}
	return 0;
}
void tiao()
{
	if(p!=NULL&&p->zhi==77)
	{
		p=p->next;
		if(p!=NULL&&(p->zhi==64||p->zhi==65||p->zhi==66||p->zhi==67))
		{
			p=p->next;
			tiao();
			if(p!=NULL&&p->zhi==38)
			{
				//正确
			}
			else
			{
				fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
			}
		}
		else if(p!=NULL&&(p->zhi==58||p->zhi==59||p->zhi==60||p->zhi==61||p->zhi==62||p->zhi==63))
		{
			p=p->next;
			if(p!=NULL&&p->zhi==76)
			{
				p=p->next;
				if(p!=NULL&&(p->zhi==64||p->zhi==65||p->zhi==66||p->zhi==67))
				{
					p=p->next;
					tiao();
					if(p!=NULL&&p->zhi==38)
					{
						//正确
					}
					else
					{
						fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
					}
				}
				else if(p!=NULL&&p->zhi==38)
				{
					//正确
				}
				else
				{
					fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
				}
			}
			else if(p!=NULL&&p->zhi==37)
			{
				p=p->next;
				tiao();
				if(p!=NULL&&p->zhi==38)
				{
					//正确
				}
				else
				{
					fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
				}
			}
			else
			{
				fprintf(out,"Error %d : 第 %d 行缺少表达式值。\n",count++,p->hang);
			}
		}
		else if(p!=NULL&&p->zhi==38)
		{
			//正确
		}
		else
		{
			fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
		}
	}
	else if(p!=NULL&&p->zhi==76)
	{
		p=p->next;
		if(p!=NULL&&(p->zhi==64||p->zhi==65||p->zhi==66||p->zhi==67))
		{
			p=p->next;
			tiao();
			if(p!=NULL&&p->zhi==38)
			{
				//正确
			}
			else
			{
				fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
			}
		}
		else if(p!=NULL&&(p->zhi==58||p->zhi==59||p->zhi==60||p->zhi==61||p->zhi==62||p->zhi==63))
		{
			p=p->next;
			if(p!=NULL&&(p->zhi==76||p->zhi==77))
			{
				p=p->next;
				if(p!=NULL&&(p->zhi==64||p->zhi==65||p->zhi==66||p->zhi==67))
				{
					p=p->next;
					tiao();
					if(p!=NULL&&p->zhi==38)
					{
						//正确
					}
					else
					{
						fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
					}
				}
				else if(p!=NULL&&p->zhi==38)
				{
					//正确
				}
				else
				{
					fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
				}
			}
			else if(p!=NULL&&p->zhi==37)
			{
				p=p->next;
				tiao();
				if(p!=NULL&&p->zhi==38)
				{
					//正确
				}
				else
				{
					fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
				}
			}
			else
			{
				fprintf(out,"Error %d : 第 %d 行缺少表达式值。\n",count++,p->hang);
			}
		}
		else if(p!=NULL&&p->zhi==38)
		{
			//正确
		}
		else
		{
			fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
		}
	}
	else if(p!=NULL&&p->zhi==37)
	{
		p=p->next;
		tiao();
		if(p!=NULL&&p->zhi==38)
		{
			//正确
		}
		else
		{
			fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
		}
	}
	else
	{
		fprintf(out,"Error %d : 第 %d 行缺少合法表达式。\n",count++,p->hang);
	}
}
void yu()
{
	if(p!=NULL&&(p->zhi==20||p->zhi==36))//if||while
	{
		p=p->next;
		if(p!=NULL&&p->zhi==37)
		{
			p=p->next;
			tiao();
			if(p!=NULL&&p->zhi==38)
			{
				p=p->next;
				if(p->zhi==41)
				{
					p=p->next;
					yu();
					if(p->zhi==42)
					{
						//正确
						p=p->next;
					}
					else
					{
						fprintf(out,"Error %d : 第 %d 行缺少 } 符号。\n",count++,p->hang);
					}
				}
				else//不能判断单语句,语句部分要用{}括起来;
				{
					fprintf(out,"Error %d : 第 %d 行缺少 { 符号。\n",count++,p->hang);
				}
			}
			else
			{
				fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
			}
		}
		else
		{
			fprintf(out,"Error %d : 第 %d 行缺少 ( 符号。\n",count++,p->hang);
		}
	}
	else if(p!=NULL&&p->zhi==18)//for
	{
		fprintf(out,"Error %d : 第 %d 行不识别for语句。\n",count++,p->hang);
		p=p->next;
	}
	else if(p!=NULL&&(p->zhi==76||p->zhi==6||p->zhi==10||p->zhi==24))//表达式
	{
		biao();
		if(p!=NULL&&p->zhi==44)
		{
			//正确
			p=p->next;
		}
		else
		{
			fprintf(out,"Error %d : 第 %d 行缺少 ; 符号。\n",count++,p->hang);
		}
		p=p->next;
	}
	else
	{
	}
	if(p!=NULL&&p->zhi==42)
	{
		//正确
	}
	else if(p!=NULL&&(p->zhi==20||p->zhi==36||p->zhi==18||p->zhi==76||p->zhi==6||p->zhi==10||p->zhi==24))
	{
		yu();
	}
	else
	{
		fprintf(out,"Error %d : 第 %d 行缺少 } 符号。\n",count++,p->hang);
	}
}
void jia()
{
	if(p!=NULL&&(p->zhi==76||p->zhi==77))
	{
		p=p->next;
		if(p!=NULL&&(p->zhi==53||p->zhi==54||p->zhi==55||p->zhi==56||p->zhi==57))//加减乘除
		{
			p=p->next;
			jia();
			if(p!=NULL&&p->zhi==44)
			{
				//正确
			}
			else
			{
				fprintf(out,"Error %d : 第 %d 行缺少 ; 符。\n",count++,p->hang);
			}
		}
		else if(p!=NULL&&p->zhi==44)
		{
			//正确
		}
		else
		{
			fprintf(out,"Error %d : 第 %d 行缺少 ; 符。\n",count++,p->hang);
		}
	}
	else if(p!=NULL&&p->zhi==37)
	{
		p=p->next;
		jia();
		if(p!=NULL&&p->zhi==38)
		{
			p=p->next;
			if(p!=NULL&&(p->zhi==53||p->zhi==54||p->zhi==55||p->zhi==56||p->zhi==57))//加减乘除
			{
				p=p->next;
				jia();
				if(p!=NULL&&p->zhi==44)
				{
					//正确
				}
				else
				{
					fprintf(out,"Error %d : 第 %d 行缺少 ; 符。\n",count++,p->hang);
				}
			}
			else if(p!=NULL&&p->zhi==44)
			{
				//正确
			}
			else
			{
				fprintf(out,"Error %d : 第 %d 行缺少 ; 符。\n",count++,p->hang);
			}
		}
		else
		{
			fprintf(out,"Error %d : 第 %d 行缺少 ) 符。\n",count++,p->hang);
		}
	}
	else
	{
		fprintf(out,"Error %d : 第 %d 行没有赋值 。\n",count++,p->hang);
	}
}
void biao()
{
	if(p!=NULL)
	{
		if(p->zhi==76)
		{
			p=p->next;
			if(p!=NULL&&(p->zhi==71||p->zhi==72||p->zhi==73||p->zhi==74||p->zhi==75))//赋值
			{
				p=p->next;
				jia();
				if(p->zhi==44)
				{
					//正确
					p=p->next;
				}
				else
				{
					fprintf(out,"Error %d : 第 %d 行缺少 ; 符。\n",count++,p->hang);
				}
			}
			else if(p!=NULL&&(p->zhi==46||p->zhi==48))//成员
			{
				p=p->next;
				if(p!=NULL&&p->zhi==76)
				{
					p=p->next;
					if(p!=NULL&&(p->zhi==71||p->zhi==72||p->zhi==73||p->zhi==74||p->zhi==75))//赋值
					{
						p=p->next;
						jia();
						if(p->zhi==44)
						{
							//正确
							p=p->next;
						}
						else
						{
							fprintf(out,"Error %d : 第 %d 行缺少 ; 符。\n",count++,p->hang);
						}
					}
					else
					{
						fprintf(out,"Error %d : 第 %d 行缺少赋值。\n",count++,p->hang);
					}
				}
				else
				{
					fprintf(out,"Error %d : 第 %d 行不是合法标识符。\n",count++,p->hang);
				}
			}
			else
			{
				fprintf(out,"Error %d : 第 %d 行不是合法标识符。\n",count++,p->hang);
			}
		}
		else if(p->zhi==6||p->zhi==10||p->zhi==24)//break||continue||return
		{
			p=p->next;
			if(p!=NULL&&p->zhi==44)
			{
				//正确
				p=p->next;
			}
			else
			{
				fprintf(out,"Error %d : 第 %d 行缺少 ; 符。\n",count++,p->hang);
			}
		}
		else
		{
			fprintf(out,"Error %d : 第 %d 行不是合法赋值式。\n",count++,p->hang);
		}
	}
}
void can()
{
	if(p!=NULL&&(p->zhi==8||p->zhi==13||p->zhi==17||p->zhi==21||p->zhi==22||p->zhi==25))
	{
		p=p->next;
		if(p!=NULL&&p->zhi==76)
		{
			p=p->next;
			if(p!=NULL&&p->zhi==43)
			{
				p=p->next;
				can();
				if(p!=NULL&&p->zhi==38)
				{
					//正确
				}
				else
				{
					fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
				}
			}
			else if(p!=NULL&&p->zhi==38)
			{
				//正确
			}
			else
			{
				fprintf(out,"Error %d : 第 %d 行缺少 ) 符号。\n",count++,p->hang);
			}

⌨️ 快捷键说明

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