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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? grammar.cpp

?? 采用高效的C語言
?? CPP
?? 第 1 頁 / 共 2 頁
字號(hào):

	bool flag;
	do
	{
		flag = false;
		string strLeft, strRight;
		for(int i = 0; i< nP; i ++)
		{
			strLeft = P[i].GetLeft();
			strRight = P[i].GetRight();
			int iPos = Vn.FindPos(strLeft[0]);
			if (Vn.Find(strLeft[0]))
			{
				if ((strRight == "@")||(Vt.Find(strRight[0])))
					flag |= FirstSet[iPos].Insert(strRight[0]);
				else
				{
					unsigned int j = 0;
					do
					{
						char cChar = strRight[j];
						if (Vn.Find(cChar))
						{
							flag |= (FirstSet[iPos].Add((GetFirstSet(cChar) - Set('@'))) != 0);
							if (!CanReachEmpty(cChar))
								break;
						}
						j ++;
					}while(j < strRight.length());
					if (j == strRight.length())
						flag |= FirstSet[iPos].Insert('@');
				}
			}
		}
	}while(flag);
}

void Grammar::CalculateFollowSet()
{
	if(pCanEmptyTable == 0)
		MakeCanReachEmptyTable();
	for(int i = 0; i < nVn; i ++)
	{
		Set tempSet;
		FollowSet.push_back(tempSet);
	}
	FollowSet[Vn.FindPos(cStart)].Insert('#');
	bool flag = false;
	do
	{
		flag = false;
		for(int i = 0; i < nP; i ++)
		{
			string strLeft, strRight;
			strLeft = P[i].GetLeft();
			strRight = P[i].GetRight();

			for ( unsigned int j = 0; j < strRight.length() - 1; j++)
			{
				char cChar = strRight[j];
				if (Vn.Find(cChar))
				{
					string temp;
					for(unsigned int k = j + 1; k < strRight.length(); k++)
						//temp.push_back(strRight[k]);
						temp += strRight[k];
					Set firstset = GetFirstSet(temp);
					flag |= (FollowSet[Vn.FindPos(cChar)].Add(firstset - Set('@')) != 0);
					if (CanReachEmpty(temp))
					{
						flag |= (FollowSet[Vn.FindPos(cChar)].Add(GetFollowSet(strLeft[0])) != 0);
					}
				}
			}
			if (Vn.Find(strRight[strRight.length() -1]))
				flag |= (FollowSet[Vn.FindPos(strRight[strRight.length() -1])].Add(GetFollowSet(strLeft[0])) != 0);
		}
	}while(flag);
}

void Grammar::CalculateSelectSet()
{
	for(int i = 0; i < nP; i ++)
	{
		Set selectSet;
		selectSet = GetFirstSet(P[i].GetRight());
		if (CanReachEmpty(P[i].GetRight()))
			selectSet.Add(GetFollowSet(P[i].GetLeft()[0]));
		SelectSet.push_back(selectSet);
	}
}

bool Grammar::IsLegalLL1Grammar()
{
	if (iIsLL1 == 1)
		return true;
	if (iIsLL1 == 2)
		return false;
	bool * pDeleteFlag = new bool[nP];
	for(int i = 0; i < nP; i ++)
		pDeleteFlag[i] = false;
	for(i = 0; i < nP; i ++)
	{
		if (pDeleteFlag[i])
			continue;
		string strLeft = P[i].GetLeft();
		Set set = SelectSet[i];
		Set setb;
		for(int j = i + 1; j < nP; j ++)
		{
			if (pDeleteFlag[i])
				continue;
			if (P[j].GetLeft() == strLeft)
			{
				setb = SelectSet[j];
				if (set.Add(setb) != setb.Size())
				{
					iIsLL1 = 2;
					return false;
				}
			}
		}
	}
	delete [] pDeleteFlag;
	iIsLL1 = 1;
	return true;
}



