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

📄 fifoexedlg.cpp

📁 chifafenxiqi chifafenxiqi chifafenxiqi chifafenxiqi chifafenxiqi chifafenxiqi
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				row = isin(StrGen[i][0],VN);
				col = isin(FL_Stack[top].vt,VT);// 第一个终结符所在数组的列数
		
				first[row][col] = '1';
				FL_Stack[top].vn = StrGen[i][0];//存入堆栈
			    //FL_Stack[top].vt = StrGen[i][3];
				top++;
			}		
	}//end of while top
}


/***************************************************************************/
/*                        求LastVT表格中的内容                              */
/***************************************************************************/
void Creat_LastVT_Table(char first[][100],char StrGen[][20], int num_Gen, char VN[],char VT[])
{
	int num_VN,num_VT;
	int i,SourcePointer,SourceLen;
//	int j,k;
	int templength;
//	int tempch;
	struct stack {  
		char vn;
		char vt;
	}FL_Stack[100];//定义操作使用的堆栈

	int top=0;//栈顶指针	
    int row, col; //firstVT数组中的行列位置
	
	num_VN = strlen(VN);/*求出VN的长度,即非终结符的个数*/
	num_VT = strlen(VT);/*求出VT的长度,即终结符的个数*/

	for( row=0; row<num_VN+1; row++)  //初始化
		for(int col=0; col < num_VT+1; col++)
			first[row][col]=' ';
	for( row=0;row<num_VN+1;row++)  //初始化行头
		first[row+1][0]=VN[row];
	for(col=0;col < num_VT;col++)  //初始化列头
			first[0][col+1]=VT[col];

	for( i= 0; i<num_Gen;i++)  //用产生式对数组进行初始化
	{
			SourcePointer =0;
			SourceLen =strlen(StrGen[i]);//当前产生式
			row = isin(StrGen[i][0],VN); // 第一个非终结符所在数组的行数
			col = isin(StrGen[i][SourceLen-1],VT);// 第一个终结符所在数组的列数
			if ( col > 0 )//P->...a
			{
					FL_Stack[top].vn = StrGen[i][0];//存入堆栈
					FL_Stack[top].vt = StrGen[i][SourceLen-1];
					top++;
					first[row][col] = '1';
				
			}
			else if(isin(StrGen[i][SourceLen-1],VN) && isin(StrGen[i][SourceLen-2],VT))//P->...aQ
			{
				FL_Stack[top].vn = StrGen[i][0];//存入堆栈
				FL_Stack[top].vt = StrGen[i][SourceLen-2];
				top++;
				col = isin(StrGen[i][4],VT);
				first[row][col] = '1';
			}
	}//end of for i*/

	while(top >0) //从堆栈中弹出修改数组
	{
		top--;

		for( i= 0; i<num_Gen;i++)
		{
			templength=strlen(StrGen[i]);
			if ( (StrGen[i][templength-1] == FL_Stack[top].vn) && (StrGen[i][0] != FL_Stack[top].vn))
			{//P->...Q且不是Q->...Q
				row = isin(StrGen[i][0],VN);
				col = isin(FL_Stack[top].vt,VT);// 第一个终结符所在数组的列数
		
				first[row][col] = '1';
				FL_Stack[top].vn = StrGen[i][0];//存入堆栈
				//FL_Stack[top].vt = StrGen[i][3];
				top++;
			}
		}
		
	}//end of while top
		
}


