📄 frmmain.cs
字号:
//输出到网页表格
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$>","<"+ SymbolSet.getInstance().StringNotEndall() + ">");
//输出终结符集合
strOutText=strOutText.Replace("<$Endall$>","<"+ SymbolSet.getInstance().StringEndall() + ">");
//输出产生式
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> </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> </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 + -