bool Grammar::CanReachEmpty(string str)
{
	bool flag = true;
	if (str != "@")
	{
		for (unsigned int i = 0; i < str.length(); i++)
		{
			int iPos = Vn.FindPos(str[i]);
			if (iPos != -1)
			{
				if (pCanEmptyTable[iPos] == CANFALSE)
				{
					flag = false;
					break;
				}
			}
			else
			{
				flag = false;
				break;
			}
		}
	}
	return flag;
}

bool Grammar::CanReachEmpty(char cChar)
{
	int iPos;
	if((iPos = Vn.FindPos(cChar)) != -1)
	{
		if(pCanEmptyTable[iPos] == CANTRUE)
			return true;
		else
			return false;
	}
	else
		return false;
		
}

Set Grammar::GetFirstSet(char cChar)
{
	if(Vt.Find(cChar) || (cChar == '@'))
	{
		Set set;
		set.Insert(cChar);
		return set;
	}
	else
	{
		return FirstSet[Vn.FindPos(cChar)];	
	}
}

Set Grammar::GetFirstSet(string str)
{
	Set firstset;
	if ((Vt.Find(str[0]))||(str == "@"))
	{
		firstset.Insert(str[0]);
	}
	else
	{
		unsigned int i;
		for (i = 0; i < str.length(); i++)
		{
			char cChar = str[i];
			if (Vn.Find(cChar))
			{
				firstset.Add(GetFirstSet(cChar) - Set('@'));
				if (!CanReachEmpty(cChar))
					break;
			}
			else
			{
				firstset.Insert(cChar);
				break;
			}
				
		}
		if (i == str.length())
			firstset.Insert('@');
	}
	return firstset;
}

Set Grammar::GetFollowSet(char cChar)
{
	int iPos;
	if ((iPos = Vn.FindPos(cChar)) != -1)
		return FollowSet[iPos];
	else
		return Set();
}

void Grammar::MakePredictTable()
{
	Set Select;
	pPredictTable = new int [nVn*(nVt+1)];
	for(int i = 0; i < nVn*(nVt+1); i++)
		pPredictTable[i] = -1;
	for(i = 0; i < nP; i++)
	{
		Select = SelectSet[i];
		for(int j = 0; j < Select.Size(); j++)
		{
			if (Select.GetAt(j) != '@')
				pPredictTable[Vn.FindPos(P[i].GetLeft()[0])*(nVt+1)+((Select.GetAt(j) == '#')?(nVt):(Vt.FindPos(Select.GetAt(j))))] = i;
		}
	}
}

