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

📄 tonfaview.cpp

📁 正规(则)表达式转化为NFA
💻 CPP
📖 第 1 页 / 共 4 页
字号:
				if(table.tableList[j1].point.x==table.tableList[i1].point.x)
				{
					if(table.tableList[j1].point.y>table.tableList[i1].point.y)
						table.tableList[j1].point.y=table.tableList[j1].point.y+(table.tableList[i1].count-1)*2*SetDFAPos.LO;
				}
			}//下面的结点下移
			table.tableList[i1].point.y=table.tableList[i1].point.y+(table.tableList[i1].count-1)*SetDFAPos.LO;
			//自己居中
			/////////////////设置孩子位置x,y
			ListNode * p;
			p=table.tableList[i1].next;
			int i2=0;
			while(p!=NULL)
			{
			//for(int i2=0;i2<table.tableList[i1].count;i2++)
			//{
				if(table.tableList[p->data].point.x==SetDFAPos.LOx)
				{
				table.tableList[p->data].point.x=table.tableList[i1].point.x+4*SetDFAPos.LO;
				table.tableList[p->data].point.y=table.tableList[i1].point.y+i2*2*SetDFAPos.LO-(table.tableList[i1].count-1)*SetDFAPos.LO;
				}
				i2++;
				p=p->next;
			}
		}
	}
}

void CTONFAView::InitMINPosition(StateTable &table)
{
	for(int i=0;i<TABNUM;i++) 
	{
		table.tableList[i].point.x=SetMINPos.LOx;
		table.tableList[i].point.y=SetMINPos.LOy;
	}
	int tempmax=SetMINPos.LOy-2*SetMINPos.LO;
	if(table.tableList[0].count!=0)
	{
		ListNode * p;
		p=table.tableList[0].next;
		while(p!=NULL)
		{
	//	for(int i=0;i<table.tableList[0].count;i++)
	//	{
			for(int j=0;j<TABNUM;j++)
			{
				if(table.tableList[j].point.x==table.tableList[0].point.x+4*SetMINPos.LO)
					table.tableList[j].point.y=table.tableList[j].point.y-SetMINPos.LO;
			}
			for(int k=0;k<TABNUM;k++)
			{
				if(table.tableList[k].point.x==table.tableList[0].point.x+4*SetMINPos.LO)
				{
					if(table.tableList[k].point.y>tempmax)
						tempmax=table.tableList[k].point.y;
				}
			}
			table.tableList[p->data].point.x=table.tableList[0].point.x+4*SetMINPos.LO;
			table.tableList[p->data].point.y=tempmax+2*SetMINPos.LO;
			tempmax=-100;
			p=p->next;
		}
	}
	for(int i1=1;i1<TABNUM;i1++)
	{
		if(table.tableList[i1].count==1)
		{
			if(table.tableList[i1].next==NULL)
				continue;
			if(table.tableList[table.tableList[i1].next->data].point.x==SetMINPos.LOx)
			{
			table.tableList[table.tableList[i1].next->data].point.x=table.tableList[i1].point.x+4*SetMINPos.LO;
			table.tableList[table.tableList[i1].next->data].point.y=table.tableList[i1].point.y;
			}
		}
		if(table.tableList[i1].count>1)
		{
			for(int j1=0;j1<TABNUM;j1++)
			{
				if(table.tableList[j1].point.x==table.tableList[i1].point.x)
				{
					if(table.tableList[j1].point.y>table.tableList[i1].point.y)
						table.tableList[j1].point.y=table.tableList[j1].point.y+(table.tableList[i1].count-1)*2*SetMINPos.LO;
				}
			}//下面的结点下移
			table.tableList[i1].point.y=table.tableList[i1].point.y+(table.tableList[i1].count-1)*SetMINPos.LO;
			//自己居中
			/////////////////设置孩子位置x,y
			ListNode * p;
			p=table.tableList[i1].next;
			int i2=0;
			while(p!=NULL)
			{
			//for(int i2=0;i2<table.tableList[i1].count;i2++)
			//{
				if(table.tableList[p->data].point.x==SetMINPos.LOx)
				{
				table.tableList[p->data].point.x=table.tableList[i1].point.x+4*SetMINPos.LO;
				table.tableList[p->data].point.y=table.tableList[i1].point.y+i2*2*SetMINPos.LO-(table.tableList[i1].count-1)*SetMINPos.LO;
				}
				i2++;
				p=p->next;
			}
		}
	}
}


