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

📄 算符优先文法dlg.cpp

📁 编译原理课程设计 算符优先算法的实现 输出FIRSTVT和LASTVT
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			if(Pos0!=-1 && Pos1!=-1)
				if(G[Pos0][Pos1]==' ')
					G[Pos0][Pos1]='=';
			if(j<Pt[i].pright.GetLength()-2)
			{
				Pos2=Vt.Find(Pt[i].pright[j+2]);
				if(Pos0!=-1 && Pos1==-1 && Pos2!=-1)
					if(G[Pos0][Pos2]==' ')
						G[Pos0][Pos2]='=';
			}
			if(Pos0!=-1 && Pos1==-1)
				for(k=0;k<Vt.GetLength();k++)
				{
					Vnnum=Vn.Find(Pt[i].pright[j+1]);
					if(F[Vnnum][k])
						if(G[Pos0][k]==' ')
							G[Pos0][k]='<';
				}
			if(Pos0==-1 && Pos1!=-1)
				for(k=0;k<Vt.GetLength();k++)
				{
					Vnnum=Vn.Find(Pt[i].pright[j]);
					if(L[Vnnum][k])
						if(G[k][Pos1]==' ')
							G[k][Pos1]='>';
				}
		}
	

}


int CMyDlg::Analyze(int Ptnum)                      // 规约主函数
{
	CString char_input;
	CString char_input0;
	CString buffer;
	char a;
	CString Q;
	bool flag=false;
	int i;
	int j;
	int k;
	int x;
	int y;
	int output_i=0;
	int output_j=0;
	int amax;
	
	for(i=0;i<20;i++)
		charstack[i]=0;
	char_input=m_sentence+"#";
	char_input0=char_input;
	amax=m_sentence.GetLength();
	k=0;
	charstack[k]='#';
	a=char_input[0];
	output[output_i][1]=charstack;
	output[output_i][2]=char_input0;
	output[output_i][3]="进栈";
	output_i++;
	i=0;
	while(1)
	{
//		if(a=='#'&&i>=1)
//			flag=true;
		if(i<=amax)
			a=char_input[i];
		else 
			break;
		if(Vt.Find(charstack[k])!=-1)
			j=k;
		else
			j=k-1;

		x=Vt.Find(charstack[j]);
		y=Vt.Find(a);
		if(G[x][y]==NULL)
		{
			FlagOk=Error(charstack[j],a,output_i);
			output[output_i][1]=charstack;
			output[output_i][2]=char_input0;
			output[output_i][3]="出错中止";
			return(output_i+1);
		}
		while(G[x][y]=='>')
		{
			do{
				Q=charstack[j];
				if(Vt.Find(charstack[j-1])!=-1)
					j=j-1;
				else 
					j=j-2;
				x=Vt.Find(charstack[j]);
				y=Vt.Find(Q);
				if(G[x][y]==' ')
				{
					FlagOk=Error(charstack[j],a,output_i);
					output[output_i-1][3]="出错中止";
					return(output_i);
				}
			}while(G[x][y]!='<');
			bool success=false;

			output[output_i][4].Empty();

			success=Guiyue(j,k,Ptnum,output_i);            //调用规约子程序

			output[output_i][1]=charstack;
			output[output_i][2]=char_input0;
			output[output_i][3]="规约";
			buffer=output[output_i][4];
			output[output_i][4].Empty();
			output[output_i][4]+=charstack[j];
			output[output_i][4]+=" ";
			output[output_i][4]+=G[x][y];
			output[output_i][4]+=" ";
			output[output_i][4]+=a;
			output[output_i][4]+=buffer;
			output_i++;
			if(success)
				k=j+1;
			else 
			{
				AfxMessageBox("规约失败~!");
				FlagOk=false;
				output[output_i][1]=charstack;
				output[output_i][2]=char_input0;
				output[output_i][3]="出错中止";
				return(output_i+1);

			}
		}
		x=Vt.Find(charstack[j]);
		y=Vt.Find(a);
		if(G[x][y]==' ')
		{
			FlagOk=Error(charstack[j],a,output_i);
			output[output_i][1]=charstack;
			output[output_i][2]=char_input0;
			output[output_i][3]="出错中止";
			return(output_i+1);
		}
		if(G[x][y]=='<' || G[x][y]=='=')
		{
			k++;
			charstack[k]=a;
			char_input0.Delete(0,1);
			output[output_i][1]=charstack;
			output[output_i][2]=char_input0;
			output[output_i][3]="进栈";
			output[output_i][4].Empty();
			output[output_i][4]+=charstack[j];
			output[output_i][4]+=" ";
			output[output_i][4]+=G[x][y];
			output[output_i][4]+=" ";
			output[output_i][4]+=a;
			output_i++;
			i++;
		}

		if(charstack[2]=='#') break;

	}

	return(output_i);
}

