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

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

?? ll1_analyser.cpp

?? pl0編譯器
?? CPP
字號:
//LL1_Analyser.cpp

#include "stdafx.h"
#include "LL1_Analyser.h"
//計算并集
template <class T> inline
set<T> Set_Union (const set<T> &lset, const set<T> &rset)
{
	set<T> temp;
	insert_iterator< set<T> > pos(temp, temp.begin());
	set_union (lset.begin(), lset.end(), rset.begin(), rset.end(), pos);
	return temp;
}
//計算差集
template <class T> inline
set<T> Set_Difference (const set<T> &lset, const set<T> &rset)
{
	set<T> temp;
	insert_iterator< set<T> > pos(temp, temp.begin());
	set_difference (lset.begin(), lset.end(), rset.begin(), rset.end(), pos);
	return temp;
}
//看value是否屬于集合Set
template <class T> inline
bool Is_Attribute (const T &value, const set<T> &Set)
{
	return (Set.find(value) != Set.end());
}


LL1_Analyser::LL1_Analyser(const Grammar &grammar):g(grammar) 
{
	//首先刪除所有文法中的動作符號
	for(int i=0; i < g.productions.size();i++)
		for(int j=0; j<g.productions[i].rhs.size(); j++)
			if (g.productions[i].rhs[j].first == Action) g.productions[i].rhs.erase(&(g.productions[i].rhs[j])); 
	g.actions.clear();
	cout<<"Analysing the grammar..."<<endl<<endl;
	//一步一步從FIRST集求到LL1分析表
	mark_lambda();
	fill_first_set(); 
	fill_follow_set();
	fill_predict_set();
	fill_LL_Table();
	show_LL_Table();
};

void LL1_Analyser::show_first_set()
{
	cout<<"First set:"<<endl;
	map< symbol, set<symbol> >::iterator pos=first.begin();
	for(; pos != first.end(); pos++)
	{
		cout<<g.GetStr(pos->first)<<" :  ";
		for(set<symbol>::iterator s_it=pos->second.begin(); s_it != pos->second.end(); s_it++)
			cout<<g.GetStr(*s_it)<<' ';
		cout<<endl;
	}
}

void LL1_Analyser::show_follow_set()
{
	cout<<"Follow set:"<<endl;
	map< symbol, set<symbol> >::iterator pos=follow.begin();
	for(; pos != follow.end(); pos++)
	{
		cout<<g.GetStr(pos->first)<<" :  ";
		for(set<symbol>::iterator s_it=pos->second.begin(); s_it != pos->second.end(); s_it++)
			cout<<g.GetStr(*s_it)<<' ';
		cout<<endl;
	}
}

void LL1_Analyser::show_predict_set()
{
	cout<<"Predict set:"<<endl;
	vector< set<symbol> >::iterator pos=predict.begin();
	for(; pos != predict.end(); pos++)
	{
		cout<<"Production "<<distance(predict.begin(),pos)+1<<" :  ";
		for(set<symbol>::iterator s_it=pos->begin(); s_it != pos->end(); s_it++)
			cout<<g.GetStr(*s_it)<<' ';
		cout<<endl;
	}
}

void LL1_Analyser::show_LL_Table()
{
	cout<<"LL1 Analyse Table:"<<endl;
	map< pair<nonterminal,terminal>, int >::iterator pos=LL_Table.begin();
	for(; pos != LL_Table.end(); pos++)
		cout<<g.GetStr(pos->first.first)<<' '<<g.GetStr(pos->first.second)<<" -> "<<pos->second+1<<endl;
	cout<<endl;
}

