亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? winsuanfudoc.cpp

?? 算符優先文法分析器的例子
?? CPP
字號:
// WinsuanfuDoc.cpp : implementation of the CWinsuanfuDoc class
//

#include "stdafx.h"
#include "Winsuanfu.h"

#include "WinsuanfuDoc.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CWinsuanfuDoc

IMPLEMENT_DYNCREATE(CWinsuanfuDoc, CDocument)

BEGIN_MESSAGE_MAP(CWinsuanfuDoc, CDocument)
	//{{AFX_MSG_MAP(CWinsuanfuDoc)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWinsuanfuDoc construction/destruction

charstack s;

CWinsuanfuDoc::CWinsuanfuDoc()
{
	ClearDoc();
}

void CWinsuanfuDoc::ClearDoc()
{
	int i,j;

	memset(buffer, 0, sizeof(buffer));
	pnum = 0;
	Vn.Empty();
	Vt.Empty();
	Start.Empty();

	for(i=0; i<100; i++)	
		for(j=0; j<100; j++)
		{
			F[i][j]=false;
			L[i][j]=false;
			table[i][j]=0;
		}	

	for(i=0; i<100; i++)
	{
		p6[i].pleft=0;
		p6[i].pright.Empty();
	}
}

CWinsuanfuDoc::~CWinsuanfuDoc()
{
}

BOOL CWinsuanfuDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CWinsuanfuDoc serialization

void CWinsuanfuDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
}

/////////////////////////////////////////////////////////////////////////////
// CWinsuanfuDoc diagnostics

#ifdef _DEBUG
void CWinsuanfuDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CWinsuanfuDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CWinsuanfuDoc commands
void CWinsuanfuDoc::fill_VnVtStart()
{
	Start += p6[0].pright[1];

	for(int i=0; i<pnum; i++)
	{
		if(Vn.Find(p6[i].pleft) == -1)
			Vn+=p6[i].pleft;
		for(int j=0; j<p6[i].pright.GetLength(); j++)
		{
			if(isupper(p6[i].pright[j]))
			{
				if(Vn.Find(p6[i].pright[j]) == -1)
					Vn+=p6[i].pright[j];
			}else
				if(Vt.Find(p6[i].pright[j]) == -1)
					Vt+=p6[i].pright[j];
		}
	}
}


int CWinsuanfuDoc::ConvertP(CString str)
{	
	int i=0;
	int retpos=0;
	int orpos=0;
	int arrowpos=0;
	CString s,temps1,temps2;

	if(str.Find('#') == -1)
	{
		str.TrimLeft();
		if(!isupper(str[0])) return -1;

		temps1.Empty();
		temps1+="$->#";
		temps1+=str[0];
		temps1+="#\r\n";
		
		str.Insert(0,temps1);				
		temps1.Empty();
	}

	s+=str;
	s+="\r\n";

	retpos = s.Find("\r\n");
	while(retpos!=-1) 
	{
		temps1=s.Left(retpos);
		
		s.Delete(0, retpos+2);
		retpos = s.Find("\r\n");

		if(temps1.IsEmpty()) continue;
	
		temps1.TrimLeft();
		arrowpos=temps1.Find("->");
		if(temps1.Left(arrowpos).GetLength()!=1)
		{
			MessageBox(NULL,"非上下文無關文法!","CWinsuanfuDoc::ConvertP",MB_ICONEXCLAMATION);
			return -1;
		}
		
		char pleft=temps1.Left(arrowpos)[0];	
		temps1.Delete(0, arrowpos+2);

		temps1+='|';
		orpos = temps1.Find('|');
		while(orpos != -1) 
		{
			temps2=temps1.Left(orpos);				
			if(temps2.IsEmpty()) continue;

			temps2.TrimLeft();
			temps2.TrimRight();
			p6[i].pleft=pleft;
			p6[i].pright=temps2;

			temps1.Delete(0, orpos+1);
			orpos = temps1.Find('|');
			i++;
		}//while '|'		
	
	}//while 0d 0a
	pnum = i;

	fill_VnVtStart();

	return pnum;
}