void CTONFAView::DrawNFA(CDC* pDC)
{	
	CRect rc;
	GetClientRect(rc);
	CPoint MyScroll=GetScrollPosition();
	CRect rc1(MyScroll.x,MyScroll.y,rc.right+MyScroll.x,rc.bottom+MyScroll.y);
	//CRect rc(0,0,10000,10000);
	COLORREF	crBackGroundColor=RGB(255,255,255);
	//pDC->FillSolidRect(rc, crBackGroundColor);
	if(flag==0)
		pDC->FillSolidRect(rc1, crBackGroundColor);
	CTONFADoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	CBrush stockbrush;
	CBrush colorbrush;
	CBrush Tbrush;//终态结点
	CBrush Dirbrush;//方向点
	CPen redpen;
	CPen colorpen;
	CPen quanpen;
	CPen zihuanpen;
	stockbrush.CreateStockObject(5);
	colorbrush.CreateSolidBrush(RGB(80,166,37));
	Tbrush.CreateSolidBrush(RGB(236,135,14));
	Dirbrush.CreateSolidBrush(RGB(130,115,176));


	colorpen.CreatePen(PS_SOLID,1,RGB(54,54,54));
	redpen.CreatePen(PS_SOLID,1,RGB(223,53,57));//bezier

	quanpen.CreatePen(PS_SOLID,1,RGB(54,54,54));
	zihuanpen.CreatePen(PS_SOLID,1,RGB(54,54,54));

	CPoint PO[4];


	//InitPosition();
	//终结点
	//CString ST;
	//ST.Format("%d",pDoc->T);

	//画线
	int LO=SetNFAPos.LO;
	pDC->SelectObject(&stockbrush);
	pDC->SetBkMode(TRANSPARENT);

	pDC->SetTextColor(RGB(24,71,133));
	pDC->TextOut(SetNFAPos.LOx,SetNFAPos.LOy-20,"NFA状态图");
	//StateTable NFATable;GetDocument()->NFATable;

	for(int i2=0;i2<=SetNFAPos.num;i2++)
	{
		ListNode * p;		
		p=GetDocument()->NFATable.tableList[i2].next;
		while(p!=NULL)
		{
		//判断直接后趋的结点的状态值
			if(i2<p->data) //大 画直线
			{
				pDC->SelectObject(&colorpen);
				pDC->MoveTo(GetDocument()->NFATable.tableList[i2].point.x+LO/2,GetDocument()->NFATable.tableList[i2].point.y+LO/2);
				pDC->LineTo(GetDocument()->NFATable.tableList[p->data].point.x+LO/2,GetDocument()->NFATable.tableList[p->data].point.y+LO/2);
				//画箭头
				float k;//斜率
		        float af=0.5;//角度
				double x1,y1,x2,y2,x3,y3,x4,y4,r;
				r=SetNFAPos.LO/2;
				x2=GetDocument()->NFATable.tableList[i2].point.x+LO/2;
				y2=GetDocument()->NFATable.tableList[i2].point.y+LO/2;
				x1=GetDocument()->NFATable.tableList[p->data].point.x+LO/2;
				y1=GetDocument()->NFATable.tableList[p->data].point.y+LO/2;
                 
				k=(y2-y1)/(x2-x1);
				//k=(float)((y2-y1)/(x2-x1));
	
				x3=x1-x2+0.0001;
				y3=y1-y2;
				k=y3/x3;
				x4=x1-sqrt(pow(r,2)/(1+pow(k,2)));
				y4=y1+k*(x4-x1);

				pDC->SelectObject(&Dirbrush);
				pDC->Ellipse(x4-SetNFAPos.LO/6,y4-SetNFAPos.LO/6,x4+SetNFAPos.LO/6,y4+SetNFAPos.LO/6);

					//---------------------------
				pDC->SetTextColor(RGB(0,0,0));
				pDC->TextOut((GetDocument()->NFATable.tableList[i2].point.x+LO/2+GetDocument()->NFATable.tableList[p->data].point.x+LO/2)/2,(GetDocument()->NFATable.tableList[i2].point.y+LO/2+GetDocument()->NFATable.tableList[p->data].point.y+LO/2)/2-15,p->token);
			}
			if(i2==p->data) //等于 画回路到自己
			{

				pDC->SelectObject(&stockbrush);
				pDC->Ellipse(GetDocument()->NFATable.tableList[i2].point.x+LO/6,GetDocument()->NFATable.tableList[i2].point.y-LO+LO/3+LO/6,GetDocument()->NFATable.tableList[i2].point.x+5*LO/6,GetDocument()->NFATable.tableList[i2].point.y+LO/6);
				pDC->SetTextColor(RGB(241,147,115));
				pDC->TextOut((GetDocument()->NFATable.tableList[i2].point.x+LO/6+GetDocument()->NFATable.tableList[i2].point.x+5*LO/6)/2,GetDocument()->NFATable.tableList[i2].point.y-LO+5,p->token);
			}
			if(i2>p->data) //小于 画弧线
			{
				pDC->SelectObject(&redpen);
				PO[0]=CPoint(GetDocument()->NFATable.tableList[p->data].point.x+LO/2,GetDocument()->NFATable.tableList[p->data].point.y+LO/2);
				PO[3]=CPoint(GetDocument()->NFATable.tableList[i2].point.x+LO/2,GetDocument()->NFATable.tableList[i2].point.y+LO/2);
			//	PO[2]=CPoint((PO[0].x+PO[3].x)/2+abs(PO[0].y-PO[3].y)/1.5,(PO[0].y+PO[3].y)/2-abs(PO[0].x-PO[3].x)/6);
				PO[2]=CPoint((PO[0].x+PO[3].x)/2+abs(PO[0].y+PO[3].y)/1.5,(PO[0].y+PO[3].y)/2+abs(PO[0].x+PO[3].x)/8);
				PO[1]=PO[2];//CPoint(((p[0].x+p[3].x)*1)/2+10,((p[0].y+p[3].y)*1)/2-50);					
				pDC->PolyBezier(PO,4);

					//画箭头
				float k;//斜率
		        float af=0.5;//角度
				double x1,y1,x2,y2,x3,y3,x4,y4,r;

				r=SetNFAPos.LO/2;
				x2=PO[1].x;
				y2=PO[1].y;
				x1=PO[0].x;
				y1=PO[0].y;
                   
				k=(y2-y1)/(x2-x1);
	
				x3=x1-x2+0.0001;
				y3=y1-y2;
				k=y3/x3;
				x4=x1+sqrt(pow(r,2)/(1+pow(k,2)));
				y4=y1+k*(x4-x1);

				pDC->SelectObject(&Dirbrush);
				pDC->Ellipse(x4-SetNFAPos.LO/6,y4-SetNFAPos.LO/6,x4+SetNFAPos.LO/6,y4+SetNFAPos.LO/6);

					//---------------------------
				pDC->SetTextColor(RGB(54,54,54));
				pDC->TextOut(PO[1].x,PO[1].y,p->token);
			}
			p=p->next;
		}
	}	

	//画结点
	pDC->SelectObject(&colorbrush);
	for(int i=0;i<=SetNFAPos.num;i++)
	{
		if(GetDocument()->NFATable.tableList[i].next!=NULL)
		{
			pDC->SelectObject(&colorbrush);
			pDC->Ellipse(GetDocument()->NFATable.tableList[i].point.x,GetDocument()->NFATable.tableList[i].point.y,GetDocument()->NFATable.tableList[i].point.x+SetNFAPos.LO,GetDocument()->NFATable.tableList[i].point.y+SetNFAPos.LO);
		}
		else //终结点
		{
			pDC->SelectObject(&Tbrush);
			pDC->Ellipse(GetDocument()->NFATable.tableList[i].point.x,GetDocument()->NFATable.tableList[i].point.y,GetDocument()->NFATable.tableList[i].point.x+SetNFAPos.LO,GetDocument()->NFATable.tableList[i].point.y+SetNFAPos.LO);
			pDC->Ellipse(GetDocument()->NFATable.tableList[i].point.x+SetNFAPos.LO/10,GetDocument()->NFATable.tableList[i].point.y+SetNFAPos.LO/10,GetDocument()->NFATable.tableList[i].point.x+SetNFAPos.LO-SetNFAPos.LO/10,GetDocument()->NFATable.tableList[i].point.y+SetNFAPos.LO-SetNFAPos.LO/10);
		}
		//输出数字
		CString CtrNum;
		CtrNum.Format("%d",i);
		int m_length=CtrNum.GetLength();
		pDC->SetTextColor(RGB(255,255,0));
		pDC->TextOut(GetDocument()->NFATable.tableList[i].point.x-3+(SetNFAPos.LO/1.7)-m_length*4,GetDocument()->NFATable.tableList[i].point.y-10+(SetNFAPos.LO/2),CtrNum);
	}
	//区域
//	
	pDC->BeginPath();
//	CClientDC dc(this);
//	CPoint MyPoint=MyScroll;
//	pDC->DPtoLP(&MyPoint);
	for(i=0;i<=SetNFAPos.num;i++)
	{
	pDC->Ellipse(GetDocument()->NFATable.tableList[i].point.x-MyScroll.x,GetDocument()->NFATable.tableList[i].point.y-MyScroll.y,GetDocument()->NFATable.tableList[i].point.x-MyScroll.x+SetNFAPos.LO,GetDocument()->NFATable.tableList[i].point.y-MyScroll.y+SetNFAPos.LO);
	//pDC->Ellipse(GetDocument()->NFATable.tableList[i].point.x-MyPoint.x,GetDocument()->NFATable.tableList[i].point.y-MyPoint.y,GetDocument()->NFATable.tableList[i].point.x+MyPoint.x+SetNFAPos.LO,GetDocument()->NFATable.tableList[i].point.y+MyPoint.y+SetNFAPos.LO);
	}
	pDC->EndPath();
	CRgn trgn;
	trgn.CreateFromPath(pDC);//	(&dc);
	m_NFA.CopyRgn(&trgn);
	trgn.DeleteObject();
//
	stockbrush.DeleteObject();
	colorbrush.DeleteObject();
	Tbrush.DeleteObject();
	Dirbrush.DeleteObject();
	colorpen.DeleteObject();
	redpen.DeleteObject();//bezier
	quanpen.DeleteObject();
	zihuanpen.DeleteObject();
}

