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

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

?? ll1_judge.cpp

?? vc++實現編譯原理中的LL(1)文法的編譯過程,非常好用.
?? CPP
字號:
#include ".\ll1_judge.h"

LL1_judge::LL1_judge(void)
{
	for(int i=0;i<26;i++)
	{
		m_temp_nt.push_back(char(65+i));
	}
	m_temp_nt_pointer=0;
	m_str_compare="A->a|@";
	for(int j=0;j<(int)m_str_compare.size();j++)
	{
		m_compare.push_back(m_str_compare[j]);
	}
	m_terminal.push_back(m_str_compare[5]);

}

LL1_judge::~LL1_judge(void)
{
}

bool LL1_judge::in_type(string str)
{
	if(str.find("->"))
	{
		vector<char> type;
		for(int i=0;i<(int)str.size();i++)
		{
			type.push_back(str.at(i));
		}
		m_creation.push_back(type);
		cout<<"產生式現有個數"<<(int)m_creation.size()<<endl;
	     return true;
	}
	else
		return false;

}

void LL1_judge::cancel_directly(void)             ///************************8沒有分解
{
	for(int i=0;i<(int)m_creation.size();i++)
	{
		if(judge_directly(m_creation[i]))//如果有直接左遞歸,就消除
		{
			cout<<"第"<<i<<"個產生式有直接左遞歸,現在消除"<<endl;
			string t_a,t_b;
			bool is_nt;//1為是終結符
			is_nt=false;
			bool is_next;
			is_next=false;
			for(int j=3;j<(int)m_creation[i].size();j++)
			{
				
				if(m_creation[i][j]==m_compare[4])//問題:      不識別|;
				{
					
					is_next=true;
					is_nt=false;
				}
				else if(m_creation[i][j]==m_creation[i][0])
					is_nt=true;
				else if(is_nt==true)
				{
					if(is_next==true&&t_a.size()>0) t_a+=m_str_compare[4];
					t_a+=m_creation[i][j];
					is_next=false;
				}
				else
				{
					if(is_next==true&&t_b.size()>0) t_b+=m_str_compare[4];
					t_b+=m_creation[i][j];
					is_next=false;
				}
			}


			for(int w1=0;w1<(int)t_b.size();w1++)
			{
				if(t_b[w1]==m_str_compare[4])
				{
					t_b.insert(w1,1,m_temp_nt[m_temp_nt_pointer]);//####################
					w1+=1;
				}
			}
			t_b+=m_temp_nt[m_temp_nt_pointer];//bp'  完成了產生式的右部
			m_creation[i].erase(m_creation[i].begin()+3,m_creation[i].end());
			for(int t=0;t<(int)t_b.size();t++)
			{
				m_creation[i].push_back(t_b[t]);
			}//產生式P->BP'完成
			//此步成功完成,
			for(int yy=0;yy<(int)m_creation[i].size();yy++)
			{
				cout<<"#######"<<m_creation[i][yy];
			}
              

			for(int w2=0;w2<(int)t_a.size();w2++)
			{
				if(t_a[w2]==m_str_compare[4])
				{
					t_a.insert(w2,1,m_temp_nt[m_temp_nt_pointer]);
					w2+=1;
				}
			}
            t_a+=m_temp_nt[m_temp_nt_pointer];
			t_a+=m_str_compare[4];
			t_a+=m_str_compare[5];//完成產生式的右部P'->aP'|@
			vector<char> t_vec;
			t_vec.push_back(m_temp_nt[m_temp_nt_pointer]);
			t_vec.push_back(m_str_compare[1]);
			t_vec.push_back(m_str_compare[2]);

			m_non_terminal.push_back(m_temp_nt[m_temp_nt_pointer]);
			m_temp_nt_pointer++;
			for(int r=0;r<(int)t_a.size();r++)
			{
				t_vec.push_back(t_a[r]);
			}
			m_creation.insert(m_creation.begin()+i+1,1,t_vec);
			i++;
			
		}
		
	}
}


int LL1_judge::in_terminal_sign(string str)
{
	for(int i=0;i<(int)str.size();i++)
	{
		m_terminal.push_back(str.at(i));
	}

    return 0;
}
void LL1_judge::in_non_terminal_sign(string str)//非終結符的輸入
{
	for(int i=0;i<(int)str.size();i++)
	{
		m_non_terminal.push_back(str.at(i));
		for(int j=0;j<(int)m_temp_nt.size();j++)
		{
			if(m_temp_nt[j]==str.at(i))
			{
				m_temp_nt.erase(m_temp_nt.begin()+j);
			}
		}
	}
	cout<<"非終結符:";
	for(int t=0;t<(int)m_non_terminal.size();t++)
	{
		cout<<m_non_terminal[t];
	}
}