CString CWinsuanfuDoc::display_G()
{
	CString str;
	
	str += "Vn={" + Vn + "}\r\n";
	str += "Vt={" + Vt + "}\r\n";
	str += "S={" + Start + "}\r\n";

	for(int i=0; i<pnum; i++)
	{
		str += p6[i].pleft;
		str += " -> ";
		str += p6[i].pright;
		str += "\r\n";		
	}

	return str;
}

void CWinsuanfuDoc::InsertF(char p, char a)
{
	int p1=Vn.Find(p);
	int a1=Vt.Find(a);
	
	ASSERT(p1!=-1 && a1!=-1);

	if(!F[p1][a1])
	{
		F[p1][a1] = true;
		s.push(p,a);
	}
}

void CWinsuanfuDoc::InsertL(char p, char a)
{
	int p1=Vn.Find(p);
	int a1=Vt.Find(a);
	
	ASSERT(p1!=-1 && a1!=-1);

	if(!L[p1][a1])
	{
		L[p1][a1] = true;
		s.push(p,a);
	}
}

void CWinsuanfuDoc::FirstVt()
{
	char a0,a1;
	int row = Vn.GetLength();
	int col = Vt.GetLength();

	for(int i=0; i<row; i++)
		for(int j=0; j<col; j++)
			F[i][j] = false;

	for(i=0; i<pnum; i++)
	{
		a0=p6[i].pright[0];
		if(Vt.Find(a0) != -1)
		{
			InsertF(p6[i].pleft, a0);
			continue;
		}
		
		if(p6[i].pright.GetLength() <= 1) continue;

		a1=p6[i].pright[1];
		if(Vn.Find(a0) != -1 && Vt.Find(a1) != -1)
			InsertF(p6[i].pleft, a1);
	}

	while(!s.empty())
	{
		char q, a;		
		s.pop(q, a);
		for(i=0; i<pnum; i++)
			if(p6[i].pright[0]  == q)
				InsertF(p6[i].pleft, a);

	}

}

void CWinsuanfuDoc::LastVt()
{
	char a0,a1;
	int row = Vn.GetLength();
	int col = Vt.GetLength();

	for(int i=0; i<row; i++)
		for(int j=0; j<col; j++)
			L[i][j] = false;

	for(i=0; i<pnum; i++)
	{
		a0=p6[i].pright.Right(1)[0];
		if(Vt.Find(a0) != -1)
		{
			InsertL(p6[i].pleft, a0);
			continue;
		}
		
		if(p6[i].pright.GetLength() <= 1) continue;

		a1=p6[i].pright.Right(2)[0];
		if(Vn.Find(a0) != -1 && Vt.Find(a1) != -1)
			InsertL(p6[i].pleft, a1);
	}

	while(!s.empty())
	{
		char q, a;		
		s.pop(q, a);
		for(i=0; i<pnum; i++)
			if(p6[i].pright.Right(1)[0]  == q)
				InsertL(p6[i].pleft, a);

	}
}


