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

📄 语法分析.cpp

📁 这个是我们编译原理的实验.词法分析和语法分析.通过验收,含有实验报告,希望对大家有帮助.欢迎大家评论
💻 CPP
字号:
#include<iostream.h>
#include<string.h>
#include<fstream.h>
struct Accidence			//保存词法分析结果
{
	int nType;			
	int nValue;			
	char Word[20];	//单词
};

class Analyse{
public:
	void YuFaAnalyse();  //语法分析
	void CiFaAnalyse();  //词法分析
//	void shuzi();


	char str[20000];		
	Accidence *accidence[1000];		//词法分析结果

protected:
	void init();	
	int now;			//用于语法分析中,指示词法分析结果表中当前的位置
	int N;				//用于词法分析中,用于指示词法分析结果的个数
	char KW[50][20];	//关键词表

	int FindInKWTab(char *);

	bool GuanXi();			//关系
	bool TiaoJian();		//条件
	bool YinZi();			//因子
	bool Xiang();			//项
	bool BiaoDaShi();		//表达式
	bool Read();			//读语句
	bool Write();			//写语句
	bool Circulate();		//循环语句
	bool Condition();		//条件语句
	bool FuZhiYuJu();		//赋值语句
	bool FuHeYuJu();		//复合语句
	bool YuJu();			//语句
	bool ZhiXingYuJu();		//执行语句
	bool ShuoMing();		//说明
	bool ShuoMingChuan();	//说明串
	bool BianLiang();		//变量组
	bool ChangLiang();		//常量组
	bool ChengXuTi();		//程序体
	bool ChengXuShouBu();	//程序首部
	bool ChengXu();			//程序

};

char shu[60][100];
int l=0;

void Analyse::init()
{
	strcpy(KW[0],"");
	strcpy(KW[1],"program");	strcpy(KW[2],"const");
	strcpy(KW[3],"var");		strcpy(KW[4],"integer");
	strcpy(KW[5],"long");		strcpy(KW[6],"procedure");
	strcpy(KW[7],"if");			strcpy(KW[8],"then");
	strcpy(KW[9],"while");		strcpy(KW[10],"do");
	strcpy(KW[11],"read");		strcpy(KW[12],"write");
	strcpy(KW[13],"begin");		strcpy(KW[14],"end");
	strcpy(KW[15],"odd");
	strcpy(KW[16],"+");			strcpy(KW[17],"-");
	strcpy(KW[18],"*");			strcpy(KW[19],"/");
	strcpy(KW[20],"=");			strcpy(KW[21],"<>");
	strcpy(KW[22],"<");			strcpy(KW[23],"<=");
	strcpy(KW[24],">");			strcpy(KW[25],">=");
	strcpy(KW[26],".");			strcpy(KW[27],",");
	strcpy(KW[28],";");			strcpy(KW[29],":");
	strcpy(KW[30],":=");		strcpy(KW[31],"(");
	strcpy(KW[32],")");			strcpy(KW[35],"#");
	strcpy(KW[34],"");//标识符
	strcpy(KW[33],"");//正整数
}

int isCharacter(char E)
{
	if((int)E>96&&(int)E<123)//字母
		return 1;
	else return 0;
}

int isDigit(char E)
{
	if((int)E>47&&(int)E<58)//数字
		return 1;
	else return 0;
}

int isSign(char E)//符号
{
	if(E=='+'||E=='-'||E=='*'||E=='/'||E=='='||E=='.'||E==','||E==';'||E=='('||E==')')
		return 1;
	if(E=='<'||E=='>'||E==':')
		return 2;
	else return 0;
}