/***************************************************************************/
/*                        求LR表格中的内容                              */
/***************************************************************************/
void Creat_LR_Table(char first[][100],char StrGen[][20], int num_Gen, char VN[],char VT[])
{
	int num_VN,num_VT;
	int i,SourcePointer,SourceLen;
	int j;
    int row, col; //firstVT数组中的行列位置
	
	num_VN = strlen(VN);/*求出VN的长度,即非终结符的个数*/
	num_VT = strlen(VT);/*求出VT的长度,即终结符的个数*/

	for( row=0; row<num_VN+1; row++)  //初始化
		for(int col=0; col < num_VT+1; col++)
			first[row][col]=' ';
	for( row=0;row<num_VT+1;row++)  //初始化行头
		first[row+1][0]=VT[row];
	for(col=0;col < num_VT;col++)  //初始化列头
			first[0][col+1]=VT[col];
	for( i= 0; i<num_Gen;i++)  
	{
			SourcePointer =0;
			SourceLen =strlen(StrGen[i]);
			for(j=0;j<SourceLen-5;j++)//P->...aQb...
			{
				row = isin(StrGen[i][j+3],VT); 
				col = isin(StrGen[i][j+5],VT);
				if ( col > 0&&row>0 && isin(StrGen[i][j+4],VN)>0)
				{
						first[row][col] ='=';
				
				}
			}
			for(j=0;j<SourceLen-4;j++)//P->...ab...
			{
				row = isin(StrGen[i][j+3],VT); 
				col = isin(StrGen[i][j+4],VT);
				if ( col > 0&&row>0)
				{
						first[row][col] ='=';
				
				}
			}
			for(j=0;j<SourceLen-4;j++)//P->...aQ...
			{
				row = isin(StrGen[i][j+3],VT); 
				col = isin(StrGen[i][j+4],VN);
				if ( col > 0&&row>0 )
				{
					for(int k=0;k<100;k++)
					{
						if(firstvt[col][k]=='1'&&j>=0)
							first[row][k]='<';						
					}
				}
			}	
			for(j=0;j<SourceLen-4;j++)//P->...Qa...
			{
				row = isin(StrGen[i][j+3],VN); 
				col = isin(StrGen[i][j+4],VT);
				if ( col > 0&&row>0 )
				{
					for(int k=0;k<100;k++)
					{
						if(lastvt[row][k]=='1'&&j>=0)						
							first[k][col]='>';												
					}
				}
			}
	}			
}
/***************************************************************************/
/*                                 设置FIRSTVT表格显示                            */
/***************************************************************************/
void CFifoexeDlg::Display_Table_Fill(char first[][100],int num_VN,int num_VT)
{
	int i,j;
	char TmpStr[2];
	m_ListTable.DeleteAllItems();
	for(i=0;i<10;i++)
		m_ListTable.DeleteColumn(i);
	for (i=0; i <= num_VT; i++)
	{
		m_ListTable.DeleteColumn(0);
	}

	for(i=0;i<num_VT+1;i++) // 设置列表控件的列头
		{   
			TmpStr[0] = first[0][i];
			TmpStr[1] ='\0';
			m_ListTable.InsertColumn(i+1,TmpStr,LVCFMT_CENTER,35);
		}
	
	for(i =0; i< num_VN+1; i++) // 设置列表控件的行头
	{
		TmpStr[0] = first[i][0];
		TmpStr[1] ='\0';
		m_ListTable.InsertItem(i,TmpStr);
		for(j=0;j<num_VT+1;j++) // 设置列表控件的内容
		{   
			TmpStr[0] = first[i+1][j];
			TmpStr[1] ='\0';
			m_ListTable.SetItemText(i,j,TmpStr);
		}
	}
}

/***************************************************************************/
/*                                 设置LASTVT表格显示                            */
/***************************************************************************/
void CFifoexeDlg::Display_TableLastVT_Fill(char first[][100],int num_VN,int num_VT)
{
	int i,j;
	char TmpStr[2];
	m_ListTableLastVT.DeleteAllItems();
	for(i=0;i<10;i++)
		m_ListTableLastVT.DeleteColumn(i);
	for (i=0; i <= num_VT; i++)
	{
		m_ListTableLastVT.DeleteColumn(0);
	}

	for(i=0;i<num_VT+1;i++) // 设置列表控件的列头
		{   
			TmpStr[0] = first[0][i];
			TmpStr[1] ='\0';
			m_ListTableLastVT.InsertColumn(i+1,TmpStr,LVCFMT_CENTER,35);
		}
	
	for(i =0; i< num_VN+1; i++) // 设置列表控件的行头
	{
		TmpStr[0] = first[i][0];
		TmpStr[1] ='\0';
		m_ListTableLastVT.InsertItem(i,TmpStr);
		for(j=0;j<num_VT+1;j++) // 设置列表控件的内容
		{   
			TmpStr[0] = first[i+1][j];
			TmpStr[1] ='\0';
			m_ListTableLastVT.SetItemText(i,j,TmpStr);
		}
	}
}

/***************************************************************************/
/*                                 设置LR表格显示                            */
/***************************************************************************/
void CFifoexeDlg::Display_TableLR_Fill(char first[][100],int num_VT1,int num_VT)
{
	int i,j;
	char TmpStr[2];
	m_ListTableLR.DeleteAllItems();
	for(i=0;i<10;i++)
		m_ListTableLR.DeleteColumn(i);
	for (i=0; i <= num_VT; i++)
	{
		m_ListTableLR.DeleteColumn(0);
	}

	for(i=0;i<num_VT+1;i++) // 设置列表控件的列头
		{   
			TmpStr[0] = first[0][i];
			TmpStr[1] ='\0';
			m_ListTableLR.InsertColumn(i+1,TmpStr,LVCFMT_CENTER,35);
		}
	
	for(i =0; i< num_VT1+1; i++) // 设置列表控件的行头
	{
		TmpStr[0] = first[i][0];
		TmpStr[1] ='\0';
		m_ListTableLR.InsertItem(i,TmpStr);
		for(j=0;j<num_VT+1;j++) // 设置列表控件的内容
		{   
			TmpStr[0] = first[i+1][j];
			TmpStr[1] ='\0';
			m_ListTableLR.SetItemText(i,j,TmpStr);
		}
	}
}