void Grammar::Output(char * pFilename)
{
	if (pFilename == 0)
		return;
	CStdioFile OutFile;
	OutFile.Open(pFilename, CFile::modeCreate | CFile::modeWrite);
	CString t;
	OutFile.WriteString("[Terminator]\n");
	for(int i = 0; i < nVt; i++)
	{
		t.Format("%c\n", Vt.GetAt(i));
		OutFile.WriteString(t);
		
	}
	OutFile.WriteString("\n[NonTerminator]\n");
	for(i = 0; i < nVn; i++)
	{
		t.Format("%c\n", Vn.GetAt(i));
		OutFile.WriteString(t);
	}
	OutFile.WriteString("\n[Starter]\n");
	t.Format("%c", cStart);
	t += "\n\n[Precept]\n";
	OutFile.WriteString(t);
	for(i = 0; i < nP; i++)
	{
		t.Format("%s->%s\n", P[i].GetLeft().c_str(), P[i].GetRight().c_str());
		OutFile.WriteString(t);
	}
	OutFile.WriteString("\n[CanReachEmptySet]\n");
	for(i = 0; i < nVn; i ++)
	{
		if(CanReachEmpty(Vn.GetAt(i)))
		{
			t.Format("%c\n", Vn.GetAt(i));
			OutFile.WriteString(t);
		}
	}
	OutFile.WriteString("\n[FirstSet]\n");
	for(i = 0; i < nVn; i ++)
	{
		t.Format("%c = ",Vn.GetAt(i));
		for(int j = 0; j < FirstSet[i].Size() - 1; j ++)
		{
			//t.AppendChar(FirstSet[i].GetAt(j));
			t += FirstSet[i].GetAt(j);
			t += ", ";
		}
		//t.AppendChar(FirstSet[i].GetAt(FirstSet[i].Size()-1));
		t += FirstSet[i].GetAt(FirstSet[i].Size()-1);
		t += " \n";
		OutFile.WriteString(t);
	}
	OutFile.WriteString("\n[FollowSet]\n");
	for(i = 0; i < nVn; i ++)
	{
		t.Format("%c = ",Vn.GetAt(i));
		for(int j = 0; j < FollowSet[i].Size() - 1; j ++)
		{
			//t.AppendChar(FollowSet[i].GetAt(j));
			t += FollowSet[i].GetAt(j);
			t += ", ";
		}
		//t.AppendChar(FollowSet[i].GetAt(FollowSet[i].Size()-1));
		t += FollowSet[i].GetAt(FollowSet[i].Size()-1);
		t += " \n";
		OutFile.WriteString(t);
	}
	OutFile.WriteString("\n[SelectSet]\n");
	for(i = 0; i < nP; i ++)
	{
		t.Format("%s->%s = ",P[i].GetLeft().c_str(),P[i].GetRight().c_str());
		for(int j = 0; j < SelectSet[i].Size() - 1; j ++)
		{
			//t.AppendChar(SelectSet[i].GetAt(j));
			t += SelectSet[i].GetAt(j);
			t += ", ";
		}
		//t.AppendChar(SelectSet[i].GetAt(SelectSet[i].Size()-1));
		t += SelectSet[i].GetAt(SelectSet[i].Size()-1);
		t += " \n";
		OutFile.WriteString(t);
	}
	OutFile.WriteString("\n");
	if(IsLegalLL1Grammar())
	{
		OutFile.WriteString("[PredictTable]\n");
		for(int x = 0; x < nVn; x ++)
		{
			for(int y = 0; y < nVt + 1; y ++)
			{
				if (pPredictTable[x*(nVt+1)+y] != -1)
				{
					t.Format("%c, %c = %s\n", Vn.GetAt(x), ((y != nVt)?Vt.GetAt(y):'#'), P[pPredictTable[x*(nVt+1)+y]].GetRight().c_str());
					OutFile.WriteString(t);
				}
			}

		}
	}
	OutFile.Close();
}

Grammar::Grammar(const Grammar & g)
{
	if (&g == this)
		return;
	Vt = g.Vt;
	Vn = g.Vn;
	cStart = g.cStart;
	P = g.P;
	FirstSet = g.FirstSet;
	FollowSet = g.FollowSet;
	SelectSet = g.SelectSet;
	nVt = g.nVt;
	nVn = g.nVn;
	nP = g.nP;
	if (g.pCanEmptyTable !=0)
	{
		pCanEmptyTable = new CanEmpty[nVn];
		for (int i = 0; i < nVn; i ++)
			pCanEmptyTable[i] = g.pCanEmptyTable[i];
	}
	if(g.pPredictTable != 0)
	{
		pPredictTable = new int[nVn * (nVt + 1)];
		for (int i = 0; i < nVn * (nVt + 1); i ++)
			pPredictTable[i] = g.pPredictTable[i];
	}
}

const Grammar Grammar::operator = (const Grammar & g)
{
	if (&g == this)
		return * this;
	Vt = g.Vt;
	Vn = g.Vn;
	cStart = g.cStart;
	P = g.P;
	FirstSet = g.FirstSet;
	FollowSet = g.FollowSet;
	SelectSet = g.SelectSet;
	nVt = g.nVt;
	nVn = g.nVn;
	nP = g.nP;
	if (g.pCanEmptyTable !=0)
	{
		pCanEmptyTable = new CanEmpty[nVn];
		for (int i = 0; i < nVn; i ++)
			pCanEmptyTable[i] = g.pCanEmptyTable[i];
	}
	if(g.pPredictTable != 0)
	{
		pPredictTable = new int[nVn * (nVt + 1)];
		for (int i = 0; i < nVn * (nVt + 1); i ++)
			pPredictTable[i] = g.pPredictTable[i];
	}
	return *this;
}