bool CMyDlg::Guiyue(int j,int k,int Ptnum,int output_i)          //规约子程序
{
	int i;
	int cleari;
	int iPt;
	CString CompareNew;
	CString CompareFormer;
	CString LeftestPhrase;
	CompareNew.Empty();
	CompareFormer.Empty();
	LeftestPhrase.Empty();
	for(i=j+1;i<=k;i++)
	{
		
		if(Vt.Find(charstack[i])!=-1)
		{
			CompareNew+=charstack[i];
			LeftestPhrase+=charstack[i];
		}		 
		else
		{
			CompareNew+=" ";
			LeftestPhrase+=charstack[i];
		}
	}
	for(i=0;i<Ptnum;i++)
	{
		CompareFormer.Empty();
		for(iPt=0;iPt<Pt[i].pright.GetLength();iPt++)
		{
			if(Vt.Find(Pt[i].pright[iPt])!=-1)
				CompareFormer+=Pt[i].pright[iPt];
			else 
				CompareFormer+=" ";
		}
		if(CompareNew==CompareFormer)
		{
			for(cleari=j+1;cleari<=k;cleari++)
				charstack[cleari]=NULL;
			charstack[j+1]=Pt[i].pleft;
			output[output_i][4]+=",使用";
			output[output_i][4]+=Pt[i].pleft;
			output[output_i][4]+="->";
			output[output_i][4]+=Pt[i].pright;
			output[output_i][5]=LeftestPhrase;
			return(true);
		}
		if(CompareNew!=CompareFormer && i==Ptnum-1)
			LeftestPhrase=" ";
		
	}
	output[output_i][5]=LeftestPhrase;
	return(false);
}

void CMyDlg::Show_list1()                    //输出算符优先表
{
	int i,j;
	int Vtnum=Vt.GetLength();
	CString str;

	for(i=0;i<=Vtnum;i++)
	{
		m_list.InsertColumn(i,"i");
		m_list.SetColumnWidth(i,25);
	}

	m_list.InsertItem(0,"★");
	for(i=0;i<Vtnum;i++)
	{
		str=Vt[i];
		m_list.SetItemText(0,i+1,str);
	}
	for(i=0;i<Vtnum;i++)
	{
		str=Vt[i];
		m_list.InsertItem(i+1,"i");
		m_list.SetItemText(i+1,0,str);
	}
	for(i=0;i<Vtnum;i++)
		for(j=0;j<Vtnum;j++)
		{
			str=G[i][j];
			m_list.SetItemText(i+1,j+1,str);
		}

}

void CMyDlg::Show_list2(int col)                     //显示规约结果
{
	int i;
	int j;
	m_list2.DeleteAllItems();
	CString stri;
	output[0][3]="准备";
	if(FlagOk)
		output[col-1][3]="接受";
	else 
		output[col-1][3]="失败";
	if(output[col-1][4].Find("不存在关系")==-1)
		output[col-1][4]=" ";
	for(i=0;i<col;i++)
	{
		stri.Format("%d",i+1);
		m_list2.InsertItem(i,"0");
		m_list2.SetItemText(i,0,stri);
		for(j=0;j<6;j++)
		{
			m_list2.SetItemText(i,j+1,output[i][j+1]);
		}
	}

}

void CMyDlg::Show_list3()                     //输出FirstVt集
{
	int i,j;
	int Vtnum;
	int Vnnum;
	CString str;
	Vtnum=Vt.GetLength();
	Vnnum=Vn.GetLength();


	for(i=0;i<Vtnum;i++)
	{
		m_list3.InsertColumn(i,"0");
		m_list3.SetColumnWidth(i,25);
	}
	m_list3.InsertItem(0,"★");
	for(i=0;i<Vnnum-1;i++)
	{
		str=Vn[i+1];
		m_list3.InsertItem(i+1,str);
	}
	for(i=0;i<Vtnum;i++)
	{
		str=Vt[i];
		m_list3.SetItemText(0,i+1,str);
	}
	for(i=0;i<Vnnum-1;i++)
		for(j=0;j<Vtnum;j++)
		{
			str.Empty();
			if(F[i+1][j])
				str="√";
			m_list3.SetItemText(i+1,j+1,str);
		}
}

