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

📄 ll1_parsingdlg.cpp

📁 LL(1)文法分析过程的可视化及教学应用研究
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	m_pro.DeleteAllItems();
	while(m_pro.DeleteColumn(0));
	GetDlgItem(IDC_EDIT6)->EnableWindow(0);
	lx=-1;
	ly=-2;
	s_c=0;

if(m_G!="")
{	
	memcpy(exp,m_G,m_G.GetLength());

	gram.initial();
	
	gram.save_grammar(exp);

	if(gram.tag[1]==1)
	    m_tag="文法格式不合法!\r\n";
	else if(gram.tag[2]==1)
		m_tag="文法右部中含有字符'#'!\r\n";
	else if(gram.tag[3]==1)
		m_tag="右部含有错误非终结符!\r\n";
	else if(gram.tag[5]==1)
		m_tag="有select集为空的规则!\r\n";
	else
	{

		dlgc.m_change=gram.change();

		GetDlgItem(IDC_BUTTON9)->EnableWindow(1);

		for(k=0;k<gram.fw;k++)
		{
			sign=0;
			for(i=0;i<gram.n;i++)
			{
				if(gram.G[i][0].letter==gram.follow[k][0])
				{
					if(sign==0)
					{
						sign=1;
						m_grammar+=gram.follow[k][0];
						m_grammar+="->";
					}

					for(j=1;j<=gram.G[i][0].tag;j++)
						m_grammar+=gram.G[i][j].letter;
					m_grammar+='|';

				}
			}
			m_grammar=m_grammar.Left(m_grammar.GetLength()-1);
			m_grammar+="\r\n";
		}


		((CEdit*)GetDlgItem(IDC_EDIT5))->SetReadOnly(1);
		GetDlgItem(IDC_BUTTON8)->EnableWindow(0);
		GetDlgItem(IDC_BUTTON5)->EnableWindow(0);
	}
	UpdateData(0);	
}
}




void Cll1_parsingDlg::OnButton7() 
{

	CString exp,tt;

    int i=0,j=0,sign=0,pos=0;
	int x=-1,y=-1,li;
    
	CSize s(0,30);
	CSize si;

	UpdateData(1);

	if(s_c==0)
	{
    	s_top1=0;
	    s_top2=0;
	    s_c=0;
	    s_error=0;

	    for(i=0;i<L_STR;i++)
		    s_t[i]=0;
	    for(i=0;i<LEN;i++)
		{
		    s_exp1[i]=0;
		    s_exp2[i]=0;	
		}
	
        if(m_exp!="")
		{
	    strcpy(s_t,m_exp);
	    for(j=1,i=m_exp.GetLength()-1;i>=0;i--,j++)
		    s_exp1[j]=s_t[i];
        s_exp1[0]='#';
	    s_top1=j-1;

        s_exp2[0]='#';
	    s_exp2[1]=gram.begin_ch;
    
	    s_top2=1;
 
        m_pro.DeleteAllItems();
	    while(m_pro.DeleteColumn(0));

	    m_pro.InsertColumn(1,"步骤",LVCFMT_CENTER,40,-1);                           
        m_pro.InsertColumn(2,"分析栈",LVCFMT_LEFT,145,-1);
	    m_pro.InsertColumn(3,"剩余输入串",LVCFMT_RIGHT,145,-1);
        m_pro.InsertColumn(4,"推导所用产生式或匹配",LVCFMT_CENTER,140,-1);
		}

	}

	if(s_top1>=0 || s_top2>=0)
	{


	
		tt=m_list.GetItemText(lx,ly+1);
		if(tt!="")
		{
			tt=tt.Right(tt.GetLength()-1);
			m_list.SetItemText(lx,ly+1,tt);
			lx=-1;
			ly=-2;
		}

		s_c++;
        tt.Format("%d",s_c);
	    pos=m_pro.InsertItem(m_pro.GetItemCount(),tt);
        tt="";
		
		for(i=0;i<=s_top2;i++)
			tt+=s_exp2[i];
        m_pro.SetItemText(pos,1,tt);

		tt="";
		
		for(i=s_top1;i>=0;i--)
			tt+=s_exp1[i];
        m_pro.SetItemText(pos,2,tt);
		
		tt="";

		if(s_top1<0 ||s_top2<0)
		{
		    exp="匹配出错";
			s_error=1;
		}
		else if(gram.vt[s_exp2[s_top2]]!=0)
		{
			if(s_exp2[s_top2]==s_exp1[s_top1])
			{
			    exp="\'";
				exp+=s_exp2[s_top2];
				exp+="\'";
				exp+="匹配";
				s_top1--;
			    s_top2--;
				if(s_top1<0&&s_top2<0)
				{
					exp="接受";
				
					GetDlgItem(IDC_BUTTON7)->EnableWindow(0);
				}
			}
			else
			{
				exp="匹配出错";
				s_error=1;
			}
		}

		else
		{
			si.cx=-10000;
			si.cy=-10000;
			m_list.Scroll(si);

			for(li=0;li<256;li++)
			{
				if(gram.vn[li]==2)x++;
				    if(li==s_exp2[s_top2])
						break;
			}
			for(li=0;li<256;li++)
			{
				if(gram.vt[li]==2)y++;
					if(li==s_exp1[s_top1])
						break;
			}

			tt.Format("%c",7);
			tt+=m_list.GetItemText(x,y+1);
            m_list.SetItemText(x,y+1,tt);
			lx=x;
			ly=y;

			
			si.cx=(ly-3)*55;
			si.cy=(lx-3)*30;
			m_list.Scroll(si);

			sign=0;
			for(i=0;i<gram.n;i++)
			{
				if(gram.select[i][0]==s_exp2[s_top2])
					for(j=1;j<=gram.count_select[i];j++)
						if(gram.select[i][j]==s_exp1[s_top1])
						{
							sign=1;
							break;
						}

				if(sign==1)break;
			}

			if(sign==1)
			{
//================================================				
				s_top2--;
				for(j=gram.G[i][0].tag;j>=1;j--)
				{
					if(gram.G[i][j].letter!='@')
					    s_exp2[++s_top2]=gram.G[i][j].letter;
				}

				exp=gram.G[i][0].letter;
				exp+="->";
				for(j=1;j<=gram.G[i][0].tag;j++)
					exp+=gram.G[i][j].letter;
			}
			else
			{
				exp="匹配出错";
				s_error=1;
			}
		}

        m_pro.SetItemText(pos,3,exp);

		if(s_error==1)
		{
			GetDlgItem(IDC_BUTTON7)->EnableWindow(0);
		}

	}
	if(s_c>=15)
	m_pro.Scroll(s);

	UpdateData(0);
}