int Analyse::FindInKWTab(char *p)//查找关键字表
{
	for(int i=0;i<36;i++)
		if(strcmp(KW[i],p)==0)
			return i;
	return 0;
}
void Analyse::CiFaAnalyse()
{
	int k,x,q=0,n=0,i=0;
	char E[50];
	init();
	while(str[n])
	{
		while((int)str[n]==32||(int)str[n]==10||str[n]=='\t')//如果是空格,换行,Table
			n++;

		if(isCharacter(str[n]))//如果是字母
		{
			k=0;
			while(1)
			{
				E[k]=str[n];
				if(!(isCharacter(str[n+1])||isDigit(str[n+1])))//如果不是字母也不是数字
					break;
				k++;
				n++;
			}
			E[k+1]=0;
			x=FindInKWTab(E);
			if(x)//如果是关键字
			{
				accidence[q]=new Accidence;
				accidence[q]->nValue=x;
				accidence[q]->nType=x;
				strcpy(accidence[q]->Word,E);
				q++;
			}
			else{//如果是普通标识符
				accidence[q]=new Accidence;
				int y=1;
				int j=0;
				accidence[q]->nValue=1;
				for(i=0;i<q;i++)
				{
					if(accidence[i]->nType==34)
					{
						if(stricmp(accidence[i]->Word,E)==0)
						{
							accidence[q]->nValue=accidence[i]->nValue;//如果前面出现过就取前面的值
							break;
						}
						else {accidence[q]->nValue++;}
					}	
				}
				accidence[q]->nType=34;
				strcpy(accidence[q]->Word,E);
				q++;	
			}
	//		cout<<"("<<accidence[q-1]->nType<<","<<accidence[q-1]->nValue<<")\t";
	//		cout<<accidence[q-1]->Word<<'\n';	
		}
		else if(isSign(str[n])==1)//如果是符号1
		{
			E[0]=str[n];
			E[1]=0;
			x=FindInKWTab(E);
			accidence[q]=new Accidence;
			accidence[q]->nValue=0;
			accidence[q]->nType=x;
			strcpy(accidence[q]->Word,E);
			q++;
		//	cout<<"("<<accidence[q-1]->nType<<","<<accidence[q-1]->nValue<<")\t";
		//	cout<<accidence[q-1]->Word<<'\n';		
		}
		else if(str[n]=='<')
		{
			if(str[n+1]=='='||str[n+1]=='>')
			{
				E[0]=str[n];
				n++;
				E[1]=str[n];
				E[2]=0;
				x=FindInKWTab(E);
				accidence[q]=new Accidence;
				accidence[q]->nValue=0;
				accidence[q]->nType=x;
				strcpy(accidence[q]->Word,E);
				q++;
		//		cout<<"("<<accidence[q-1]->nType<<","<<accidence[q-1]->nValue<<")\t";
		//		cout<<accidence[q-1]->Word<<'\n';
			}
			else{
				E[0]=str[n];
				E[1]=0;
				x=FindInKWTab(E);
				accidence[q]=new Accidence;
				accidence[q]->nValue=0;
				accidence[q]->nType=x;
				strcpy(accidence[q]->Word,E);
				q++;
			//	cout<<"("<<accidence[q-1]->nType<<","<<accidence[q-1]->nValue<<")\t";
			//	cout<<accidence[q-1]->Word<<'\n';
			}
		}
		else if(str[n]=='>'||str[n]==':')
		{		
			if(str[n+1]=='=')
			{
				E[0]=str[n];
				n++;
				E[1]=str[n];
				E[2]=0;
				x=FindInKWTab(E);
				accidence[q]=new Accidence;
				accidence[q]->nValue=0;
				accidence[q]->nType=x;
				strcpy(accidence[q]->Word,E);
				q++;
			//	cout<<"("<<accidence[q-1]->nType<<","<<accidence[q-1]->nValue<<")\t";
		//		cout<<accidence[q-1]->Word<<'\n';
			}
			else{
					E[0]=str[n];
					E[1]=0;
					x=FindInKWTab(E);
					accidence[q]=new Accidence;
					accidence[q]->nValue=0;
					accidence[q]->nType=x;
					strcpy(accidence[q]->Word,E);
					q++;
			//		cout<<"("<<accidence[q-1]->nType<<","<<accidence[q-1]->nValue<<")\t";
			//		cout<<accidence[q-1]->Word<<'\n';
			}
		}
		else if(isDigit(str[n]))//如果是数字
		{
			k=0;
			while(1)
			{
				E[k]=str[n];
				if(!isDigit(str[n+1]))//不是数字
					break;
				k++;
				n++;
			}				
			E[k+1]=0;
			accidence[q]=new Accidence;
			accidence[q]->nValue=1;
				for(i=0;i<q;i++)
				{
					if(accidence[i]->nType==33)
					{
						if(stricmp(accidence[i]->Word,E)==0)
						{
							accidence[q]->nValue=accidence[i]->nValue;//如果前面出现过就取前面的值
							break;
						}
						else   
						{accidence[q]->nValue++;}
					}	
				}
			accidence[q]->nType=33;
			strcpy(accidence[q]->Word,E);

			q++;
		//	cout<<"("<<accidence[q-1]->nType<<","<<accidence[q-1]->nValue<<")\t";
		//	cout<<accidence[q-1]->Word<<'\n';
		}
		else{cout<<"第"<<n<<"个字符或者数字处出错 : 非法字符"<<str[n]<<'\n';}
		n++;		
	}//while结束
	N=q;
}

void Analyse::YuFaAnalyse()
{
	if(N==0)	//词法分析结果总数
		return;
	now=0;		//第now个词法分析结果
	ChengXu();
	return;
}

bool Analyse::ChengXu()
{
	if(!ChengXuShouBu())return false;
	if(!ShuoMingChuan())return false;
	if(!ChengXuTi())return false;
	cout<<'\n'<<"<程序> --> <程序首部> <说明部分> <程序主体>\n";
	cout<<'\n'<<"分析成功\n";
	return true;
}