void LL1_Analyser::show_derives_lambda()
{
	cout<<"The following nonterminals can derive lambda."<<endl;
	map< symbol, bool >::iterator pos=derives_lambda.begin();
	for(; pos != derives_lambda.end(); pos++)
		if (pos->second == true) cout<<g.GetStr(pos->first)<<' ';
	cout<<endl;
}
//算法大意:從每個符號在產生式的左部出發,一步步向下推導出是否為空,直到該集合derives_lambda收斂為止
void LL1_Analyser::mark_lambda()
{
	bool changes;
	bool rhs_derives_lambda;
	symbol v;
	int i,j;
	//初始化,規定每個符號都推不出空
	symbols::iterator s_it=g.nonterminals.begin();
	for (;s_it != g.nonterminals.end(); s_it++)
		derives_lambda[s_it->second] = false;
	s_it=g.terminals.begin();
	for (;s_it != g.terminals.end(); s_it++)
		derives_lambda[s_it->second] = false;

	do
	{
		changes = false; //判定是否收斂,如果為false為收斂
		for (i=0; i < g.productions.size(); i++)
		{
			production &p=g.productions[i];
			if ( !derives_lambda[p.lhs] ) 
			{
				//如果產生式右部只有空則一定能推導出空
				if ( p.rhs.size() == 1 && p.rhs[0].first == $ )
				{
					changes = true;
					derives_lambda[p.lhs] = true;
					continue;
				};
				rhs_derives_lambda = derives_lambda[p.rhs[0]];
				//否則繼續向下推導(即在原集合中查找右部能否推出空)
				for (j=1; j<p.rhs.size(); j++)
					rhs_derives_lambda = rhs_derives_lambda && derives_lambda[p.rhs[j]];
				if (rhs_derives_lambda) { changes=true; derives_lambda[p.lhs]=true; }
			}
		}
	} while (changes); //不收斂就循環
}
//算法大意:見公式
set<symbol> LL1_Analyser::compute_first (const vector<symbol> &right)
{
	int i,k=right.size();
	symbol n=make_pair($,0);
	set<symbol> temp,temp1;
	set<symbol> nl;
	nl.insert(n);
	set<symbol> result;
	if (k == 0) return result;
	else
	{
		result=Set_Union(result,first[right[0]]);
		for (i=1; i<k && ( Is_Attribute(n,first[right[i-1]]) ); i++)
			result=Set_Union(result,Set_Difference(first[right[i]],nl));
		if ( i==k && Is_Attribute(n,first[right[k-1]]) )
			result.insert(n);
	}
	return result;
}

bool LL1_Analyser::_find_production(const nonterminal &vn, const terminal &vt)
{
	vector<production>::iterator pos = g.productions.begin();
	while ( pos != g.productions.end() )
	{
		if (pos->lhs == vn && pos->rhs[0] == vt) return true;
		pos++;
	}
	return false;
}
//算法大意:見公式
void LL1_Analyser::fill_first_set ()
{
	nonterminal A;
	terminal a;
	production p;
	bool changes;
	int temp;
	nonterminal n=make_pair($,0);
	symbols::iterator s_it=g.nonterminals.begin();
	for (; s_it != g.nonterminals.end(); s_it++)
	{
		A = s_it->second;
		if (derives_lambda[A]) first[A].insert(n);
		else first[A].clear();
	}
	for (s_it=g.terminals.begin(); s_it != g.terminals.end(); s_it++)
	{
		a = s_it->second;
		if ( (a.first == Id || a.first == Intc) && (a.second != -1) ) continue;
		first[a].insert(a);
		for (symbols::iterator s_it1=g.nonterminals.begin(); s_it1 != g.nonterminals.end(); s_it1++)
		{
			A = s_it1->second;
			if( _find_production(A,a) ) 
				first[A].insert(a);
		}
	}
	do
	{
		changes = false;
		for (vector<production>::iterator pos=g.productions.begin(); pos != g.productions.end(); pos++)
		{
			p=*pos;
			temp=first[p.lhs].size();
			first[p.lhs]=Set_Union(first[p.lhs],compute_first(p.rhs));
			if ( temp != first[p.lhs].size() ) changes=true;
		}
	} while (changes);

}

//算法大意:見公式
void LL1_Analyser::fill_follow_set()
{
	nonterminal A,B;
	int i;
	bool changes;
	symbol n=make_pair($,0);
	set<symbol> temp_set;
	vector<symbol> follow_string;
	vector<symbol> temp1;
	vector<symbol>::iterator pos1;

	for (symbols::iterator s_it=g.nonterminals.begin(); s_it != g.nonterminals.end(); s_it++)
	{
		A = s_it->second;
		follow[A].clear();
	}
	follow[g.start_symbol].insert(n);
	
	do
	{
		changes = false;
		s_it=g.nonterminals.begin();
		for (; s_it != g.nonterminals.end(); s_it++)
		{
			B = s_it->second;
			i=follow[B].size();
			for (vector<production>::iterator pos=g.productions.begin(); pos != g.productions.end(); pos++)
			{
				pos1=find(pos->rhs.begin(),pos->rhs.end(),B);
				while( pos1 != pos->rhs.end() )
				{
					temp1.clear();
					temp1.insert(temp1.begin(),pos1+1,pos->rhs.end());
					temp_set=compute_first(temp1);
					if( Is_Attribute(n,temp_set) || (temp_set.size() == 0 && find(pos->rhs.begin(),pos->rhs.end(),B) != pos->rhs.end() ) )
					{
						temp_set.erase(n);
						follow[B]=Set_Union(follow[B],temp_set);
						follow[B]=Set_Union(follow[B],follow[pos->lhs]);
					}
					else 
						follow[B]=Set_Union(follow[B],temp_set);
					pos1=find(pos1+1,pos->rhs.end(),B);
				}
			}
			if (i != follow[B].size()) changes = true;
		}
	} while (changes);
}