void Cll1_parsingDlg::OnChangeEdit6() 
{

	CString tt=m_list.GetItemText(lx,ly+1);

	if(tt!="")
	{
		tt=tt.Right(tt.GetLength()-1);
		m_list.SetItemText(lx,ly+1,tt);
	
		lx=-1;
		ly=-2;
	}

	s_c=0;
	GetDlgItem(IDC_BUTTON7)->EnableWindow(1);
	m_pro.DeleteAllItems();
	while(m_pro.DeleteColumn(0));
	
}


void Cll1_parsingDlg::OnChangeEdit1()
{
	gram.initial();

	UpdateData(1);
	GetDlgItem(IDC_BUTTON5)->EnableWindow(0);
	dlg.m_first="";
	dlg.m_follow="";
	dlg.m_select="";
	dlgc.m_change="";
	m_exp="";
	m_process="";
    m_grammar="";
	m_tag="";
	m_list.DeleteAllItems();
	while(m_list.DeleteColumn(0));
	m_pro.DeleteAllItems();
	while(m_pro.DeleteColumn(0));

//	((CEdit*)GetDlgItem(IDC_EDIT5))->SetReadOnly(1);

	GetDlgItem(IDC_EDIT6)->EnableWindow(0);
	GetDlgItem(IDC_BUTTON3)->EnableWindow(0);
	GetDlgItem(IDC_BUTTON7)->EnableWindow(0);
	GetDlgItem(IDC_BUTTON8)->EnableWindow(0);
	GetDlgItem(IDC_BUTTON9)->EnableWindow(0);

	UpdateData(0);

} 