bool Analyse::ChengXuShouBu()
{
	if(accidence[now]->nType!=1)
	{
		cout<<"第"<<now<<"个字符或者数字处出错 : 缺少program\n";
		return false;
	}
	now++;
	if(accidence[now]->nType!=34)
	{
		cout<<"第"<<now<<"个字符或者数字处出错 : program后缺少标识符\n";
		return false;
	}
	now++;
	if(accidence[now]->nType!=28)
	{
		cout<<"第"<<now<<"个字符或者数字处出错 : 缺少符号 ;\n";
		return false;
	}
	now++;
	cout<<'\n'<<"<程序首部> --> program <标识符>;\n";
	return true;
}

bool Analyse::ShuoMingChuan()
{
	if(!ShuoMing())return false;
	while(accidence[now]->nType==2)
	{
		if(!ShuoMing())
			return false;
	}
	cout<<'\n'<<"<说明部分>-->var<变量组>:int;┃const <常量组>;┃var<变量组>:int;const<常量组>;\n";
	return true;
}

bool Analyse::ShuoMing()
{
	switch(accidence[now]->nType)
	{
		case 3://var
			now++;
			if(!BianLiang())
				return false;
			if(accidence[now]->nType!=29)
			{
				cout<<"第"<<now<<"个字符或者数字处出错 : 缺少符号 :\n";
				return false;
			}
			now++;
			if(accidence[now]->nType!=4)
			{
				cout<<"第"<<now<<"个字符或者数字处出错 : 缺少关键字 integer\n";
				return false;
			}
			now++;
			break;
		case 2://const
			now++;
			if(!ChangLiang())
				return false;
			break;
		default:
			cout<<"第"<<now<<"个字符或者数字处出错 : 缺少关键字 var或者 const\n";
			return false;
	}
	now++;
	return true;
}

bool Analyse::BianLiang()
{
	if(accidence[now]->nType!=34)
	{
		cout<<"第"<<now<<"个字符或者数字处出错 : 缺少标识符 \n";
		return false;
	}
	now++;
	while(accidence[now]->nType==27)
	{
		now++;
		if(!BianLiang())
		{
			cout<<"第"<<now<<"个字符或者数字处出错 : 缺少变量 \n";
			return false;
		}
	}
	cout<<'\n'<<"<变量组> --> <标识符>┃<标识符>,<变量组>\n";
	return true;
}

bool Analyse::ChangLiang()
{
	if(accidence[now]->nType!=34)
	{
		cout<<"第"<<now<<"个字符或者数字处出错 : 缺少标识符 \n";
		return false;
	}
	now++;
	if(accidence[now]->nType!=20)
	{
		cout<<"第"<<now<<"个字符或者数字处出错 : 缺少符号 =\n";
		return false;
	}
	now++;
	if(accidence[now]->nType!=33)
	{
		cout<<"第"<<now<<"个字符或者数字处出错 : 缺少整数\n";
		return false;
	}
	now++;
	while(accidence[now]->nType==27)
	{
		now++;
		if(!ChangLiang())
		{
			cout<<"第"<<now<<"个字符或者数字处出错 : 缺少常量\n";
			return false;
		}
	}
	cout<<'\n'<<"<常量组> --> <标识符>=<整数>┃<标识符>=<整数>,<常量组>\n";
	return true;
}

bool Analyse::ChengXuTi()
{
	if(accidence[now]->nType!=13)
	{
		cout<<"第"<<now<<"个字符或者数字处出错 : 缺少关键字 begin\n";
		return false;
	}
	now++;
	if(!ZhiXingYuJu())return false;
	if(accidence[now]->nType!=14)
	{
		cout<<"第"<<now<<"个字符或者数字处出错 : 缺少关键字 end\n";
		return false;
	}
	now++;
	if(accidence[now]->nType!=26)
	{
		cout<<"第"<<now<<"个字符或者数字处出错 : 缺少符号 .\n";
		return false;
	}
	now++;
	cout<<"\n<程序主体> --> begin <执行语句> end.\n";
	return true;
}

bool Analyse::ZhiXingYuJu()
{
	if(!YuJu())return false;
	while(accidence[now]->nType==28)
	{		
		now++;
		if(!ZhiXingYuJu())
		{
			cout<<"第"<<now<<"个字符或者数字处出错 : 缺少执行语句 \n";
			return false;
		}
	}
	cout<<"\n<执行语句> --> <语句>┃<语句> ; <执行语句>\n";
	return true;
}