bool Grammar::IsInVn(char  cChar)
{
	return Vn.Find(cChar);
}

bool Grammar::IsInVt(char  cChar)
{
	return Vt.Find(cChar);
}

char Grammar::GetStart()
{
	return cStart;
}

Precept Grammar::GetToDo(char vn, char vt)
{
	int i;
	if ((i = pPredictTable[Vn.FindPos(vn) * (nVt + 1) + ((vt == '#')?nVt:Vt.FindPos(vt))]) != -1)
		return P[i];
	else
	{
		return Precept("","");
	}
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
蜜臀av在线播放一区二区三区| 国产精品第四页| 青青草国产成人av片免费| 欧美日本国产视频| 日韩精品成人一区二区在线| 日韩精品自拍偷拍| 国产综合一区二区| 亚洲欧洲日产国码二区| 色婷婷综合久久久中文字幕| 亚洲第一主播视频| 欧美一区二区三区色| 韩国一区二区视频| 国产精品美女久久久久aⅴ| 92精品国产成人观看免费| 亚洲国产精品一区二区www在线| 91精品国产综合久久久久久| 老鸭窝一区二区久久精品| 欧美精品一区二区三区蜜桃视频| 高清不卡一二三区| 亚洲人成小说网站色在线 | 中文字幕亚洲一区二区va在线| 91免费版在线| 日韩成人av影视| 久久久久久久久岛国免费| 日本伦理一区二区| 麻豆国产一区二区| 亚洲天堂2014| 日韩欧美国产精品| 91视频一区二区三区| 奇米影视一区二区三区| 成人免费一区二区三区视频| 91精品国产综合久久久蜜臀粉嫩| 国产成人综合网站| 亚洲va国产天堂va久久en| 久久免费视频一区| 欧美色爱综合网| 丰满放荡岳乱妇91ww| 亚洲不卡av一区二区三区| 国产欧美一区二区在线| 欧美猛男男办公室激情| 99re成人精品视频| 美国一区二区三区在线播放| 亚洲视频一区在线| 久久精品人人做人人综合 | 国产亚洲综合在线| 欧美精品在线一区二区| 成人午夜短视频| 亚洲婷婷综合色高清在线| 国产精品三级av在线播放| 制服丝袜中文字幕一区| av一区二区三区四区| 蜜桃视频在线一区| 亚洲成人av一区二区三区| 中文字幕中文字幕一区二区| 精品久久免费看| 欧美高清视频一二三区| 色94色欧美sute亚洲线路二 | 欧美日韩国产综合草草| 成人性色生活片免费看爆迷你毛片| 日本中文在线一区| 夜夜精品浪潮av一区二区三区| 国产精品免费观看视频| 精品电影一区二区三区| 欧美无砖砖区免费| 欧美在线一区二区三区| 一本色道久久加勒比精品| 成人在线视频首页| 国产aⅴ精品一区二区三区色成熟| 肉色丝袜一区二区| 亚洲高清视频的网址| 亚洲欧美日韩中文字幕一区二区三区| 欧美国产精品中文字幕| 国产人伦精品一区二区| 久久久不卡影院| 久久久www成人免费毛片麻豆| 日韩精品专区在线影院重磅| 精品日韩成人av| 久久亚洲综合av| 久久一区二区视频| 亚洲国产高清不卡| 中文在线一区二区| 国产精品久久福利| 国产精品久久久久一区二区三区| 国产三级久久久| 99久久99久久综合| 久久久久久亚洲综合| 欧美人xxxx| 欧美老女人第四色| 欧美一级欧美三级| 日韩欧美国产精品一区| xvideos.蜜桃一区二区| 久久久久久久久免费| 国产蜜臀97一区二区三区| 中文字幕亚洲欧美在线不卡| 亚洲男人天堂一区| 亚洲成a人片综合在线| 日韩在线一二三区| 亚洲欧美日韩系列| 亚洲国产成人av好男人在线观看| 亚洲国产精品尤物yw在线观看| 视频在线观看国产精品| 九九久久精品视频 | 日韩av一二三| 国产一区二区三区最好精华液| 成人丝袜高跟foot| 欧美性淫爽ww久久久久无| 日韩精品一区二| 国产精品人人做人人爽人人添| 一区二区三区四区视频精品免费| 午夜视频一区在线观看| 国产一区二区美女| 色婷婷精品久久二区二区蜜臂av| 欧美精品亚洲二区| 久久久无码精品亚洲日韩按摩| 中文字幕日韩精品一区| 天堂影院一区二区| 国产不卡一区视频| 欧美精品日韩综合在线| 久久久99精品久久| 亚洲大片在线观看| 国产精品一区二区免费不卡| 99re这里只有精品首页| 欧美一级日韩不卡播放免费| 久久精品久久久精品美女| 国产一区二区导航在线播放| 国产 欧美在线| 欧美一卡二卡在线| 综合分类小说区另类春色亚洲小说欧美| 日韩国产精品久久久| 国产精品麻豆网站| 最新国产精品久久精品| 久久精品免视看| 欧美精品高清视频| 日韩一区在线看| 精品一二三四区| 欧美日韩在线亚洲一区蜜芽| 欧美白人最猛性xxxxx69交| 一区二区三区高清不卡| 成人av电影在线观看| 久久久综合精品| 美国av一区二区| 欧美精品在线视频| 首页国产丝袜综合| 精品久久人人做人人爰| 久久精品国产秦先生| 6080yy午夜一二三区久久| 亚洲午夜在线观看视频在线| 精品1区2区3区| 爽好多水快深点欧美视频| 91精品国产91久久久久久一区二区| 亚洲人成人一区二区在线观看| 欧美日韩精品欧美日韩精品一| 欧美激情在线观看视频免费| 成人激情综合网站| 中文字幕一区二区三区不卡在线| www.av精品| 亚洲乱码国产乱码精品精可以看| 在线综合+亚洲+欧美中文字幕| 日韩av电影免费观看高清完整版 | 欧美日韩在线播放三区| 国产色一区二区| 老色鬼精品视频在线观看播放| 欧美日韩三级视频| 亚洲福利视频导航| 欧美性色综合网| 一区二区三区四区在线播放 | 国产精品久久夜| 色综合久久天天| 首页欧美精品中文字幕| 国产日韩欧美激情| 精品久久久久久久一区二区蜜臀| 国产精品一区二区免费不卡| 国产精品美女视频| 日本一区二区免费在线| 91精品国产色综合久久不卡电影 | 亚洲精品免费电影| 91久久精品一区二区三区| 亚洲人成网站精品片在线观看| 91一区二区三区在线观看| 中文字幕一区二区三区四区不卡| 97精品超碰一区二区三区| 亚洲精品国产a久久久久久| 欧美亚洲国产一区二区三区| 亚洲一区二区三区视频在线播放| 欧美视频在线观看一区二区| 日韩国产欧美一区二区三区| 精品国产一区久久| 国产99久久久久久免费看农村| 成人免费在线视频| 欧美日韩高清一区二区| 老司机午夜精品| 日本一区二区成人| 欧美影院一区二区| 麻豆精品精品国产自在97香蕉| 久久久99精品免费观看不卡| 一本色道**综合亚洲精品蜜桃冫| 丝袜a∨在线一区二区三区不卡| 精品国产麻豆免费人成网站| 成人丝袜18视频在线观看| 粉嫩一区二区三区性色av|