/// <summary> /// 将当前节点与另一个节点连接 /// </summary> /// <param name="endStateNode">结束状态节点</param> /// <param name="route">连接路径</param> public void Connect(DFAStateNode endStateNode, char route) { edgeList.Add(new Edge <DFAStateNode>(this, endStateNode, route)); }
private void tsbtnReadAndConvert_Click(object sender, EventArgs e) { NFAStateNode.counter = 1; DFAStateNode.counter = 1; dgvNFA.Rows.Clear(); dgvDFA.Rows.Clear(); dgvMinDFA.Rows.Clear(); String regex = txtRegex.Text; if (regex != null && regex != "") { // 显示NFA的状态转换表------------------------------------------------- NFA nfa = new NFA(new RegularExpression(regex)); List <NFAStateNode> NFAAllStateNodes = nfa.AllStateNodes; List <char> NFARoutes = new List <char>(); NFARoutes.AddRange(nfa.Alphabet); NFARoutes.Add(NFA.NULL_CHAR); dgvNFA.ColumnCount = 1 + NFARoutes.Count; int rowIndex = dgvNFA.Rows.Add(); dgvNFA.Rows[rowIndex].Cells[0].Value = " "; for (int i = 0; i < NFARoutes.Count; i++) { dgvNFA.Rows[rowIndex].Cells[i + 1].Value = "经过路径 '" + NFARoutes.ElementAt(i) + "'"; } foreach (NFAStateNode node in NFAAllStateNodes) { int rowIndex1 = dgvNFA.Rows.Add(); if (nfa.StartStateNode == node) { if (nfa.EndStateNodes.Contains(node)) { dgvNFA.Rows[rowIndex1].Cells[0].Value = "状态 " + node.Id + " (初始/接受状态)"; } else { dgvNFA.Rows[rowIndex1].Cells[0].Value = "状态 " + node.Id + " (初始状态)"; } } else if (nfa.EndStateNodes.Contains(node)) { dgvNFA.Rows[rowIndex1].Cells[0].Value = "状态 " + node.Id + " (接受状态)"; } else { dgvNFA.Rows[rowIndex1].Cells[0].Value = "状态 " + node.Id; } for (int i = 0; i < NFARoutes.Count; i++) { if (node.Pass(NFARoutes.ElementAt(i)).Count == 0) { dgvNFA.Rows[rowIndex1].Cells[i + 1].Value = "到达状态:空"; } else { StringBuilder cellContent = new StringBuilder(); cellContent.Append("{"); bool isFirst = true; foreach (NFAStateNode destNode in node.Pass(NFARoutes.ElementAt(i))) { if (isFirst) { cellContent.Append(destNode.Id + ""); isFirst = false; } else { cellContent.Append(", " + destNode.Id); } } cellContent.Append("}"); dgvNFA.Rows[rowIndex1].Cells[i + 1].Value = "到达状态:" + cellContent.ToString(); } } } // 显示DFA的状态转换表------------------------------------------------- DFA dfa = new DFA(nfa); List <DFAStateNode> DFAAllStateNodes = dfa.AllStateNodes; List <char> DFARoutes = dfa.GetAlphabet(); dgvDFA.ColumnCount = 1 + DFARoutes.Count; int rowIndex2 = dgvDFA.Rows.Add(); dgvDFA.Rows[rowIndex2].Cells[0].Value = " "; for (int i = 0; i < DFARoutes.Count; i++) { dgvDFA.Rows[rowIndex2].Cells[i + 1].Value = "经过路径 '" + DFARoutes.ElementAt(i) + "'"; } foreach (DFAStateNode node in DFAAllStateNodes) { int rowIndex3 = dgvDFA.Rows.Add(); if (dfa.StartStateNode == node) { if (dfa.EndStateNodes.Contains(node)) { dgvDFA.Rows[rowIndex3].Cells[0].Value = "状态 " + node.Id + " (初始/接受状态)"; } else { dgvDFA.Rows[rowIndex3].Cells[0].Value = "状态 " + node.Id + " (初始状态)"; } } else if (dfa.EndStateNodes.Contains(node)) { dgvDFA.Rows[rowIndex3].Cells[0].Value = "状态 " + node.Id + " (接受状态)"; } else { dgvDFA.Rows[rowIndex3].Cells[0].Value = "状态 " + node.Id; } for (int i = 0; i < DFARoutes.Count; i++) { DFAStateNode destNode = node.Pass(DFARoutes.ElementAt(i)); if (destNode == null) { dgvDFA.Rows[rowIndex3].Cells[i + 1].Value = "到达状态:空"; } else { dgvDFA.Rows[rowIndex3].Cells[i + 1].Value = "到达状态:" + destNode.Id; } } } // 显示最小化DFA的状态转换表------------------------------------------------- dfa.MiniMize(); List <DFAStateNode> minDFAAllStateNodes = dfa.MinDFAAllStateNodes; List <char> minDFARoutes = dfa.GetAlphabet(); dgvMinDFA.ColumnCount = 1 + minDFARoutes.Count; int rowIndex4 = dgvMinDFA.Rows.Add(); dgvMinDFA.Rows[rowIndex4].Cells[0].Value = " "; for (int i = 0; i < minDFARoutes.Count; i++) { dgvMinDFA.Rows[rowIndex4].Cells[i + 1].Value = "经过路径 '" + minDFARoutes.ElementAt(i) + "'"; } foreach (DFAStateNode node in minDFAAllStateNodes) { int rowIndex5 = dgvMinDFA.Rows.Add(); if (dfa.MinDFAStartStateNode == node) { if (dfa.MinDFAEndStateNodes.Contains(node)) { dgvMinDFA.Rows[rowIndex5].Cells[0].Value = "状态 " + node.Id + " (初始/接受状态)"; } else { dgvMinDFA.Rows[rowIndex5].Cells[0].Value = "状态 " + node.Id + " (初始状态)"; } } else if (dfa.MinDFAEndStateNodes.Contains(node)) { dgvMinDFA.Rows[rowIndex5].Cells[0].Value = "状态 " + node.Id + " (接受状态)"; } else { dgvMinDFA.Rows[rowIndex5].Cells[0].Value = "状态 " + node.Id; } for (int i = 0; i < minDFARoutes.Count; i++) { DFAStateNode destNode = node.Pass(minDFARoutes.ElementAt(i)); if (destNode == null) { dgvMinDFA.Rows[rowIndex5].Cells[i + 1].Value = "到达状态:空"; } else { dgvMinDFA.Rows[rowIndex5].Cells[i + 1].Value = "到达状态:" + destNode.Id; } } } } else { MessageBox.Show("请输入正则表达式!", "错误", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning); } }