Exemple #1
0
 /// <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));
 }
Exemple #2
0
        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);
            }
        }