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

📄 frmmain.cs

📁 这是一个完整的文法分析器
💻 CS
📖 第 1 页 / 共 4 页
字号:
						//输出到网页表格
						OutTableStep(iCount ,Tools.getStackStringBT(stackAnalysis) + left ,
							right+ Tools.getStackStringTB(stackLeft) , "'" + left + "'匹配" );
					}
					else
					{
						Console.WriteLine(++iCount + "\t" + Tools.getStackStringBT(stackAnalysis) + left + "\t" 
							+ right+ Tools.getStackStringTB(stackLeft) + "\t" + "分析不成功" );
						//输出到网页表格
						OutTableStep(iCount ,Tools.getStackStringBT(stackAnalysis) + left ,
							right+ Tools.getStackStringTB(stackLeft) , "分析不成功" );
						return false;
					}
				}
			}
			if(stackAnalysis.Count==1 && stackLeft.Count==1) 
			{
				Console.WriteLine(++iCount + "\t" + Tools.getStackStringBT(stackAnalysis) + "\t" 
					+  Tools.getStackStringTB(stackLeft) + "\t" + "分析成功" );
				//输出到网页表格
				OutTableStep(iCount ,Tools.getStackStringBT(stackAnalysis) ,Tools.getStackStringTB(stackLeft) ,"分析成功" );
				return true;
			}
			else
			{
				Console.WriteLine(++iCount + "\t" + Tools.getStackStringBT(stackAnalysis)+ left + "\t" 
					+  right+Tools.getStackStringTB(stackLeft) + "\t" + "分析不成功" );
				//输出到网页表格
				OutTableStep(iCount ,Tools.getStackStringBT(stackAnalysis) + left ,
					right+ Tools.getStackStringTB(stackLeft) , "分析不成功" );

				return false;
			}
		}
		#endregion

		#endregion	

		#region 辅助计算相关方法

		#region 检测X是否能星推导出空
		/// <summary>
		/// 检测X是否能星推导出空
		/// </summary>
		/// <returns>bool</returns>
		private bool CheckEmptySymbol(string strChar)
		{
			//如果strChar被记录在能推导出空串的集合当中就返回
			if(Tools.IsInList(strChar,emptyList))return true;
			//如果式终结符也直接返回
			if(SymbolSet.getInstance().IsInEndSet(strChar))return false;

			int []iEmpty=new int[LeftItem.Count];
			for(int i=0 ; i < iEmpty.Length ; i++)
			{
				iEmpty[i]=0;
			}
			//首先标记第strChar产生式的那个为1,不对此产生式进行扫描
			//Console.WriteLine(getLeftIndex(strChar)+ "\tmmmm" +strChar);
			iEmpty[getLeftIndex(strChar)]=1;
			//返回产生式
			Product product=(Product)LeftItem[getLeftIndex(strChar)];
			//得到这个产生式右部所有第一个非终结符集
			string [] strFirstLetter=product.FirstRight();
			//如果右部第一个产生式没有非终结符集就直接返回
			if (strFirstLetter==null) return false;

			//把所有非终结符压入队列
			Queue queueFirstLetter=new Queue();
			for(int i=0 ; i < strFirstLetter.Length ; i++)
			{
				//如果strFirstLetter[i]被记录在能推导出空串的集合当中就返回
				if(Tools.IsInList(strFirstLetter[i],emptyList))return true;

				//为防止出现左递归必须进行产生式标记,标记过的产生式不计算
				//Console.WriteLine( strFirstLetter[i] + "\t" +  iEmpty[getLeftIndex(strFirstLetter[i])]);
				if(iEmpty[getLeftIndex(strFirstLetter[i])]!=1)
				{
					queueFirstLetter.Enqueue(strFirstLetter[i]);
					iEmpty[getLeftIndex(strFirstLetter[i])]=1;
				}
			}
			string strNextChar=null;
			//队列不为空时依次取出每一元素再进行检测
			if(queueFirstLetter.Count>0)
				strNextChar=(string)queueFirstLetter.Dequeue();

			while (strNextChar!=null)
			{
				Product productNext=(Product)LeftItem[getLeftIndex(strNextChar)];
				//得到这个产生式右部所有第一个非终结符集
				string [] strNextFirstLetter=productNext.FirstRight();
				//当取出的非终结符集不为空时继续压入队列
				if (strNextFirstLetter!=null)
				{
					for(int i=0 ; i < strNextFirstLetter.Length ; i++)
					{
						//如果strFirstLetter[i]被记录在能推导出空串的集合当中就返回
						if(Tools.IsInList(strNextFirstLetter[i],emptyList))return true;
						//为防止出现左递归必须进行产生式标记,标记过的产生式不计算
						if(iEmpty[getLeftIndex(strNextFirstLetter[i])]!=1)
						{
							queueFirstLetter.Enqueue(strNextFirstLetter[i]);
							iEmpty[getLeftIndex(strNextFirstLetter[i])]=1;
						}
					}
				}
				if(queueFirstLetter.Count>0)
					strNextChar=(string)queueFirstLetter.Dequeue();
				else
					strNextChar=null;
			}
			//最后结束没有发现能够推导空串返回false
			return false;

		}
		#endregion

		#region 返回左部为strChar的表达式在列表中的位置
		/// <summary>
		/// 检测左部为strChar的表达式在列表中的位置
		/// </summary>
		/// <returns>int</returns>
		private int getLeftIndex(string strChar)
		{
			for(int i = 0 ; i < LeftItem.Count ; i ++)
			{
				Product product=(Product)LeftItem[i];
				if (product.LeftItem==strChar)
					return i;
			}
			return -1;
		}
		#endregion

		#endregion

		#region 输出相关

		#region 输出所有
		public void OutResult(ArrayList first,ArrayList follow,ArrayList select,Hashtable analysis)
		{
			string strOutText="";
			//设置编码
			Encoding code = Encoding.GetEncoding("gb2312");
			//打开文件
			StreamReader sr=null;
			try
			{
				sr = new StreamReader(Application.StartupPath + "\\html\\showtemplate.html", code);
				strOutText = sr.ReadToEnd(); // 读取文件
			}
			catch(Exception exp)
			{
				Console.WriteLine(exp.Message);
				sr.Close();
			}

			
			//输出非终结符集合
			strOutText=strOutText.Replace("<$NotEndall$>","&lt;"+ SymbolSet.getInstance().StringNotEndall() + "&gt;");
			//输出终结符集合
			strOutText=strOutText.Replace("<$Endall$>","&lt;"+ SymbolSet.getInstance().StringEndall() + "&gt;");	
			//输出产生式
			strOutText=strOutText.Replace("<$Products$>",OutProducts());	
			//输出FIRST集和FOLLOW
			strOutText=strOutText.Replace("<$FirstFollow$>",OutFirstFollow(first, follow));	
			//输出select集
			strOutText=strOutText.Replace("<$Select$>",OutTableSellect(select));
			//输出测试字符串
			strOutText=strOutText.Replace("<$TestString$>",textboxTestString.Text);
			
			
			bool bLL1=IsLL1(select);
			if(bLL1)
			{
				strOutText=strOutText.Replace("<$Result$>","是");	
				strOutText=strOutText.Replace("<$AnalysisTable$>",OutAnalysisTable(analysis));
				//检测句子并输出结果
				string start=this.listboxProducts.Items[0].ToString().Substring(0,1);
				bool IsSentence=this.CheckString(this.textboxTestString.Text,start,analysis);
				strOutText=strOutText.Replace("<$Table$>",this.strAnalysisTable);	

				Console.WriteLine(IsSentence);
				if(IsSentence)
					strOutText=strOutText.Replace("<$TestStringResult$>","是");	
				else
					strOutText=strOutText.Replace("<$TestStringResult$>","不是");	
			}
			else
			{
				strOutText=strOutText.Replace("<$Result$>","不是");	
				strOutText=strOutText.Replace("<$Table$>","无");	
				strOutText=strOutText.Replace("<$TestStringResult$>","无法检测是不是");	
				strOutText=strOutText.Replace("<$AnalysisTable$>","无");	

				

			}


			//产生新文件以便浏览
			string newTempFile=Application.StartupPath + "\\html\\temp.html";
			//如果文件存在就删除
            if(File.Exists(newTempFile))
				File.Delete(newTempFile);
			
			#region 写入新文件
			
			StreamWriter sw=null;
			try
			{
				sw = new StreamWriter(newTempFile , false, code);
				sw.Write(strOutText);
				sw.Flush();
			}
			catch(Exception ex)
			{
				Console.WriteLine(ex.Message);
			}
			finally
			{
				sw.Close();
			}
			
			#endregion

			//浏览结果			
			brwResult.Navigate(newTempFile,ref nullObject, ref nullObjStr, ref nullObjStr, ref nullObjStr);

		}

		#endregion

		#region 输出产生式

		private string OutProducts()
		{
			string strProducts="";
			for(int i=0 ; i<listboxProducts.Items.Count ; i++)
			{
				strProducts+=listboxProducts.Items[i].ToString() + "<br>";
			}
			return strProducts;
		}

		#endregion

		#region 输出FIRST集
		public void outFirst(ArrayList arylst)
		{
			Console.WriteLine("First集:");
			IEnumerator myEnumerator = arylst.GetEnumerator();
			while ( myEnumerator.MoveNext())
			{
				Console.Write("{");
				IEnumerator myEnumerator2=((ArrayList)myEnumerator.Current).GetEnumerator();
				while ( myEnumerator2.MoveNext())
					Console.Write(myEnumerator2.Current.ToString() + " ");
				Console.Write("}\r\n");
			}
				

		}
		#endregion

		#region 输出FOLLOW集
		public void outFollow(ArrayList arylst)
		{
			if (arylst==null) return;
			Console.WriteLine("FOLLOW集:");
			IEnumerator myEnumerator = arylst.GetEnumerator();
			while ( myEnumerator.MoveNext())
			{
				Console.Write("{");
				IEnumerator myEnumerator2=((ArrayList)myEnumerator.Current).GetEnumerator();
				while ( myEnumerator2.MoveNext())
					Console.Write(myEnumerator2.Current.ToString() + " ");
				Console.Write("}\r\n");
			}
				

		}
		#endregion

		#region 输出SELCET集
		public void outSellect(ArrayList arylst)
		{
			if (arylst==null) return;
			Console.WriteLine("SELECT集:");
			IEnumerator myEnumerator = arylst.GetEnumerator();
			while ( myEnumerator.MoveNext())
			{
				Console.Write("{");
				IEnumerator myEnumerator2=((ArrayList)myEnumerator.Current).GetEnumerator();
				while ( myEnumerator2.MoveNext())
					Console.Write(myEnumerator2.Current.ToString() + " ");
				Console.Write("}\r\n");
			}
				

		}
		#endregion 

		#region 输出预测分析表
		
		public void outAnalysis(Hashtable hashAnalysis)
		{
			Console.WriteLine("预测分析表:");
			IDictionaryEnumerator myEnumerator =hashAnalysis.GetEnumerator();
			while ( myEnumerator.MoveNext())
			{
				Console.Write("{");
				Console.Write(myEnumerator.Key + " " + myEnumerator.Value);
				Console.Write("}\r\n");
			}
		}

		#endregion

		#region 输出FIRST集和FOLLOW集到网页表格

		public string OutFirstFollow(ArrayList first,ArrayList follow)
		{
			//
			string strTable="";
			for(int i=0 ; i<LeftItem.Count ; i++ )
			{
				ArrayList currentArray1=(ArrayList)first[i];
				ArrayList currentArray2=(ArrayList)follow[i];
				string strLeft=LeftItem[i].ToString().Substring(0,1);
				strTable+="<tr>\r\n";
				strTable+="<td width=\"64\" class=\"bodyText\"><strong>" +strLeft + "</strong></td>\r\n";
				strTable+="<td width=\"64\" class=\"bodyText\"><strong>" + Tools.IsInList(strLeft,emptyList).ToString() + "</strong></td>\r\n";
				strTable+="<td width=\"64\" class=\"bodyText\"><strong>" + Tools.getArrayString(currentArray1) + "</strong></td>\r\n";
				strTable+="<td width=\"64\" class=\"bodyText\"><strong>" + Tools.getArrayString(currentArray2) + "</strong></td>\r\n";
				strTable+="</tr>\r\n";

			}
			return strTable;
		}

		#endregion

		#region 输出FOLLOW集到网页表格
		
		public string OutTableSellect(ArrayList follow)
		{
			string strTable="";
			for(int i=0 ; i<follow.Count ; i++ )
			{
				ArrayList currentArray=(ArrayList)follow[i];
				strTable+="<tr>\r\n";
				strTable+="<td width=\"64\" class=\"bodyText\"><strong>" + this.listboxProducts.Items[i].ToString() + "</strong></td>\r\n";
				strTable+="<td width=\"64\" class=\"bodyText\"><strong>" + Tools.getArrayString(currentArray) + "</strong></td>\r\n";
				strTable+="</tr>\r\n";

			}
			return strTable;
		}
		
		#endregion

		#region 输出预测分析表到网页表格
		
		public string OutAnalysisTable(Hashtable analysis)
		{
			string strTable="<table border=\"1\" cellspacing=\"1\" cellpadding=\""+ NotEndSet.Count +"\">\r\n";
			for(int i=-1 ; i<NotEndSet.Count ; i++)
			{
				strTable+="<tr>\r\n";
				for(int j=-1 ; j<EndSet.Count ; j++)
				{
					if(i==-1)
					{
						if(j==-1)
						{
							strTable+="<td class=\"bodyText\"><strong>&nbsp;</strong></td>\r\n";
						}
						else{
							strTable+="<td class=\"bodyText\"><strong>"+EndSet[j].ToString()+"</strong></td>\r\n";
						}
					}
					else
					{
						if(j==-1)
						{
							strTable+="<td class=\"bodyText\"><strong>"+ NotEndSet[i].ToString() + "</strong></td>\r\n";
						}
						else
						{
							string strKey=NotEndSet[i].ToString() + EndSet[j].ToString();
							if(analysis.ContainsKey(strKey))
								strTable+="<td class=\"bodyText\"><strong>" + analysis[strKey].ToString() + "</strong></td>\r\n";
							else
								strTable+="<td class=\"bodyText\"><strong>&nbsp;</strong></td>\r\n";
						}
					}
				}
				strTable+="</tr>\r\n";
			}

			strTable +="</table>"; 
			
			return strTable;

		}

		#endregion

		#region 输出分析步骤表到网页
		/// <summary>
		/// 输出分析步骤表到网页
		/// </summary>
		/// <param name="step">分析步骤</param>
		/// <param name="str2">分析栈字符串</param>
		/// <param name="str3">剩余输入串</param>
		/// <param name="str4">推导用产生好式或匹配</param>
		public void OutTableStep(int step, string str2,string str3,string str4)
		{
			strAnalysisTable+="<tr>\r\n";
			strAnalysisTable+="<td class=\"bodyText\"><strong>" + step +"</strong></td>\r\n";
			strAnalysisTable+="<td class=\"bodyText\"><strong>" + str2 +"</strong></td>\r\n";
			strAnalysisTable+="<td class=\"bodyText\"><strong>" + str3 +"</strong></td>\r\n";
			strAnalysisTable+="<td class=\"bodyText\"><strong>" + str4 +"</strong></td>\r\n";
			strAnalysisTable+="</tr>\r\n";
		
		}
		#endregion

		#endregion

		#region 导出网页
		private void btnExport_Click(object sender, System.EventArgs e)
		{
			if(strAnalysisTable=="")return;
			sfiledlg.Filter="(*.html)|*.html";
			sfiledlg.ShowDialog();
			if(sfiledlg.FileName.Length>0 )
			{
				File.Copy(Application.StartupPath + "\\html\\temp.html",sfiledlg.FileName,true);
			}
		}
		#endregion

		#region 退出按钮
		private void btnExit_Click(object sender, System.EventArgs e)
		{
			this.Dispose();
		}
		#endregion

		#region 关于按钮
		private void btnAbout_Click(object sender, System.EventArgs e)
		{
			string strMsg="简单LL(1)文法示例\r\n"
				+"shootsoft@yahoo.com.cn\r\n"
				+"软件0303 尹君 3125030328";
			string strCation="关于";
			MessageBox.Show(this,strMsg, strCation, MessageBoxButtons.OK,
				MessageBoxIcon.Information);
		}
		#endregion
	}
}

⌨️ 快捷键说明

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