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

📄 编译原理试验2.cpp

📁 你是不是很想要语法分析的源代码呢?!哈哈
💻 CPP
📖 第 1 页 / 共 3 页
字号:
						{
							output[outputrec].output1.assign(suanfu);
							output[outputrec].output2.assign(de[rec-3]);
							output[outputrec].output3.assign(de[rec-1]);
							output[outputrec].output4="T";
							output[outputrec].Tnum4=Trec;
							NTrec[rec-3]=Trec;
							outputrec++;
							Trec++;
						}
						else if(NTrec[rec-1]<0&&NTrec[rec-3]>=0)
						{
							output[outputrec].output1.assign(suanfu);
							output[outputrec].output2="T";
							output[outputrec].output3.assign(de[rec-1]);
							output[outputrec].output4="T";
							output[outputrec].Tnum2=NTrec[rec-3];
							output[outputrec].Tnum4=Trec;
							NTrec[rec-3]=Trec;
							outputrec++;
							Trec++;
						}
						else if(NTrec[rec-1]>=0&&NTrec[rec-3]<0)
						{
							output[outputrec].output1.assign(suanfu);
							output[outputrec].output2.assign(de[rec-3]);
							output[outputrec].output3="T";
							output[outputrec].output4="T";
							output[outputrec].Tnum3=NTrec[rec-1];
							output[outputrec].Tnum4=Trec;
							NTrec[rec-3]=Trec;
							outputrec++;
							Trec++;
							NTrec[rec-1]=-1;
						}
						else if(NTrec[rec-1]>=0&&NTrec[rec-3]>=0)
						{
							output[outputrec].output1.assign(suanfu);
							output[outputrec].output2="T";
							output[outputrec].output3="T";
							output[outputrec].output4="T";
							output[outputrec].Tnum2=NTrec[rec-3];
							output[outputrec].Tnum3=NTrec[rec-1];
							output[outputrec].Tnum4=Trec;
							NTrec[rec-3]=Trec;
							outputrec++;
							Trec++;
							NTrec[rec-1]=-1;
						}
					    st[rec-3]='N';
					    rec=rec-2;
				}
				else
				{
					outputerror(14,"",temp);
					return 0;
				}
				i--;
			}//relation==1
		    else
			{
			    outputerror(14,"",temp);
			    return 0;
			}
		}//else -开头
	}//for
	st[rec]='\0';
	single="";
	if(strcmp(st,"#N#")==0)
	{
		if(NTrec[1]==-1)
			single.assign(de[1]);
	    return 1;
	}
	else 
	{
		outputerror(14,"",temp);
		return 0;
	}
}  