void CWinsuanfuDoc::createtable(CString str)
{
	ClearDoc();
	
	int findspace = str.Find(' ');
	while(findspace!=-1)
	{
		str.Delete(findspace,1);
		findspace = str.Find(' ');
	}

	if(ConvertP(str) == -1) return;
	FirstVt();
	LastVt();
	
	int vtnum = Vt.GetLength();
	
	for(int j=0; j<pnum; j++)
	{
		for(int i=0; i<p6[j].pright.GetLength()-1; i++)
		{
			char xi = p6[j].pright[i];
			char xi1 = p6[j].pright[i+1];
			int pxi = Vt.Find(xi);
			int pxi1 = Vt.Find(xi1);

			if(pxi != -1 && pxi1 != -1) 
			{
				if(table[pxi][pxi1] == 0)
					table[pxi][pxi1] = '=';
				else
				{
					MessageBox(NULL, "不是算符優先文法", NULL, MB_ICONEXCLAMATION);
					return;
				}
				continue;
			}

			if(i+2 < p6[j].pright.GetLength())
			{
				char xi2 = p6[j].pright[i+2];
				int pxi2 = Vt.Find(xi2);

				if(pxi != -1 && pxi1 == -1 && pxi2 != -1)
				{
					if(table[pxi][pxi2] == 0)
						table[pxi][pxi2] = '=';
					else
					{
						MessageBox(NULL, "不是算符優先文法", NULL, MB_ICONEXCLAMATION);
						return;
					}
				}
			}

			if(pxi != -1 && pxi1 == -1)
			{
				pxi1 = Vn.Find(xi1);
				ASSERT(pxi1 != -1);
				for(int k=0; k<vtnum; k++)
					if(F[pxi1][k]) 
					{
						if(table[pxi][k] == 0)
							table[pxi][k] = '<';
						else
						{
							MessageBox(NULL, "不是算符優先文法", NULL, MB_ICONEXCLAMATION);
							return;
						}
					}
				continue;
			}
			
			if(pxi == -1 && pxi1 != -1)
			{
				pxi = Vn.Find(xi);
				ASSERT(pxi != -1);
				for(int k=0; k<vtnum; k++)
					if(L[pxi][k])
					{
						if(table[k][pxi1] == 0)
							table[k][pxi1] = '>';
						else
						{
							MessageBox(NULL, "不是算符優先文法", NULL, MB_ICONEXCLAMATION);
							return;
						}
					}
			}
		} 
	}
}

CString CWinsuanfuDoc::display_firstvt()
{	
	char p, a;
	CString str;

	int row = Vn.GetLength();
	int col = Vt.GetLength();

	for(int i=0; i<row; i++)
	{
		p = Vn[i];
		str += "FIRSTVT(";
		str +=  p;
		str += ") = {";
		for(int j=0; j<col; j++)
			if (F[i][j])
			{
				a = Vt[j];
				str += a;
				str += " ";
			}
		str+= "}\r\n";
	}
	return str;
}

CString CWinsuanfuDoc::display_lastvt()
{
	char p, a;
	CString str;

	int row = Vn.GetLength();
	int col = Vt.GetLength();

	for(int i=0; i<row; i++)
	{
		p = Vn[i];
		str += "LASTVT(";
		str += p;
		str += ") = {";
		for(int j=0; j<col; j++)
			if (L[i][j])
			{
				a = Vt[j];
				str += a;
				str += " ";
			}
		str += "}\r\n";
	}
	
	return str;
}

CString CWinsuanfuDoc::display_table()
{
	CString str;

	str+="文法 \r\n";
	str+=display_G();

	str+="\r\nFIRSTVT和LASTVT \r\n";
	str+=display_firstvt();
	str+=display_lastvt();

	int row = Vt.GetLength();
	int col = Vt.GetLength();

	str += "\r\n算符優先表\r\n";
	for(int i=0; i<=col; i++)
		str += "----+";
	str+="\r\n";

	str+="    |";
	
	for(i=0; i<col; i++)
	{
		str += Vt[i];
		str += "   |";
	}
	str+="\r\n";

	for(i=0; i<=col; i++)
		str+="----+";
	str+="\r\n";
	
	for(i=0; i<row; i++)
	{
		str += Vt[i];
		str += "   |";
		for(int j=0; j<col; j++)
		{
			str+=table[i][j]?table[i][j]:' ';
			str+="   |";
		}
		str += "\r\n";
		for(j=0; j<=col; j++)
			str += "----+";
		str+="\r\n";
	}
	return str;
	
}