void Cll1_parsingDlg::OnButton8() 
{

    UpdateData(1);
	CString str,ss;
	char exp[L_STR]={0};

    int k,j,i,s,t,c,pos;
	
	if(m_G!="")
	{
	    memcpy(exp,m_G,m_G.GetLength());

	    gram.initial();
	    gram.save_grammar(exp);
 	
		for(i=0;i<DEN;i++)
		{
			ss=gram.creat_s();
			if(ss==""||ss.GetLength()>100)
			{
				i--;
				continue;
			}
			rexp[i]=ss;
		}
	}

	for(i=0;i<L_STR;i++)
		exp[i]=0;


	if(m_grammar!="")
	{
		memcpy(exp,m_grammar,m_grammar.GetLength());

	    gram.initial();
	
	    gram.save_grammar(exp);
		
	    gram.get_first();
	    gram.get_follow();
	    gram.get_select();

	    dlg.m_follow="";
	    dlg.m_select="";
	    dlg.m_first="";
	    m_tag="";
	    m_list.DeleteAllItems();
	    while(m_list.DeleteColumn(0));
	    m_pro.DeleteAllItems();
	    while(m_pro.DeleteColumn(0));
	
	    if(gram.tag[1]==1)
	        m_tag="文法格式不合法!\r\n";
	    else if(gram.tag[2]==1)
		    m_tag="文法右部中含有字符'#'!\r\n";
		else if(gram.tag[3]==1)
			m_tag="右部含有错误非终结符!\r\n";
		else if(gram.tag[5]==1)
		    m_tag="有select集为空的规则!\r\n";
		else
		{

			GetDlgItem(IDC_BUTTON5)->EnableWindow(1);
    
			for(k=0;k<gram.fw;k++)
			{
				dlg.m_follow+="follow(";
				dlg.m_follow+=gram.follow[k][0];
				dlg.m_follow+=") = { ";

				for(j=1;j<=gram.count_follow[k];j++)
				{
					dlg.m_follow+=gram.follow[k][j];
					if(j!=gram.count_follow[k])
					dlg.m_follow+=',';
				}
				dlg.m_follow+=" }\r\n";
			}

			for(k=0;k<gram.n;k++)
			{
				dlg.m_first+="first(";
				dlg.m_first+=gram.first[k][0];
				dlg.m_first+="->";

				for(j=1;j<=gram.G[k][0].tag;j++)
					dlg.m_first+=gram.G[k][j].letter;
				dlg.m_first+=") = { ";
		
				for(j=1;j<=gram.count_first[k];j++)
				{
					dlg.m_first+=gram.first[k][j];
					if(j!=gram.count_first[k])
						dlg.m_first+=',';
				}
				dlg.m_first+=" }\r\n";
			}


			for(k=0;k<gram.n;k++)
			{
				dlg.m_select+="select(";
				dlg.m_select+=gram.select[k][0];
				dlg.m_select+="->";

				for(j=1;j<=gram.G[k][0].tag;j++)
					dlg.m_select+=gram.G[k][j].letter;
				dlg.m_select+=") = { ";
		
				for(j=1;j<=gram.count_select[k];j++)
				{
					dlg.m_select+=gram.select[k][j];
					if(j!=gram.count_select[k])
					dlg.m_select+=',';
				}
				dlg.m_select+=" }\r\n";
			}
  
			if(gram.tag[0]==1)
				m_tag="文法不是LL(1)文法!\r\n";
			else
			{
				m_tag="文法是LL(1)文法!\r\n";
				m_list.InsertColumn(0,"VN",LVCFMT_CENTER,30,-1);
				k=1;
	
				for(j=0;j<256;j++)
				{
					if(gram.vt[j]==2)
					{
						m_list.InsertColumn(k,(char*)&j,LVCFMT_CENTER,55,-1);
						k++;
					}
				}

				for(j=0;j<256;j++)
				{
					if(gram.vn[j]==2)
					{
						pos=m_list.InsertItem(m_list.GetItemCount(),(char*)&j);

						for(i=0;i<gram.n;i++)
						{
				
							if(gram.select[i][0]==(char)j)
							{
								k=0;
								for(s=0;s<256;s++)
									if(gram.vt[s]==2)
									{
										for(t=1;t<=gram.count_select[i];t++)
										{
											if(gram.select[i][t]==(char)s)
											{
												str=gram.G[i][0].letter;
												str+="->";
												for(c=1;c<=gram.G[i][0].tag;c++)
													str+=gram.G[i][c].letter;
											}
										}
										k++;
										if(str!="")
										{
											m_list.SetItemText(pos,k,str);
											str="";
										}
									}
							}
						}
					}
				}
			}

		}

	if(gram.tag[1]==1||gram.tag[2]==1||gram.tag[3]==1)
		GetDlgItem(IDC_BUTTON5)->EnableWindow(0);



//----------------------------------------------------



if(gram.tag[0]==0&&gram.tag[1]==0&&gram.tag[2]==0&&gram.tag[3]==0&&gram.tag[5]==0)
{
	char t[L_STR]={0},exp1[LEN]={0},exp2[LEN]={0};
    int top1=0,top2=0,c=0,error=0,sign=0;
	char r[DEN]={0};
	CString tt;
	
	for(c=0;c<DEN;c++)
	{
		strcpy(t,rexp[c]);
		for(j=1,i=rexp[c].GetLength()-1;i>=0;i--,j++)
			exp1[j]=t[i];
		exp1[0]='#';
		top1=j-1;

		exp2[0]='#';
		exp2[1]=gram.begin_ch;
    
		top2=1;
 

		if(c==0)
		{
		    m_pro.DeleteAllItems();
		    while(m_pro.DeleteColumn(0));
			m_pro.InsertColumn(1,"序号",LVCFMT_CENTER,50,-1);  
			m_pro.InsertColumn(2,"测试字符串",LVCFMT_CENTER,330,-1);                           
			m_pro.InsertColumn(3,"测试结果",LVCFMT_CENTER,70,-1);
		}

		tt.Format("%d",c+1);
		pos=m_pro.InsertItem(m_pro.GetItemCount(),tt);
		tt="";	
 		m_pro.SetItemText(pos,1,rexp[c]);

		error=0;

		while(top1>=0 || top2>=0)
		{
			if(top1<0 ||top2<0)
			{
				error=1;
			}

			else if(gram.vt[exp2[top2]]!=0)
			{			
				if(exp2[top2]==exp1[top1])
				{

					top1--;
				    top2--;
					if(top1<0&&top2<0)
					{
						r[c]='1';
						break;
					}
				}
				else
				{
					error=1;
				}
			}

			else
			{
				sign=0;
				for(i=0;i<gram.n;i++)
				{
					if(gram.select[i][0]==exp2[top2])
						for(j=1;j<=gram.count_select[i];j++)
							if(gram.select[i][j]==exp1[top1])
							{
								sign=1;
								break;
							}
		
					if(sign==1)break;
				}

				if(sign==1)
				{
					
					top2--;
					for(j=gram.G[i][0].tag;j>=1;j--)
					{						
						if(gram.G[i][j].letter!='@')
						    exp2[++top2]=gram.G[i][j].letter;
					}
				}
				else
				{							
					error=1;
				}
			}

			if(error==1)
			{
				r[c]='0';
				break;
			}
		}

		if(r[c]=='1')
			m_pro.SetItemText(pos,2,"接受");
		else
			m_pro.SetItemText(pos,2,"不接受");

	}

	for(c=0;c<DEN;c++)
		if(r[c]!='1')
			break;
	
	if(c>=DEN)
		m_tag="文法转换正确!";
	else
		m_tag="文法转换错误!";
}
	}

	GetDlgItem(IDC_EDIT6)->EnableWindow(0);
	GetDlgItem(IDC_BUTTON3)->EnableWindow(0);
	GetDlgItem(IDC_BUTTON7)->EnableWindow(0);

	UpdateData(0);


}