int chartoint2(char a)
{
	if(a=='o')return 0;
	if(a=='a')return 1;
	if(a=='n')return 2;
	if(a=='d')return 3;
	if(a=='f')return 4;
	if(a=='g')return 5;
	if(a=='(')return 6;
	if(a==')')return 7;
	if(a=='#') return 8;
	else return -1;
}
int boolexpression(char * str)//布尔表达式是否合法判断
{
	int relation2[9][9]={{1,-1,-1,-1,-1,-1,-1,1,1},{1,1,-1,-1,-1,-1,-1,1,1},
	{1,1,-1,-1,-1,-1,-1,1,1},{1,1,2,2,2,2,2,1,1},{1,1,2,2,2,2,2,1,1},{1,1,2,2,2,2,2,1,1},
	{-1,-1,-1,-1,-1,-1,-1,0,2},	{1,1,2,2,2,2,2,1,1},{-1,-1,-1,-1,-1,-1,-1,2,0}};
	//数组的意义与numberexpression函数相同
	
	bnode bexp[10];//存关系表达式
	int bexprec=0;
	int i,j,k,m=0,n;
	int fgf[8][2];
	for(i=0;str[i]!='\0';)
	{
		if(str[i]==':'||str[i]=='['||str[i]==']'||str[i]=='.'
			||str[i]==';'||str[i]=='\''||str[i]==',')//布尔表达式中非法字符
		{
			outputerror(15,"","");
			return 0;
		}
		if(str[i]=='<'||str[i]=='>'||str[i]=='=')//遇到关系符时
		{
			k=0;
			n=0;
			for(j=i;j>=0;j--)
			{
				if(str[j]==')')k++;//考虑括号个数
				if(str[j]=='(')n++;
				if(str[j-2]=='a'&&str[j-1]=='n'&&str[j]=='d'
				||str[j-2]=='n'&&str[j-1]=='o'&&str[j]=='t'
				||str[j-1]=='o'&&str[j]=='r')break;
			}
		    if(k==n)fgf[m][0]=j+1;
			else 
			{
				j++;
				for(int temp=0;temp<abs(k-n);temp++)
				{
				   for(;str[j]!='(';j++)////////////////////
					   if(str[j]!=' ')
					   {
						   outputerror(13,"","");
						   return 0;
					   }
				   j++;
				}
				fgf[m][0]=j;
			}
			n=0;
			k=0;
			for(j=i;str[j]!='\0';j++)
			{
				if(str[j]=='(')k++;//考虑括号个数
				if(str[j]==')')n++;
				if(str[j]=='a'&&str[j+1]=='n'&&str[j+2]=='d'
				||str[j]=='n'&&str[j+1]=='o'&&str[j+2]=='t'
				||str[j]=='o'&&str[j+1]=='r')break;
			}
		   if(k==n)fgf[m][1]=j-1;
			else
			{
				j--;
				for(int temp=0;temp<abs(k-n);temp++)
				{
				   for(;str[j]!=')';j--)
					   if(str[j]!=' ')
					   {
						   outputerror(13,"","");
						   return 0;
					   }
				   j--;
				}
				fgf[m][1]=j;
			}
			for(k=0,j=fgf[m][0];j<i;j++,k++)bexp[m].first[k]=str[j];
			bexp[m].first[k]='\0';//记录关系符前面的表达式
			if(str[i]=='<'&&(str[i+1]=='>'||str[i+1]=='=')
				||str[i]=='>'&&str[i+1]=='=')
			{
				bexp[m].fu[0]='j';
				bexp[m].fu[1]=str[i];
				bexp[m].fu[2]=str[i+1];//记录算符
				bexp[m].fu[3]='\0';
				for(k=0,j=i+2;j<=fgf[m][1];j++,k++)bexp[m].second[k]=str[j];
			    bexp[m].second[k]='\0';//记录关系符后面的表达式
			}
			else if(str[i]=='<'||str[i]=='>'||str[i]=='=')
			{
				bexp[m].fu[0]='j';
				bexp[m].fu[1]=str[i];
				bexp[m].fu[2]='\0';//记录算符
				for(k=0,j=i+1;j<=fgf[m][1];j++,k++)bexp[m].second[k]=str[j];
			    bexp[m].second[k]='\0';
			}
			i=fgf[m][1];
			m++;
		}
		i++;
	}//遇到关系符时

	char btemp[20];
	bexprec=m-1;
	m=0;
	char bstack[50];
	int bstackrec=0;
	string bsfu[15];//存标识符
	int bsfurec=0;
	string constbool[8];
	int constboolrec=0;
	for(i=0;str[i]!='\0';)
	{
		if(i==fgf[m][0])
		{
			bstack[bstackrec]='f';
			bstackrec++;
			i=fgf[m][1]+1;
			m++;
			continue;
		}
		for(;str[i]==' '&&str[i]!='\0';i++);
		if(str[i]=='('||str[i]==')')
		{
			bstack[bstackrec]=str[i];
			bstackrec++;
			i++;
		}
		else if(str[i]!='\0')
		{
			for(j=0;!(str[i]==' '||str[i]=='('||str[i]==')')&&str[i]!='\0';j++,i++)btemp[j]=str[i];
			btemp[j]='\0';
		    if(strcmp(btemp,"true")==0||strcmp(btemp,"false")==0)
			{
				constbool[constboolrec].assign(btemp);
				constboolrec++;
				bstack[bstackrec]='d';
				bstackrec++;
			}
			else if(strcmp(btemp,"or")==0)
			{
				bstack[bstackrec]='o';
				bstackrec++;
			}
			else if(strcmp(btemp,"and")==0)
			{
				bstack[bstackrec]='a';
				bstackrec++;
			}
			else if(strcmp(btemp,"not")==0)
			{
				bstack[bstackrec]='n';
				bstackrec++;
			}
			else 
			{
				for(j=0;strcmp(btemp,record[j].content)!=0&&j<=record1;j++);//j<=record可以删去
               if(j==record1)
                {
				    cout<<"标识符错误。位置:第"<<row<<"行。\n";
					return 0;
                }
				if(record[j].define==0)
				{
				    cout<<"布尔表达式错误,标识符没有定义。位置第"<<row<<"行。\n";
					return 0;
				}
				else if(record[j].type!=1)
				{
					cout<<"布尔表达式错误,单个标识符类型不是布尔型。位置第"<<row<<"行。\n";
					return 0;
				}
				else 
				{
					bsfu[bsfurec].assign(btemp);
					bsfurec++;
					bstack[bstackrec]='g';
					bstackrec++;
				}
			}
		}//else
	}//for
	bstack[bstackrec]='#';
	bstack[bstackrec+1]='\0';
	for(i=0;i<6;i++)
	{
		bexit[i].truesum=0;
		bexit[i].falsesum=0;
		bexit[i].allsum=0;
	}
	int bexitrec[20]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
    bsfurec=0;//标记bsfu数组
	bexprec=0;//标记bexp数组
	constboolrec=0;//标记constbool数组
	char Nrec[20];//记录归约时的N
	int Nnum=1;
	Nrec[0]='#';
	pbexit=0;
	for(i=0;bstack[i]!='\0';i++)
	{
		if(Nrec[Nnum-1]=='N')j=relation2[chartoint2(Nrec[Nnum-2])][chartoint2(bstack[i])];
		else j=relation2[chartoint2(Nrec[Nnum-1])][chartoint2(bstack[i])];
		if(j==-1)//移进
		{
			Nrec[Nnum]=bstack[i];
			Nnum++;
		}
		else if(j==0)//归约
		{
			if(Nrec[Nnum-1]!='N')
			{
				outputerror(13,"","");
				return 0;
			}
			else if(Nrec[Nnum-2]=='(')
			{
				bexitrec[Nnum-2]=bexitrec[Nnum-1];
				bexitrec[Nnum-1]=-1;
				Nrec[Nnum-2]='N';
				Nnum=Nnum-1;
			}
			else 
			{
				Nrec[Nnum]=bstack[i];
				Nnum++;
			}
		}//j==0
		else if(j==1)
		{
			if(Nrec[Nnum-1]=='g')
			{
				Nrec[Nnum-1]='N';
				gguiyue(bsfurec,bexitrec[Nnum-1], pbexit,bexit,bsfu);//布尔表达式中归约g函数
	
			}
			else if(Nrec[Nnum-1]=='f')
			{
				Nrec[Nnum-1]='N';
				fguiyue(bexprec,bexitrec[Nnum-1], pbexit,bexit,bexp);//布尔表达式中归约f函数
			}
			else if(Nrec[Nnum-1]=='d')//分析true or false 情况
			{
				Nrec[Nnum-1]='N';
				bexit[pbexit].entry=outputrec;
				if(constbool[constboolrec].compare("true")==0)
				{
					output[outputrec].output1="j-true";
					bexit[pbexit].truesum=1;
				    bexit[pbexit].trueexit[0]=outputrec;
					bexit[pbexit].falsesum=0;
				}
				else
				{
					output[outputrec].output1="j-false";
					bexit[pbexit].falsesum=1;
				    bexit[pbexit].falseexit[0]=outputrec;
					bexit[pbexit].truesum=0;
				}
				output[outputrec].output2="-";
		        output[outputrec].output3="-";
		        output[outputrec].output4="j";
		        outputrec++;
				constboolrec++;
				bexitrec[Nnum-1]=pbexit;
				pbexit++;
			}
			else if((Nrec[Nnum-3]=='N'&&Nrec[Nnum-2]=='o'||
				Nrec[Nnum-3]=='N'&&Nrec[Nnum-2]=='a'||
				Nrec[Nnum-2]=='n')&&Nrec[Nnum-1]=='N')
			{
				    if(Nrec[Nnum-2]=='n')//归约nN
					{//交换真假出口
						int ntemp;
						ntemp=bexit[bexitrec[Nnum-1]].falsesum;
						bexit[bexitrec[Nnum-1]].falsesum=bexit[bexitrec[Nnum-1]].truesum;
						bexit[bexitrec[Nnum-1]].truesum=ntemp;
						for(int i=0;i<bexit[bexitrec[Nnum-1]].falsesum||i<bexit[bexitrec[Nnum-1]].truesum;i++)
						{
							ntemp=bexit[bexitrec[Nnum-1]].falseexit[i];
						    bexit[bexitrec[Nnum-1]].falseexit[i]=bexit[bexitrec[Nnum-1]].trueexit[i];
						    bexit[bexitrec[Nnum-1]].trueexit[i]=ntemp;
						}
						bexitrec[Nnum-2]=bexitrec[Nnum-1];
						bexitrec[Nnum-1]=-1;
						Nrec[Nnum-2]='N';
						Nnum--;
					}//归约nN
					else//当NoN,NaN
					{
						if(Nrec[Nnum-2]=='o')//归约NoN
						{
							int i,k;
							if(bexit[bexitrec[Nnum-3]].falsesum==0)
							{//当第一个N中是布尔常量且常量为真时
								outputrec-=bexit[bexitrec[Nnum-1]].allsum;
							}
							else
							{
								for(i=0;i<bexit[bexitrec[Nnum-3]].falsesum;i++)//回填假出口
									output[bexit[bexitrec[Nnum-3]].falseexit[i]].Tnum4=bexit[bexitrec[Nnum-1]].entry;
								for(k=0, i=bexit[bexitrec[Nnum-3]].truesum;k<bexit[bexitrec[Nnum-1]].truesum;i++,k++)
								{//合并真出口
									bexit[bexitrec[Nnum-3]].trueexit[i]=bexit[bexitrec[Nnum-1]].trueexit[k];
								}
								bexit[bexitrec[Nnum-3]].truesum+=bexit[bexitrec[Nnum-1]].truesum;
								for(k=0;k<bexit[bexitrec[Nnum-1]].falsesum;k++)
								{//覆盖假出口
									bexit[bexitrec[Nnum-3]].falseexit[k]=bexit[bexitrec[Nnum-1]].falseexit[k];
								}
								bexit[bexitrec[Nnum-3]].falsesum=bexit[bexitrec[Nnum-1]].falsesum;
								bexit[bexitrec[Nnum-3]].allsum+=bexit[bexitrec[Nnum-1]].allsum;
							}
							bexitrec[Nnum-1]=-1;
							pbexit--;//bexitrec[Nnum-1]对应的bexit结点可以删除
							Nnum-=2;
						}
						else//归约NaN
						{
							int i,k;
							if(bexit[bexitrec[Nnum-3]].truesum==0)
							{//当第一个N中是布尔常量且常量为假时
								outputrec-=bexit[bexitrec[Nnum-1]].allsum;
							}
							else
							{
								for(i=0;i<bexit[bexitrec[Nnum-3]].truesum;i++)//回填真出口
									output[bexit[bexitrec[Nnum-3]].trueexit[i]].Tnum4=bexit[bexitrec[Nnum-1]].entry;
								for(k=0, i=bexit[bexitrec[Nnum-3]].falsesum;k<bexit[bexitrec[Nnum-1]].falsesum;i++,k++)
								{//合并假出口
									bexit[bexitrec[Nnum-3]].falseexit[i]=bexit[bexitrec[Nnum-1]].falseexit[k];
								}
								bexit[bexitrec[Nnum-3]].falsesum+=bexit[bexitrec[Nnum-1]].falsesum;
								for(k=0;k<bexit[bexitrec[Nnum-1]].truesum;k++)//覆盖真出口
								{
									bexit[bexitrec[Nnum-3]].trueexit[k]=bexit[bexitrec[Nnum-1]].trueexit[k];
								}
								bexit[bexitrec[Nnum-3]].truesum=bexit[bexitrec[Nnum-1]].truesum;
								bexit[bexitrec[Nnum-3]].allsum+=bexit[bexitrec[Nnum-1]].allsum;
							}
							bexitrec[Nnum-1]=-1;
							pbexit--;//bexitrec[Nnum-1]对应的bexit结点可以删除
							Nnum-=2;
						}
					}//归约NoN,NaN
				
			}//归约nN NaN NoN
			else 
			{
				outputerror(16,"","");
				return 0;
			}
			i--;//归约时因为没有移入,所以i--,让i指针停止
		}//j==1
		else
		{
			outputerror(13,"","");
			return 0;
		}
	}//算符优先分析
	Nrec[Nnum]='\0';
	if(strcmp(Nrec,"#N#")==0)return 1;//#N#时,成功匹配
	else 
	{
		outputerror(13,"","");
		return 0;
	}
}
void gguiyue(int& a,int &c,int & pbexit,bexitnode bexit[],
			  string bsfu[])//布尔表达式中归约g函数
{
	    bexit[pbexit].entry=outputrec;
		output[outputrec].output1="j=";
		output[outputrec].output2.assign(bsfu[a]);
		output[outputrec].output3="true";
		output[outputrec].output4="j";
		outputrec++;
		output[outputrec].output1="j";
		output[outputrec].output2="-";
		output[outputrec].output3="-";
		output[outputrec].output4="j";
		outputrec++;
		bexit[pbexit].truesum=1;
		bexit[pbexit].trueexit[0]=outputrec-2;
		bexit[pbexit].falsesum=1;
		bexit[pbexit].falseexit[0]=outputrec-1;
		bexit[pbexit].allsum=2;
		c=pbexit;
		pbexit++;
		a++;
}
void fguiyue(int & b,int &c,int & pbexit,bexitnode bexit[],
			  bnode bexp[])//布尔表达式中归约f函数
{
	
		string ftemp;
		int fnum=0;
		bexit[pbexit].entry=outputrec;
		numberexpression(bexp[b].first);
		ftemp.assign(single);//记录single的值
		fnum=output[outputrec-1].Tnum4;//记录最后T值
		numberexpression(bexp[b].second);
		if(single.compare("")!=0)
		{
			output[outputrec].output3.assign(single);
		}
		else 
		{
			output[outputrec].output3="T";
			output[outputrec].Tnum3=output[outputrec-1].Tnum4;
		}
		output[outputrec].output1.assign(bexp[b].fu);
		output[outputrec].output4="j";
		if(ftemp.compare("")!=0)
		{
			output[outputrec].output2.assign(ftemp);
		}
		else
		{
			output[outputrec].output2="T";
			output[outputrec].Tnum2=fnum;
		}
		outputrec++;
		output[outputrec].output1="j";
		output[outputrec].output2="-";
		output[outputrec].output3="-";
		output[outputrec].output4="j";
		outputrec++;
		bexit[pbexit].truesum=1;
		bexit[pbexit].trueexit[0]=outputrec-2;
		bexit[pbexit].falsesum=1;
		bexit[pbexit].falseexit[0]=outputrec-1;
		bexit[pbexit].allsum=outputrec-bexit[pbexit].entry;
		c=pbexit;
		pbexit++;
		b++;
}

⌨️ 快捷键说明

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