int CWinsuanfuDoc::mymatch(CString str)
{
	int ret=-1;
	
	//首先找出最匹配的產生式,即終結符全部匹配
	for(int i=0; i<pnum; i++)
	{
		//長度匹配
		if(p6[i].pright.GetLength() != str.GetLength()) continue;

		for(int j=0; j<str.GetLength(); j++)
		{
			if(str[j] == p6[i].pright[j]) continue;

			int sj=Vt.Find(str[j]);				//字符串
			int pj=Vt.Find(p6[i].pright[j]);	//產生式

			if((sj==-1 && pj!=-1) || 
				(sj!=-1 && pj==-1)) break;		//一個是終結符一個是非終結符
			if(sj != -1 && pj != -1) break;		//終結符不匹配
		}

		if(j>=str.GetLength()) break;
	}
	
	if(i >= pnum) return -1;

	//然后看str能否歸約到這個產生式
	int matchpos = i;
	int count =0;
	while(p6[matchpos].pright.Compare(str)!=0)
	{
		if(count++ > pnum) return -1;

		for(int j=0; j<str.GetLength(); j++)
		{
			if(str[j] == p6[matchpos].pright[j]) continue;

			for(i=0; i<pnum; i++)
			{
				if(p6[i].pright.GetLength() == 1 &&
					p6[i].pright[0] == str[j])
				{
					str.Delete(j);
					str.Insert(j, p6[i].pleft);	
					break;
				}
			}
			if(i < pnum) break;
		}
	}

	
	return matchpos;
}