void CFifoexeDlg::OnButtonFirst() 
{
	// TODO: Add your control notification handler code here
	bool flag_VN = false,flag_VT = false; //用于标识终结符和非终结符是否已经出现过
	char StrGen[10][20];//存放产生式的数组
	int num_Gen=0; //产生式个数
	char VN[10];//存放全部非终结符的数组
	char VT[10];//存放全部终结符的数组
	char first[100][100];// = (char **)malloc(num_VT * num_VN *sizeof(char) );


	flagfirstvt=1;
	UpdateData(true) ; //将控件内容取到变量中
		
	if( m_Source.IsEmpty())
	{
		MessageBox("还没有输入产生式,请输入产生式!");
		return;
	}

	m_Source = Pre_Process(m_Source); // 对产生式的预处理
	
	num_Gen = Generator(m_Source,StrGen);//生成产生式数组
    VN[0]='\0';
	VT[0]='\0';
	VtVn(StrGen, num_Gen, VN, VT); //求终结符和非终结符

	Creat_FirstVT_Table(first, StrGen, num_Gen, VN, VT);//计算FirstVT表格的内容
 
	Display_Table_Fill(first,strlen(VN), strlen(VT) );//在屏幕上显示FirstVT表格的内容
	for(int i=0;i<100;i++)
		for(int j=0;j<100;j++)
			firstvt[i][j]=first[i][j];

	UpdateData(false) ;	
	
}

void CFifoexeDlg::OnButtonFollow() 
{
	// TODO: Add your control notification handler code here
	bool flag_VN = false,flag_VT = false; //用于标识终结符和非终结符是否已经出现过
	char StrGen[10][20];//存放产生式的数组
	int num_Gen=0; //产生式个数
	char VN[10];//存放全部非终结符的数组
	char VT[10];//存放全部终结符的数组
	char first[100][100];// = (char **)malloc(num_VT * num_VN *sizeof(char) );


	flaglastvt=1;
	UpdateData(true) ; //将控件内容取到变量中
		
	if( m_Source.IsEmpty())
	{
		MessageBox("还没有输入产生式,请输入产生式!");
		return;
	}

	m_Source = Pre_Process(m_Source); // 对产生式的预处理
	
	num_Gen = Generator(m_Source,StrGen);//生成产生式数组
    VN[0]='\0';
	VT[0]='\0';
	VtVn(StrGen, num_Gen, VN, VT); //求终结符和非终结符


	Creat_LastVT_Table(first, StrGen, num_Gen, VN, VT);//计算lastVT表格的内容
 
	Display_TableLastVT_Fill(first,strlen(VN), strlen(VT) );//在屏幕上显示FirstVT表格的内容
	for(int i=0;i<100;i++)
		for(int j=0;j<100;j++)
			lastvt[i][j]=first[i][j];

	UpdateData(false) ;	
	
}

void CFifoexeDlg::OnLR() 
{
	// TODO: Add your control notification handler code here
	bool flag_VN = false,flag_VT = false; //用于标识终结符和非终结符是否已经出现过
	char StrGen[10][20];//存放产生式的数组
	int num_Gen=0; //产生式个数
	char VN[10];//存放全部非终结符的数组
	char VT[10];//存放全部终结符的数组
	char first[100][100];// = (char **)malloc(num_VT * num_VN *sizeof(char) );
	char tch;

	flaglr=1;
	UpdateData(true) ; //将控件内容取到变量中
		
	if( m_Source.IsEmpty())
	{
		MessageBox("还没有输入产生式,请输入产生式!");
		return;
	}
	if(flagfirstvt==0)
	{
		MessageBox("请先求Firstvt集!");
		return;
	}
	if(flaglastvt==0)
	{
		MessageBox("请先求Lastvt集!");
		return;
	}

	m_Source = Pre_Process(m_Source); // 对产生式的预处理
	
	num_Gen = Generator(m_Source,StrGen);//生成产生式数组
	tch=StrGen[0][0];
	StrGen[num_Gen][0]='S';
	StrGen[num_Gen][1]='-';
	StrGen[num_Gen][2]='>';
	StrGen[num_Gen][3]='#';
	StrGen[num_Gen][4]=tch;
	StrGen[num_Gen][5]='#';
	StrGen[num_Gen][6]='\0';
	num_Gen++;

    VN[0]='\0';
	VT[0]='\0';
	VtVn(StrGen, num_Gen, VN, VT); //求终结符和非终结符
//	MessageBox(StrGen[num_Gen-1]);

	Creat_LR_Table(first, StrGen, num_Gen, VN, VT);//计算LR表格的内容
 
	Display_TableLR_Fill(first,strlen(VT), strlen(VT) );//在屏幕上显示First表格的内容
	for(int i=0;i<100;i++)
		for(int j=0;j<100;j++)
			lr[i][j]=first[i][j];

	UpdateData(false) ;	
}

void CFifoexeDlg::OnBUTTONAnalyse() 
{
	// TODO: Add your control notification handler code here
	
}

⌨️ 快捷键说明

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