void CMyDlg::Show_list4()                //输出LastVt集
{
		int i,j;
	int Vtnum;
	int Vnnum;
	CString str;
	Vtnum=Vt.GetLength();
	Vnnum=Vn.GetLength();


	for(i=0;i<Vtnum;i++)
	{
		m_list4.InsertColumn(i,"0");
		m_list4.SetColumnWidth(i,25);
	}
	m_list4.InsertItem(0,"★");
	for(i=0;i<Vnnum-1;i++)
	{
		str=Vn[i+1];
		m_list4.InsertItem(i+1,str);
	}
	for(i=0;i<Vtnum;i++)
	{
		str=Vt[i];
		m_list4.SetItemText(0,i+1,str);
	}
	for(i=0;i<Vnnum-1;i++)
		for(j=0;j<Vtnum;j++)
		{
			str.Empty();
			if(L[i+1][j])
				str="√";
			m_list4.SetItemText(i+1,j+1,str);
		}
}

bool CMyDlg::Error(char left,char right,int output_i)        //出错处理程序
{
	CString Errstr;
	Errstr.Empty();
	Errstr+=left;
	Errstr+=" 与 ";
	Errstr+=right;
	Errstr+="不存在关系";
	MessageBox(Errstr,"出错啦~!",MB_ICONWARNING);
	output[output_i][4]=Errstr;
	return(false);
	
}

void CMyDlg::InitListControl()
{

	int i,j;

	m_list.DeleteAllItems();     //List1清空
	for(i=0;i<6;i++)
		for(j=0;j<=20;j++)
			m_list.DeleteColumn(j);

	m_list2.DeleteAllItems();    //List2清空

	m_list3.DeleteAllItems();    //List3清空
	for(i=0;i<6;i++)
		for(j=0;j<20;j++)
			m_list3.DeleteColumn(j);

	m_list4.DeleteAllItems();    //List4清空
	for(i=0;i<6;i++)
		for(j=0;j<20;j++)
			m_list4.DeleteColumn(j);
}

void CMyDlg::OnBianyi()                   //Main
{
	FlagOk=true;

	m_grammar.Empty();
	m_con_grammar.GetWindowText(m_grammar);
	m_sentence.Empty();
	m_con_sentence.GetWindowText(m_sentence);

	int i;
	int j;
	for(i=0;i<50;i++)
		for(j=0;j<6;j++)
			output[i][j]=" ";      //初始化output
    InitListControl();             //清空各项List列表

   	int Ptnum=InitPt();
	if(Ptnum!=-1)
	{
		SetFirstVt(Ptnum);
		Show_list3();
		SetLastVt(Ptnum);
		Show_list4();
		Create_G_table(Ptnum);
		Show_list1();
		i=Analyze(Ptnum);
		Show_list2(i);
	}	
	
}

void CMyDlg::OnInputDefault() 
{
	// TODO: Add your control notification handler code here
	m_grammar.Empty();
	CString str;
	str = "E->E+T|T\r\nT->T*F|F\r\nF->P^F|P\r\nP->(E)|i\r\n";
	m_con_grammar.SetWindowText(str);
	m_sentence.Empty();
	str.Empty();
	str = "i+i*(i+i)^i";
	m_con_sentence.SetWindowText(str);
//	GetDlgItem(IDC_LIST1)->ShowWindow(SW_HIDE);
//	GetDlgItem(IDC_LIST1)->ShowWindow(SW_SHOW);
}


BOOL CMyDlg::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	CAboutDlg e;
	if(pMsg->message == WM_KEYDOWN) 
	{ 
		CString strwParam; 
		strwParam.Format("%d ",pMsg->wParam); 
		if(pMsg->wParam=='G' && GetKeyState(VK_CONTROL)<0)
			if(e.DoModal()==IDOK)
     			exit(1);
			
				
			 
	} 
	return CDialog::PreTranslateMessage(pMsg);
}


void CMyDlg::OnCencel() 
{
	return;
	// TODO: Add your control notification handler code here
	
}

⌨️ 快捷键说明

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