CString CWinsuanfuDoc::analyzer(CString str)
{
	if(str.Find('#')==-1) str+='#';

	int row=0;
	int i=0,k=0,j=0;
	int pa,pq,pj;
	char a,q;
	CString s;
	CString endstr;
	CString retstr;
	CString tmpstr;

	retstr = "步驟		棧		輸入串		動作	原因\r\n";
	retstr +="-------------------------------------------------------------\r\n";

	s += '#';
	endstr += '#';
	endstr += Start;
	
	while(1)
	{
		tmpstr.Empty();
		tmpstr.Format("%d\t%10s%20s", row, s, str.Right(str.GetLength()-i));
		retstr+=tmpstr;

		row++;
		a=str[i];
		if(a == '#')
		{
			if(s.Compare(endstr) == 0)
				break;
			
			if(s.GetLength() == 2)
			{
				int r=mymatch(s.Right(1));
				int count=0;
				while(p6[r].pleft != Start[0] && count++ < pnum)				
					r=mymatch(s.Right(1));	
				
				if(p6[r].pleft != Start[0])
				{
					MessageBox(NULL, "error1", "analysis", MB_ICONEXCLAMATION);
					break;
				}

				s.Delete(1);
				s.Insert(1, Start);

				tmpstr.Empty();
				tmpstr.Format("%14s  LastVn\r\n","歸約");
				retstr += tmpstr;

				continue;
			}
		}
		

		if(Vt.Find(s[k]) != -1)
			j=k;
		else
			j=k-1;

		if(j<0)
		{
			MessageBox(NULL, "error2", "analysis", MB_ICONEXCLAMATION);
					break;
		}
		
		pa=Vt.Find(a);
		pj=Vt.Find(s[j]);
		ASSERT(pa!=-1 && pj!=-1);
		if(table[pj][pa] == '>')
		{
			tmpstr.Empty();
			tmpstr.Format("%14s     %c%c%c\r\n","歸約",Vt[pj],table[pj][pa],Vt[pa]);
			retstr += tmpstr;

			do
			{
				q=s[j];
				pq=Vt.Find(q);

				if(Vt.Find(s[j-1])!=-1) j-=1;
				else j-=2;			

				pj=Vt.Find(s[j]);
				ASSERT(pj != -1 && pq != -1);				
			}
			while(table[pj][pq] == '>' || table[pj][pq] == '=');

			//歸約
			for(int len=0; len<pnum; len++)
			{
				if(p6[len].pright.Compare(s.Right(s.GetLength()-j-1)) == 0)
					break;
			}
			
			if(len >= pnum)
			{				
				len = mymatch(s.Right(s.GetLength()-j-1));
				if(len == -1)
				{
					MessageBox(NULL, "error3", "analysis", MB_ICONEXCLAMATION);
					break;
				}				
			}

			k=j+1;			
			s.Delete(k, s.GetLength()-k);
			s+=p6[len].pleft;
			continue;
		}

		if(table[pj][pa] == '<' || table[pj][pa] == '=')
		{			
			tmpstr.Empty();
			tmpstr.Format("%14s     %c%c%c\r\n","移進",Vt[pj],table[pj][pa],Vt[pa]);
			retstr += tmpstr;

			k++;
			s += a;
		}
		if(table[pj][pa] == 0)
		{
			tmpstr.Empty();
			tmpstr.Format("error:%c和%c沒有優先關系\r\n",Vt[pj],Vt[pa]);

			MessageBox(NULL, tmpstr, "analysis", MB_ICONEXCLAMATION);
					break;
		}
		i++;
	}
	
	retstr += "\r\n";

	return retstr;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
7777精品伊人久久久大香线蕉的 | 欧美最猛黑人xxxxx猛交| 国产高清视频一区| 久久99精品国产麻豆婷婷洗澡| 亚洲aⅴ怡春院| 天天色天天操综合| 日本欧洲一区二区| 美女视频黄免费的久久| 欧美a一区二区| 免费在线观看日韩欧美| 久久精品国产99久久6| 激情都市一区二区| 国产精品538一区二区在线| 国产精品一二二区| yourporn久久国产精品| 一本一本大道香蕉久在线精品| 一本色道久久综合亚洲91| 色狠狠综合天天综合综合| 欧美日韩中文字幕一区二区| 欧美理论电影在线| 日韩久久久精品| xf在线a精品一区二区视频网站| 国产亚洲欧美日韩在线一区| 国产精品久久久久久久久免费樱桃| 国产精品国产精品国产专区不蜜 | 国产一区二区美女诱惑| 国产成人精品免费看| 99久久精品国产一区| 欧美午夜精品久久久久久孕妇| 欧美一区二区视频免费观看| 精品99一区二区| 中文字幕在线观看不卡| 成人国产在线观看| 91浏览器入口在线观看| 91麻豆精品国产91久久久使用方法| 精品国免费一区二区三区| 欧美国产日韩在线观看| 一区二区高清在线| 美女精品自拍一二三四| av在线免费不卡| 91精品在线免费| 国产精品萝li| 日本一区中文字幕| 成人精品电影在线观看| 欧美日韩日日骚| 国产日韩av一区| 亚洲成人黄色影院| 国产黑丝在线一区二区三区| 欧美视频一区二| 欧美激情一区不卡| 日产国产欧美视频一区精品| 成人一区二区视频| 在线不卡中文字幕播放| 中文欧美字幕免费| 日日噜噜夜夜狠狠视频欧美人| 国产成都精品91一区二区三| 欧美高清性hdvideosex| 国产精品国产三级国产aⅴ入口| 日本午夜精品一区二区三区电影 | 欧美人体做爰大胆视频| 欧美日韩一二三区| 不卡的av中国片| 91精品蜜臀在线一区尤物| 国产精品乱码一区二三区小蝌蚪| 亚洲成a人v欧美综合天堂下载| 国产v综合v亚洲欧| 日韩一区二区免费在线电影| 亚洲欧美经典视频| 国产制服丝袜一区| 欧美日韩国产大片| 亚洲丝袜另类动漫二区| 国产一区二区三区精品欧美日韩一区二区三区 | 蜜臀av亚洲一区中文字幕| 色噜噜狠狠色综合欧洲selulu| 久久精品视频网| 六月丁香婷婷久久| 欧美精品丝袜中出| 亚洲国产日日夜夜| 91在线观看视频| 中文字幕va一区二区三区| 狠狠色狠狠色合久久伊人| 欧美人妖巨大在线| 亚洲精品国产精品乱码不99| 成人精品视频.| 久久久久久久综合日本| 蜜桃久久精品一区二区| 欧美精品一卡二卡| 午夜精品福利一区二区三区蜜桃| 99r国产精品| 国产精品传媒视频| 成人免费视频免费观看| 国产丝袜在线精品| 国产老肥熟一区二区三区| 精品国产露脸精彩对白| 久久99精品一区二区三区| 日韩色视频在线观看| 美洲天堂一区二卡三卡四卡视频| 欧美日韩成人激情| 亚洲一区二区高清| 欧美久久婷婷综合色| 亚洲成av人在线观看| 欧美日韩一区二区三区在线 | 国产在线观看免费一区| 精品日韩欧美一区二区| 久久狠狠亚洲综合| 精品日韩一区二区三区| 国产乱色国产精品免费视频| 欧美激情艳妇裸体舞| 成人免费高清在线观看| 综合色天天鬼久久鬼色| 99视频精品在线| 亚洲黄色小说网站| 欧美日韩免费观看一区三区| 日韩精品免费专区| 欧美r级电影在线观看| 国产一区二区三区高清播放| 中文字幕+乱码+中文字幕一区| www.欧美日韩| 一区二区三区日韩欧美精品| 欧美日韩免费观看一区三区| 奇米在线7777在线精品| 久久久精品综合| 99re热这里只有精品免费视频| 亚洲黄色免费电影| 日韩一区二区影院| 国产精品1区2区| 亚洲欧美日韩精品久久久久| 欧美精品v国产精品v日韩精品| 久久99深爱久久99精品| 久久久久久久久蜜桃| 94-欧美-setu| 午夜精品一区二区三区免费视频| 精品国产污网站| 波多野结衣精品在线| 亚洲国产成人av| 精品少妇一区二区三区免费观看| 成人午夜视频网站| 亚洲18色成人| 国产片一区二区| 欧美日韩成人一区二区| 国产成人一区二区精品非洲| 亚洲欧美日韩精品久久久久| 日韩三级电影网址| 精品少妇一区二区三区日产乱码 | 欧美日韩成人在线| 国产成人午夜精品5599| 亚洲精品欧美二区三区中文字幕| 欧美一区二区在线不卡| 波多野结衣中文字幕一区二区三区| 亚洲一卡二卡三卡四卡无卡久久| 亚洲精品在线电影| 在线影视一区二区三区| 国产一区二区免费在线| 午夜在线电影亚洲一区| 国产欧美一区二区三区在线看蜜臀 | 国产精品人妖ts系列视频| 欧美性大战久久| 国产精品1024久久| 亚洲国产视频网站| 国产精品久久久久久久裸模| 日韩亚洲欧美中文三级| 91黄色免费看| 国产.精品.日韩.另类.中文.在线.播放| 亚洲在线观看免费| 国产欧美1区2区3区| 91精品国产全国免费观看| 91视视频在线直接观看在线看网页在线看| 日本三级韩国三级欧美三级| 亚洲免费在线电影| 久久精品一二三| 欧美高清dvd| 91精品福利在线| 成人精品国产免费网站| 韩国三级中文字幕hd久久精品| 午夜国产精品一区| 综合在线观看色| 欧美激情一区二区三区四区| 日韩欧美一区二区久久婷婷| 欧美少妇一区二区| 91啪亚洲精品| 成人av免费在线观看| 国产成人在线视频网址| 精品一区二区三区视频在线观看| 一区二区三区不卡在线观看| 中文字幕国产精品一区二区| 久久天堂av综合合色蜜桃网| 欧美一区二区在线免费观看| 欧美欧美午夜aⅴ在线观看| 91老师片黄在线观看| 成人app软件下载大全免费| 久久99精品久久久| 青青草91视频| 免费的国产精品| 蜜臀精品久久久久久蜜臀 | av毛片久久久久**hd| 国产成人av电影免费在线观看| 国产一区二区三区美女| 国产综合色在线| 国产一区二区三区免费| 国产精品自产自拍|