void Cll1_parsingDlg::OnButton9() 
{

	dlgc.DoModal();


}



void Cll1_parsingDlg::OnClickList2(NMHDR* pNMHDR, LRESULT* pResult) 
{

	UpdateData(1);

	CString exp1,exp2,tt;
	char c1,c2,ct[2]={0};
	int li,x,y;

	CSize si;
		
	int p=m_pro.GetSelectionMark();

	exp1=m_pro.GetItemText(p,2);
	exp2=m_pro.GetItemText(p,1);
    memcpy(ct,exp1.Left(1),1);
	c1=ct[0];
    memcpy(ct,exp2.Right(1),1);
	c2=ct[0];

	tt=m_list.GetItemText(lx,ly+1);

	if(tt!="")
	{
		tt=tt.Right(tt.GetLength()-1);
		m_list.SetItemText(lx,ly+1,tt);
	
		lx=-1;
		ly=-2;
	}

    if(gram.vn[c2]==2&&gram.vt[c1]==2)
	{

		si.cx=-10000;
		si.cy=-10000;

		m_list.Scroll(si);
		x=-1;
		y=-1;
		for(li=0;li<256;li++)
		{
			if(gram.vn[li]==2)x++;
				if(li==c2)
					break;
		}

		for(li=0;li<256;li++)
		{
			if(gram.vt[li]==2)y++;
				if(li==c1)
					break;
		}

		tt.Format("%c",7);
		tt+=m_list.GetItemText(x,y+1);
		m_list.SetItemText(x,y+1,tt);
		lx=x;
		ly=y;
		

		si.cx=(ly-3)*55;
		si.cy=(lx-3)*30;
		m_list.Scroll(si);
	}

	*pResult = 0;

	UpdateData(0);
}

⌨️ 快捷键说明

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