bool LL1_judge::judge_directly(vector<char> vec)
{
	cout<<"到了判斷直接左遞歸了 "<<endl;
	int is_true=0;
	if(vec[0]==vec[3]) is_true=1;
	for(int i=4;i<(int)vec.size();i++)
	{
		if(vec[i]==char("|"))
		{
			if(vec[i+1]==vec[0]){is_true=1;break;}
		}
	}
	if(is_true==1)
	{
		cout<<"發(fā)現直接左遞歸:";
		for(int p=0;p<(int)vec.size();p++)
		{
			cout<<vec[p];
		}
		return true;
	}
	else
	   return false;
}

bool LL1_judge::judge_indirectly()
{
	vector<judge_nt> vec;
	bool is_end=false;
	for(int i=0;i<(int)m_creation.size();i++)
	{
		if(is_end==false)//  --->>>>>
		{
		    vec.clear();
		    for(int r1=0;r1<(int)m_non_terminal.size();r1++)//第一個產生式
		   {
			    if(m_creation[i][3]==m_non_terminal[r1])
				    help_j_ind(vec,m_creation[i][0],m_creation[i][3],is_end);
		    }
		    if(is_end==false)// 盡量減少遞歸的次數
		    {
	            for(int r2=0;r2<(int)m_creation[i].size();r2++)//以后的產生式
		        {
			        if(m_creation[i][r2]==char("|"))
			        {
				         for(int r3=0;r3<(int)m_non_terminal.size();r3++)
				         {
					        if(m_creation[i][r2+1]==m_non_terminal[r3])
								help_j_ind(vec,m_creation[i][0],m_creation[i][r2+1 ],is_end);
				         }
			         }
		        }
		    }
	     }//if(is_end)
    }
	return is_end;
}