bool Analyse::YuJu()
{
	switch(accidence[now]->nType)
	{
		
		case 34://标识符
			if(!FuZhiYuJu())return false;
			break;
		case 7://if
			if(!Condition())return false;
			break;
		case 9://while
			if(!Circulate())return false;
			break;
		case 11://read
			if(!Read())return false;
			break;
		case 12://write
			if(!Write())return false;
			break;
		case 13://begin
			if(!FuHeYuJu())return false;
			break;
		default:
			cout<<"第"<<now<<"个字符或者数字处出错 : 缺少语句\n";
			return false;
	}
	cout<<"\n<语句>--> <赋值语句>┃<条件语句>┃<循环语句>┃<读语句>┃<写语句>┃<复合语句>\n";
	return true;
}

bool Analyse::FuZhiYuJu()
{
	if(accidence[now]->nType!=34)
	{
		cout<<"第"<<now<<"个字符或者数字处出错 : 缺少标识符\n";
		return false;
	}
	now++;
	if(accidence[now]->nType!=30)
	{
		cout<<"第"<<now<<"个字符或者数字处出错 : 缺少符号 :=\n";
		return false;
	}
	now++;
	if(!BiaoDaShi())return false;
	return true;
}

bool Analyse::Condition()
{
	if(accidence[now]->nType!=7)//!=if
		return false;
	now++;
	if(!TiaoJian())
		return false;
	if(accidence[now]->nType!=8)//!=then
		return false;
	now++;
	if(!YuJu())
		return false;
	return true;
}

bool Analyse::Circulate()
{
	if(accidence[now]->nType!=9)//while
		return false;
	now++;
	if(!TiaoJian())
		return false;
	if(accidence[now]->nType!=10)//do
		return false;
	now++;
	if(!YuJu())
		return false;
	return true;
}

bool Analyse::Read()
{
	if(accidence[now]->nType!=11)
		return false;
	now++;
	if(accidence[now]->nType!=31)
		return false;
	now++;
	if(!BianLiang())return false;
	if(accidence[now]->nType!=32)
		return false;
	now++;
	return true;
}

bool Analyse::Write()
{
	if(accidence[now]->nType!=12)
		return false;
	now++;
	if(accidence[now]->nType!=31)
		return false;
	now++;
	if(!BiaoDaShi())return false;
	if(accidence[now]->nType!=32)
		return false;
	now++;
	cout<<"\n<写语句> --> write (<表达式>)\n";
	return true;
}

bool Analyse::FuHeYuJu()
{
	if(accidence[now]->nType!=13)
		return false;
	now++;
	if(!ZhiXingYuJu())
		return false;
	if(accidence[now]->nType!=14)
		return false;
	now++;
	cout<<"\n<复合语句> --> begin <执行语句> end\n";
	return true;
}

bool Analyse::BiaoDaShi()
{
	if(!Xiang())return false;
	while(accidence[now]->nType==16||accidence[now]->nType==17)
	{
		now++;
		if(!Xiang())return false;
	}
	return true;
}

bool Analyse::Xiang()
{
	if(!YinZi())return false;
	while(accidence[now]->nType==18||accidence[now]->nType==19)
	{
		now++;
		if(!YinZi())return false;
	}
	return true;
}

bool Analyse::YinZi()
{
	switch(accidence[now]->nType)
	{
		case 33:now++;break;//整数
		case 34:now++;break;//标识符
		case 31:now++;//"("
			if(!BiaoDaShi())return false;
			if(accidence[now]->nType!=32)
			{
				cout<<"第"<<now<<"个字符或者数字处出错 : 缺少符号 )\n";
				return false;
			}
			now++;
			break;
		default:cout<<accidence[now]->Word<<'\n';
			cout<<"第"<<now<<"个字符或者数字处出错 : 缺少因子\n";
			return false;
	}
	return true;
}

bool Analyse::GuanXi()
{
	switch(accidence[now]->nType)
	{
		case 20://=
		case 24://>
		case 22://<
		case 25://>=
		case 23://<=
		case 21://<>
			break;
		default:
			cout<<"第"<<now<<"个字符或者数字处出错 : 缺少关系符\n";
			return false;
	}
	now++;
	return true;
}

bool Analyse::TiaoJian()
{
	if(!BiaoDaShi())
		return false;
	if(!GuanXi())
		return false;
	if(!BiaoDaShi())
		return false;
	return true;
}

void main()
{	char t;
	Analyse analyse;
	ifstream infile("20032320.txt",ios::in|ios::nocreate);
	int i=0;
    infile.unsetf(ios::skipws);
	while(infile>>t!='\0')
	{
		analyse.str[i]=t;
		i++;
	}
	analyse.str[i]=0;
	analyse.CiFaAnalyse();
	cout<<"语法分析结果为:\n";
	analyse.YuFaAnalyse();
	infile.close();
}

⌨️ 快捷键说明

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