void CTONFAView::DrawTABLE(CDC* pDC)
{
	CRect rc;
	GetClientRect(rc);
	CPoint MyScroll=GetScrollPosition();
	CRect rc1(MyScroll.x,MyScroll.y,rc.right+MyScroll.x,rc.bottom+MyScroll.y);
	//COLORREF	crBackGroundColor=RGB(255,255,255);
	//if(flag==1)
		//pDC->FillSolidRect(rc1, crBackGroundColor);
	CBrush brush(RGB(200,225,190));
	pDC->SelectObject(&brush);
	pDC->SetBkMode(TRANSPARENT);
	pDC->SetTextColor(RGB(24,71,133));
	pDC->TextOut(DFA_TABLE_LEFT,DFA_TABLE_TOP-20,"NFA->DFA转换表");
	pDC->SetTextColor(RGB(182,41,43));
	//-----------------------------画出NFA->DFA转换表
	pDC->Rectangle(DFA_TABLE_LEFT,DFA_TABLE_TOP,DFA_TABLE_LEFT+DFA_TABLE_WIDTH*(GetDocument()->letternum+1),DFA_TABLE_TOP+DFA_TABLE_HEIGHT);
	pDC->MoveTo(DFA_TABLE_LEFT,DFA_TABLE_TOP);
	pDC->LineTo(DFA_TABLE_LEFT+DFA_TABLE_WIDTH,DFA_TABLE_TOP+DFA_TABLE_HEIGHT);
	pDC->TextOut(DFA_TABLE_LEFT+100,DFA_TABLE_TOP+2,"字符");
	pDC->TextOut(DFA_TABLE_LEFT+2,DFA_TABLE_TOP+13,"状态集");

	for(int i=0;i<GetDocument()->letternum;i++)
	{
		pDC->MoveTo(DFA_TABLE_LEFT+(i+1)*DFA_TABLE_WIDTH,DFA_TABLE_TOP);
		pDC->LineTo(DFA_TABLE_LEFT+(i+1)*DFA_TABLE_WIDTH,DFA_TABLE_TOP+DFA_TABLE_HEIGHT);
		pDC->TextOut(DFA_TABLE_LEFT+DFA_TABLE_WIDTH*(i+1)+40+DFA_TABLE_HEIGHT,DFA_TABLE_TOP+10,CString(GetDocument()->character[i]));
	}
    
	pDC->SetTextColor(RGB(150,100,50));
	for(i=0;i<=SetDFAPos.num;i++)
	{
		//画区域
		pDC->Rectangle(DFA_TABLE_LEFT,DFA_TABLE_TOP+DFA_TABLE_HEIGHT*(i+1),DFA_TABLE_LEFT+DFA_TABLE_WIDTH*(GetDocument()->letternum+1),DFA_TABLE_TOP+DFA_TABLE_HEIGHT*(i+2));
		pDC->TextOut(DFA_TABLE_LEFT+5,DFA_TABLE_TOP+DFA_TABLE_HEIGHT*(i+1)+5,GetDocument()->ListStr(i));
		ListNode * p;
		int j=0;
		p=GetDocument()->DFATable.tableList[i].next;
		//for(int j=0;j<GetDocument()->letternum;j++)
		while(p!=NULL)
		{
			pDC->MoveTo(DFA_TABLE_LEFT+DFA_TABLE_WIDTH*(j+1),DFA_TABLE_TOP+DFA_TABLE_HEIGHT*(i+1));
			pDC->LineTo(DFA_TABLE_LEFT+DFA_TABLE_WIDTH*(j+1),DFA_TABLE_TOP+DFA_TABLE_HEIGHT*(i+2));
			//if(p->data!='$')
			if(p->data!=-1)
				pDC->TextOut(DFA_TABLE_LEFT+DFA_TABLE_WIDTH*(j+1)+5,DFA_TABLE_TOP+DFA_TABLE_HEIGHT*(i+1)+5,GetDocument()->ListStr(p->data));
			j++;
			p=p->next;
		}
	}



	pDC->BeginPath();
	pDC->Rectangle(DFA_TABLE_LEFT-MyScroll.x,DFA_TABLE_TOP-MyScroll.y,DFA_TABLE_LEFT+DFA_TABLE_WIDTH*(GetDocument()->letternum+1)-MyScroll.x,DFA_TABLE_TOP+DFA_TABLE_HEIGHT*(SetDFAPos.num+1)-MyScroll.y);
	pDC->EndPath();
	CRgn trgn;
	trgn.CreateFromPath(pDC);
	m_TABLE.CopyRgn(&trgn);
	trgn.DeleteObject();
	brush.DeleteObject();
}

void CTONFAView::DrawDFA(CDC* pDC)
{
	CPoint MyScroll=GetScrollPosition();
	CTONFADoc* pDoc = GetDocument();

	ASSERT_VALID(pDoc);
	CBrush stockbrush;
	CBrush colorbrush;//圆圈内色
	CBrush Tbrush;//终态结点
	CBrush Dirbrush;//方向点
	CPen redpen;//弧线
	CPen colorpen;//字母集符号
	CPen quanpen;

⌨️ 快捷键说明

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