void LL1_judge::help_j_ind(vector<judge_nt> &vec, char zuo,char you,bool &is_end)
                                                                      //函數是一第一個生成式的,第一個產生式開始的,                                                                     //需在調用函數里 根據產生式個數調用此函數
{
	  judge_nt temp;
	  temp.zuo=zuo;
	  temp.you=you;
	  vec.push_back(temp);
	  int find_pointer;
	  for(int t=0;t<(int)m_creation.size();t++)
	  {
		     if(m_creation[t][0]==you)find_pointer=t;
	   }
	    for(int t4=0;t4<(int)vec.size();t4++)//判斷第一個產生式是不是是間接左遞歸成立
	   {
		    if(m_creation[find_pointer][3]==vec[t4].zuo)
		    {
			        is_end=true;
			        break;
		     }
	   }
	   if(is_end==false)//第一次判斷結果
	   {

	       for(int t1=0;t1<(int)m_non_terminal.size();t1++)//第一個產生式的遞歸
	      {
		      if(m_creation[find_pointer][3]==m_non_terminal[t1])
		      {
			       help_j_ind(vec,you,m_creation[find_pointer][3],is_end);
		      }
	      }

	     for(int t2=3;t2<(int)m_creation[find_pointer].size();t2++)//‘|’以后的產生式的遞歸
	    {
			if(is_end==false)
			{//////////////////////////
			
		          if(m_creation[find_pointer][t2]==m_compare[4])
		          {
			          for(int t5=0;t5<(int)vec.size();t5++)
			         {
				           if(m_creation[find_pointer][t2+1]==vec[t5].zuo)
				           {
					               is_end=true;
					              break;
				             }
			          }//判斷這個產生式是不是使間接作遞歸成立

                       //如果不成立,第一個符號是不是非終結符,是則進入下一次左遞歸
                       if(is_end==false)
		              {
			                 for(int t3=0;t3<(int)m_non_terminal.size();t3++)
			                 {
				                 if(m_creation[find_pointer][t2+1]==m_non_terminal[t3])
				                 {
					                   help_j_ind(vec,you,m_creation[find_pointer][t2+1],is_end);//&&&&&&&&&&&&&&&&&&&&7
				                  }
			                   }
		                }
				  }
	          }//////////////////////////////////////////////////////////////////////////////////////////////////////////
	       }
	   }
	//好像是每次都要刪除了
	vec.erase(vec.end()-1);
}
void LL1_judge::cancel_indirectly(void)
{
	if(judge_indirectly())
	{
	  for(int i=0;i<(int)m_creation.size();i++)
	   {
		bool is_first=true;
		for(int t=3;t<(int)m_creation[i].size();t++)
		{
			
			if(is_first==true)//如果是表達式的第一個符號
			{
				is_first=false;
					for(int t2=0;t2<i;t2++)
					{
						if(m_creation[i][t]==m_creation[t2][0])//到達了替換的條件
						{
							//所有操作在這個條件以內
							string str1,str2;
							for(int t3=3;t3<(int)m_creation[t2].size();t3++)
							{
								str1+=m_creation[t2][t3];
							}
							for(int t4=t+1;t4<(int)m_creation[i].size();t4++)
							{
								if(m_creation[i][t4]==m_compare[4])break;
								else
								{
									str2+=m_creation[i][t4];
								}
							}
							for(int t5=0;t5<(int)str1.size();t5++)
							{
								if(str1[t5]==m_str_compare[4])
								{
									cout<<"到達了串的插入了"<<endl;
									str1.insert(str1.begin()+t5,str2.begin(),str2.end());//問題:關于插入,不成功了
									t5+=(int)str2.length();
								}
							}
							m_creation[i].erase(m_creation[i].begin()+t);
							m_creation[i].insert(m_creation[i].begin()+t,str1.begin(),str1.end());
							//這里先將所有的間接遞歸替換完后,
							//才判斷這句有沒有直接遞歸,不知道有沒有射門么問題
							i--;//在每替換一個非終結符的時候,回退一位,看有沒有替換完全
							is_first=true;
						}
					}
				}
			   else if(m_creation[i][t]==m_compare[4]) is_first=true;
			   else 
				   is_first=false;
		}
		if(judge_directly(m_creation[i]))
		{
			cancel_directly();
		}
	  }
	}
}
void LL1_judge::display_all(void)
{
	cout<<"產生式顯示:"<<endl;
	for(int i=0;i<(int)m_creation.size();i++)
	{
		cout<<"              ";
		for(int j=0;j<(int)m_creation[i].size();j++)
		{
			cout<<m_creation[i][j];
		}
		cout<<endl;
	}
	cout<<"首符集顯示:"<<endl;
	for(int a1=0;a1<(int)m_first.size();a1++)
	{
		cout<<"               ";
		for(int a2=0;a2<(int)m_first[a1].size();a2++)
		{
			cout<<m_first[a1][a2];
		}
		cout<<endl;
	}
}




void LL1_judge::find_first()
{
	
	for(int i=0;i<(int)m_creation.size();i++)
	{
		bool is_first=true;
		vector<char> temp;
		temp.push_back(m_creation[i][0]);
		for(int j=3;j<(int)m_creation[i].size();j++)
		{
			if(is_first==true)
			{
				is_first=false;
				for(int t1=0;t1<(int)m_terminal.size();t1++)
				{
					if(m_creation[i][j]==m_terminal[t1])
					{
						push_back(temp,m_creation[i][j]);
					}
				}
			}
			else if(m_creation[i][j]==m_compare[4])
			{
				is_first=true;
			}
			else
			{
				is_first=false;
			}
		}
		m_first.push_back(temp);
	}//到這里完成第一遍的終結符掃描 

	for(int a1=0;a1<(int)m_creation.size();a1++)
	{
        bool first=true;
	    bool is_continue;
	    is_continue=false;
	    bool nt_t=true;//1-nt,a-t
		for(int a2=3;a2<(int)m_creation[a1].size();a2++)
		{
			if(first==true||is_continue==true)
			{
				
				//非終結符情況
				for(int a3=0;a3<(int)m_non_terminal.size();a3++)
				{
					if(m_creation[a1][a2]==m_non_terminal[a3])
					{
						nt_t=true;
						push_back(m_first[a1],m_creation[a1][a2]);
						for(int a4=0;a4<(int)m_first.size();a4++)
						{
							if(m_first[a4][0]==m_creation[a1][a2])
							{
								for(int a5=1;a5<(int)m_first[a4].size();a5++)
								{
									if(m_first[a4][a5]==m_compare[5])
									{
										is_continue=true;
									}//有空串就使is_continue=ture
								}
							}
						}//非終結符
					}
				}
				//終結符情況
				if(nt_t==false)
				{
					if(m_creation[a1][a2]==m_compare[4])
					{
						push_back(m_first[a1],m_str_compare[5]);
						first=true;//在最后一個非終結符都有空串的時候,我們加了空串到非終結符集合
					}
					else 
					{
						push_back(m_first[a1],m_creation[a1][a2]);
					}
					is_continue=false;
					nt_t=false;
				}

			}
			else if(m_creation[a1][a2]==m_compare[4])
			{
				first=true;
			}
			else
			{
				first=false;
			}
		}
	}//到這里完成了第二遍的非終結符的掃描,下一步是完成替換規(guī)則

	for(int b1=0;b1<(int)m_first.size();b1++)
	{
		vector<char> temp_nt;
		temp_nt.push_back(m_first[b1][0]);
		bool is_deal=false;
		for(int b2=1;b2<(int)m_first[b1].size();b2++)
		{
			for(int b3=0;b3<(int)m_non_terminal.size();b3++)
			{
				if(m_first[b1][b2]==m_non_terminal[b3])
				{
					for(int b6=0;b6<(int)temp_nt.size();b6++)
					{
					    if(m_first[b1][b2]==temp_nt[b6])
					    {
						    m_first[b1].erase(m_first[b1].begin()+b2);
						    b2--;
							is_deal=true;
					     }
					}
					if(is_deal==false)
					{
						is_deal=false;
					    for(int b4=0;b4<(int)m_first.size();b4++)
					    {
						    if(m_first[b4][0]==m_first[b1][b2])
						    {
							    for(int b5=1;b5<(int)m_first[b4].size();b5++)
							    {
								    push_back(m_first[b1],m_first[b4][b5]);
						     	}
							}
						}
						m_first[b1].erase(m_first[b1].begin()+b2);
						b2--;
					}
				}
				is_deal=false;
			}
		}
	}
}