//算法大意:見公式
void LL1_Analyser::fill_predict_set()
{
	symbol n=make_pair($,0);
	set<symbol> temp_set;
	for (vector<production>::iterator pos=g.productions.begin(); pos != g.productions.end(); pos++)
	{
		temp_set.clear();
		temp_set=compute_first(pos->rhs);
		if ( Is_Attribute(n,temp_set) || temp_set.size() == 0)
		{
			if ( Is_Attribute(n,temp_set) ) temp_set.erase(n);
			temp_set=Set_Union(temp_set,follow[pos->lhs]);
		}
		predict.push_back(temp_set);
	}
}

//算法大意:見公式
void LL1_Analyser::fill_LL_Table()
{
	pair<nonterminal,terminal> p_temp;
	set<symbol>::iterator s_it;
	symbol sym;
	for (int i=0; i<g.productions.size();i++)
	{
		sym=g.productions[i].lhs;
		s_it=predict[i].begin();
		while( s_it != predict[i].end() )
		{
			p_temp=make_pair(sym,*s_it);
			if ( LL_Table.find(p_temp) != LL_Table.end() )
			{
				cerr<<"The grammar isn't LL(1) grammar! because of "<<g.GetStr(p_temp.first)<<" and "<<g.GetStr(p_temp.second)<<endl;
				return;
			}
			LL_Table[p_temp]=i;
			s_it++;
		}
	}
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人小视频免费在线观看| 不卡的av中国片| 日本一区二区在线不卡| 欧美怡红院视频| 国产成a人亚洲| 日韩精品一区第一页| 亚洲欧洲一区二区在线播放| 欧美一区二区啪啪| 色av综合在线| 国产 欧美在线| 久久99国产精品尤物| 亚洲福利电影网| 亚洲色大成网站www久久九九| 精品国产一区二区三区四区四| 欧美日韩精品电影| 91亚洲精品久久久蜜桃网站| 国产中文字幕精品| 看片网站欧美日韩| 午夜精品在线看| 一区二区三区 在线观看视频| 国产欧美一区二区精品婷婷| 精品国产一区二区三区忘忧草| 欧美日韩小视频| 一本到三区不卡视频| 成人免费的视频| 国产乱码精品1区2区3区| 免播放器亚洲一区| 五月激情六月综合| 亚洲无线码一区二区三区| 一区二区三区在线免费播放 | 欧美一区二区三区系列电影| 色综合久久久网| 成人av网站在线观看免费| 国产成人精品免费| 国产美女av一区二区三区| 奇米在线7777在线精品| 免费观看久久久4p| 日韩av电影天堂| 婷婷综合五月天| 日日夜夜一区二区| 日韩不卡一区二区| 日韩影视精彩在线| 久久精品国产澳门| 九九九精品视频| 国产综合色产在线精品| 国产精品99久久久久久久vr | 在线观看视频一区| 色噜噜狠狠一区二区三区果冻| 91在线国产福利| 91偷拍与自偷拍精品| 欧美在线看片a免费观看| 91浏览器入口在线观看| 欧美日韩一区二区三区视频| 欧美网站一区二区| 欧美一区二区精品在线| 精品美女在线播放| 久久久亚洲高清| 中文字幕欧美日韩一区| 亚洲图片激情小说| 亚洲精品福利视频网站| 五月婷婷综合在线| 麻豆国产精品一区二区三区| 国产一区二区精品久久91| 粉嫩嫩av羞羞动漫久久久| 91一区二区在线| 欧美精品高清视频| 2024国产精品| 亚洲视频图片小说| 日欧美一区二区| 国产精品影视在线观看| 色婷婷综合久久久中文一区二区 | 欧美一区二区二区| 精品久久五月天| 亚洲欧美怡红院| 亚洲成人av电影| 国内外成人在线视频| 91亚洲精华国产精华精华液| 91精品国产美女浴室洗澡无遮挡| 久久网站最新地址| 亚洲视频精选在线| 久久精品免费看| 99久久99久久精品免费看蜜桃| 欧美精品日韩综合在线| 久久精品夜夜夜夜久久| 亚洲一二三专区| 国产精品996| 69成人精品免费视频| 欧美激情资源网| 日韩av不卡在线观看| 成人动漫在线一区| 91精品国产一区二区三区| 国产精品美女久久福利网站 | 黄色小说综合网站| 91久久久免费一区二区| 精品国产不卡一区二区三区| 亚洲一区二区在线免费观看视频| 国精产品一区一区三区mba视频 | 久久亚洲精品小早川怜子| 一区二区三区在线视频免费观看| 久久国产精品第一页| 欧美视频在线观看一区| 中文字幕精品在线不卡| 老司机一区二区| 欧美日韩国产系列| 亚洲免费观看高清完整版在线观看熊| 日本不卡不码高清免费观看| 欧日韩精品视频| 国产精品免费视频观看| 国产一区二区在线观看视频| 在线电影一区二区三区| 亚洲素人一区二区| 国产激情视频一区二区在线观看 | 精品欧美乱码久久久久久1区2区 | 国产999精品久久| 91精品国产麻豆国产自产在线| 一区二区三区四区在线| 成人高清免费观看| 欧美国产视频在线| 国内成人精品2018免费看| 欧美一区二区精美| 日韩成人精品在线| 欧美日韩精品一区二区三区蜜桃 | 三级久久三级久久久| 欧美色图天堂网| 亚洲精品国产一区二区精华液| 成人午夜精品一区二区三区| 久久亚洲一级片| 国产一区在线视频| 久久天天做天天爱综合色| 麻豆精品蜜桃视频网站| 51久久夜色精品国产麻豆| 亚洲国产日韩a在线播放性色| 欧洲亚洲精品在线| 亚洲国产色一区| 欧美日韩一区二区三区不卡| 亚洲mv大片欧洲mv大片精品| 精品1区2区3区| 亚洲成人精品一区二区| 欧美日韩第一区日日骚| 日本 国产 欧美色综合| 欧美一区二区三区思思人| 青青青爽久久午夜综合久久午夜| 日韩三级免费观看| 蜜桃精品视频在线| 久久综合久久99| 国产成a人亚洲| 一区精品在线播放| 91国产成人在线| 香蕉成人伊视频在线观看| 欧美福利视频导航| 免费观看日韩av| 久久婷婷国产综合国色天香| 成人免费黄色大片| 亚洲精品亚洲人成人网| 欧美色图天堂网| 久久爱另类一区二区小说| 国产三区在线成人av| 波多野结衣精品在线| 亚洲综合在线电影| 欧美日韩国产精品成人| 乱一区二区av| 国产精品美女久久久久aⅴ | 国产成人在线视频播放| 亚洲国产精品ⅴa在线观看| 99免费精品在线| 亚洲第一福利视频在线| 日韩免费观看高清完整版| 高清视频一区二区| 亚洲国产中文字幕在线视频综合| 欧美一级一级性生活免费录像| 国内不卡的二区三区中文字幕| 国产精品初高中害羞小美女文| 欧美无乱码久久久免费午夜一区| 开心九九激情九九欧美日韩精美视频电影| 久久久www成人免费毛片麻豆| 色丁香久综合在线久综合在线观看| 日韩激情视频在线观看| 国产亚洲精品7777| 日本道色综合久久| 精品影院一区二区久久久| 中文字幕亚洲欧美在线不卡| 欧美丰满嫩嫩电影| 成人激情小说乱人伦| 午夜成人免费视频| 国产精品第一页第二页第三页| 777午夜精品免费视频| 丁香啪啪综合成人亚洲小说| 亚洲大片在线观看| 国产情人综合久久777777| 欧美色精品在线视频| 国产成人av电影在线观看| 视频一区国产视频| 亚洲日本韩国一区| 久久午夜电影网| 欧美一区二区私人影院日本| 99久久亚洲一区二区三区青草| 免费成人在线观看视频| 亚洲一本大道在线| 国产精品美日韩| 日韩欧美一区在线观看|