void LL1_judge::push_back(vector<char> &vec, char ch)
{
	bool is_include;
	is_include=false;
	for(int i=0;i<(int)vec.size();i++)
	{
		if(vec[i]==ch)is_include=true;
	}
	if(is_include==false)
	{
		vec.push_back(ch);
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美卡1卡2卡| 亚洲精品国产高清久久伦理二区| 久久久精品欧美丰满| 一区二区三区不卡视频 | 亚洲精品一区二区三区精华液| 国产精品国产三级国产专播品爱网 | 国产一区欧美一区| 在线精品视频一区二区三四 | 粉嫩一区二区三区在线看| 欧美电影一区二区| 亚洲三级小视频| 国产iv一区二区三区| 精品日韩一区二区三区| 亚洲激情校园春色| 不卡在线视频中文字幕| 久久久国际精品| 狠狠色狠狠色综合系列| 69p69国产精品| 亚洲一区二区美女| 日本久久精品电影| 亚洲欧洲精品一区二区三区 | 欧美专区日韩专区| 亚洲色图.com| 91免费看片在线观看| 国产精品乱码人人做人人爱| 国产一区二区毛片| 久久你懂得1024| 国产高清精品网站| 久久精品视频免费观看| 国产高清亚洲一区| 国产精品美女一区二区| 菠萝蜜视频在线观看一区| 欧美激情在线观看视频免费| 粉嫩aⅴ一区二区三区四区五区 | 日韩三级视频在线看| 青青青伊人色综合久久| 欧美一区二区三区在线观看| 丝袜a∨在线一区二区三区不卡| 欧美性高清videossexo| 香蕉加勒比综合久久| 666欧美在线视频| 麻豆精品蜜桃视频网站| 久久视频一区二区| 成人av网站在线| 亚洲欧美经典视频| 欧美日韩国产系列| 国产自产2019最新不卡| 国产精品色一区二区三区| 97se亚洲国产综合自在线不卡| 亚洲精品中文字幕在线观看| 欧美日韩一区二区欧美激情| 蜜桃av一区二区| 亚洲国产精品t66y| 91国产视频在线观看| 奇米777欧美一区二区| 国产亚洲欧美一区在线观看| 91亚洲精品一区二区乱码| 天天综合网天天综合色| 欧美精品一区二区久久婷婷| 成+人+亚洲+综合天堂| 亚洲18色成人| 国产欧美日韩视频在线观看| 色婷婷综合久久久| 久久精品国产**网站演员| 国产肉丝袜一区二区| 欧美揉bbbbb揉bbbbb| 国产一区啦啦啦在线观看| 亚洲另类在线视频| 精品国产凹凸成av人导航| 色综合久久久久综合体| 麻豆国产91在线播放| 国产精品国产馆在线真实露脸| 欧美日韩高清一区| 99精品视频一区| 精品在线观看免费| 亚洲最色的网站| 久久久久久久久岛国免费| 欧美性色黄大片| 成人黄色免费短视频| 蜜臀久久久99精品久久久久久| 成人免费小视频| 国产亚洲欧洲997久久综合| 欧美日本韩国一区二区三区视频| 国产风韵犹存在线视精品| 首页国产欧美久久| 亚洲欧美日韩中文播放 | 亚洲大片精品永久免费| 国产精品美女久久久久久| 88在线观看91蜜桃国自产| 91网页版在线| 国产成人久久精品77777最新版本| 日韩精品视频网| 夜夜嗨av一区二区三区中文字幕 | 亚洲va欧美va人人爽| 国产精品每日更新在线播放网址| 91精品中文字幕一区二区三区| 99久久综合精品| 风间由美一区二区三区在线观看 | 亚洲国产精品欧美一二99| 国产精品久久一卡二卡| 精品日本一线二线三线不卡 | 在线看国产一区二区| 91玉足脚交白嫩脚丫在线播放| 另类综合日韩欧美亚洲| 五月综合激情日本mⅴ| 亚洲图片一区二区| 一区二区三区免费观看| 国产精品国产精品国产专区不片| 久久久久久亚洲综合| 久久免费偷拍视频| 久久夜色精品国产欧美乱极品| 欧美变态口味重另类| 精品少妇一区二区三区日产乱码 | 制服.丝袜.亚洲.另类.中文 | 久久亚洲欧美国产精品乐播| 91麻豆精品国产自产在线观看一区| 色视频成人在线观看免| 色综合久久99| 色94色欧美sute亚洲13| 日本韩国一区二区三区视频| 欧美色综合久久| 337p亚洲精品色噜噜狠狠| 日韩亚洲欧美综合| 26uuu国产日韩综合| 中文字幕不卡的av| 亚洲欧美国产毛片在线| 亚洲一级片在线观看| 天天综合日日夜夜精品| 免费看日韩a级影片| 国产一区二区久久| www.色精品| 欧美色倩网站大全免费| 欧美一区二区三区性视频| 日韩精品一区在线| 中文字幕va一区二区三区| 亚洲欧美日韩精品久久久久| 亚洲自拍偷拍网站| 久久精品国产**网站演员| 成人污污视频在线观看| 在线免费观看日本一区| 91精品国产aⅴ一区二区| 久久理论电影网| 一二三区精品福利视频| 久久99精品久久久久久国产越南 | 国产一区二区免费看| 91香蕉国产在线观看软件| 欧美做爰猛烈大尺度电影无法无天| 欧美揉bbbbb揉bbbbb| 国产亚洲精品bt天堂精选| 国产精品二三区| 日韩福利电影在线| www.欧美亚洲| 777欧美精品| 中文字幕一区二| 免费成人在线网站| 色综合久久久久| 久久先锋影音av鲁色资源网| 亚洲六月丁香色婷婷综合久久| 精品一区二区三区免费视频| 99久久综合精品| 精品国产欧美一区二区| 一区二区三区欧美亚洲| 久草中文综合在线| 欧美性感一区二区三区| 欧美激情一区二区三区蜜桃视频| 午夜精品一区二区三区免费视频 | 韩国成人精品a∨在线观看| 欧美调教femdomvk| 欧美韩国一区二区| 麻豆精品在线播放| 欧美日韩中文另类| 亚洲欧美在线观看| 国产激情偷乱视频一区二区三区| 欧美电影一区二区| 一区二区三区蜜桃| 成人av在线播放网站| 久久久久久久国产精品影院| 丝袜a∨在线一区二区三区不卡| 一本色道久久综合精品竹菊| 久久精品视频免费观看| 捆绑变态av一区二区三区| 欧美嫩在线观看| 亚洲国产视频直播| 欧洲精品视频在线观看| 日韩理论在线观看| 成人97人人超碰人人99| 国产欧美精品在线观看| 狠狠狠色丁香婷婷综合久久五月| 日韩一区二区不卡| 五月婷婷色综合| 精品视频一区 二区 三区| 亚洲综合小说图片| 欧美性受极品xxxx喷水| 亚洲黄色免费网站| 一本大道久久精品懂色aⅴ| 亚洲男人的天堂网| 色老综合老女人久久久| 亚洲一级二级在线| 欧美日韩高清一区二区不卡| 日韩电影在线免费|