Esempio n. 1
0
        private cell MakeDFAcell(CloseSet C)
        {
            cell c = new cell();

            /*-------------------------------------------------------------------------*/
            for (int i = 0; i < C.CSet.Count; i++)
            {
                for (int j = 0; j < transymbol.Count; j++)
                {
                    if (C.CSet[i].next[j] != -2)
                    {
                        edge e = new edge();
                        e.StartState.StateName = i;
                        e.TransSymbol          = transymbol[j];
                        e.EndState.StateName   = C.CSet[i].next[j];
                        c.EdgeSet.Add(e);
                    }
                }
            }

            c.StartState.StateName = 0;
            c.EndState.StateName   = C.CSet.Count - 1;
            c.EdgeCount            = c.EdgeSet.Count;
            return(c);
        }
Esempio n. 2
0
        private cell MakeDFAcell(CloseSet C)
        {
            cell c = new cell();

            /*-------------------------------------------------------------------------*/
            for (int i = 0; i < C.CSet.Count; i++)
            {
                for (int j = 0; j < transymbol.Count; j++)
                {
                    edge e = new edge();
                    e.StartState.StateName = i;
                    e.TransSymbol          = transymbol[j];
                    e.EndState.StateName   = C.CSet[i].next[j];
                    c.EdgeSet.Add(e);
                }
            }
            /*-------------------------------------------------------------------------*/

            //for (int i = 0; i < C.CSet.Count; i++)
            //{
            //    edge e = new edge();
            //    e.StartState.StateName = i;
            //    e.TransSymbol = 'a';
            //    e.EndState.StateName = C.CSet[i].anext;
            //    c.EdgeSet.Add(e);
            //}

            //for (int i = 0; i < C.CSet.Count; i++)
            //{
            //    edge e = new edge();
            //    e.StartState.StateName = i;
            //    e.TransSymbol = 'b';
            //    e.EndState.StateName = C.CSet[i].bnext;
            //    c.EdgeSet.Add(e);
            //}
            /*-------------------------------------------------------------------------*/
            c.StartState.StateName = 0;
            c.EndState.StateName   = C.CSet.Count - 1;
            c.EdgeCount            = c.EdgeSet.Count;
            return(c);
        }
Esempio n. 3
0
        //读入dfa文件
        private void button6_Click(object sender, EventArgs e)
        {
            DialogResult result = openFileDialog1.ShowDialog();//显示对话框接返回值

            if (result == DialogResult.OK)
            {
                try
                {
                    string   CodeText = RWStream.ReadFile(openFileDialog1.FileName);
                    string[] CodePart = CodeText.Split('\n');

                    DFA.EdgeSet.Clear();
                    DFA.StartState.StateName = DFAb;
                    DFA.EndState.StateName   = DFAe;
                    transymbol.Clear();
                    MFAset = new CloseSet();
                    MFAes.Clear();
                    DFAes.Clear();

                    string[] nbstr = CodePart[0].Split(new char[] { ':', ';' });
                    DFAb = Convert.ToInt32(nbstr[1]);
                    string[] nestr  = CodePart[1].Split(new char[] { ':', '\r' });
                    string[] nestrs = nestr[1].Split(';');
                    for (int i = 0; i < nestrs.Length; i++)
                    {
                        if (nestrs[i] != "")
                        {
                            DFAes.Add(Convert.ToInt32(nestrs[i]));
                        }
                    }
                    string[] countstr = CodePart[2].Split(new char[] { ':' });
                    int      counts   = Convert.ToInt32(countstr[1]);
                    MFAmax = counts;
                    string[] s  = CodePart[3].Split(new char[] { ':' });
                    string[] ss = s[1].Split(';');



                    for (int i = 0; i < ss.Length; i++)
                    {
                        char[] c = ss[i].ToCharArray();
                        if ('a' <= c[0] && c[0] <= 'z')
                        {
                            transymbol.Add(c[0]);
                        }
                    }

                    for (int i = 4; i < CodePart.Length; i++)//建立dfa
                    {
                        if (CodePart[i] != "")
                        {
                            string[] edgeCh  = CodePart[i].Split('\t');
                            edge     newEdge = new edge();
                            newEdge.StartState.StateName = Convert.ToInt32(edgeCh[0]);
                            newEdge.TransSymbol          = Convert.ToChar(edgeCh[1]);
                            newEdge.EndState.StateName   = Convert.ToInt32(edgeCh[2]);
                            DFA.EdgeSet.Add(newEdge);
                        }
                    }

                    for (int i = 0; i < counts + 1; i++)
                    {
                        TSet newSet = new TSet();
                        for (int j = 0; j < transymbol.Count; j++)
                        {
                            newSet.next[j] = -2;
                        }
                        MFAset.CSet.Add(newSet);
                    }
                    for (int i = 4; i < CodePart.Length; i++)
                    {
                        string[] edgeCh = CodePart[i].Split(new char[] { ':', '\r', '\t' });
                        if (edgeCh[2] != "")
                        {
                            MFAset.CSet[Convert.ToInt32(edgeCh[0])]
                            .next[transymbol.IndexOf(Convert.ToChar(edgeCh[1]))] = Convert.ToInt32(edgeCh[2]);
                        }
                    }

                    DFA.EdgeCount = DFA.EdgeSet.Count;
                    //richTextBox1.Text = RWStream.ReadFile(openFileDialog1.FileName);
                    WriteDFA();
                    READFILE = true;
                    char[] ch = new char[1];
                    DFAToMFA(ch);
                    READFILE = false;
                }
                catch (Exception)
                {
                    MessageBox.Show("文件格式错误,请检查");
                }
            }
        }
Esempio n. 4
0
        private void NFAToDFA(char[] ch)
        {
            if (READFILE == false)
            {
                NormalToNFA(ch);
            }

            CloseSet C  = new CloseSet();
            TSet     T0 = new TSet();
            //T0.tSet.Add(NFAb);
            List <int> t = new List <int>();

            t.Add(NFAb);
            T0 = E_Closure(t);

            T0.tSet.Sort();
            //T0.Unrepeated();
            C.CSet.Add(T0);



            while (C.Check() != true)
            {
                int  order = C.Sign();
                TSet Ta    = new TSet();
                TSet Tb    = new TSet();

                List <TSet> Tedges = new List <TSet>();

                TSet T = new TSet();
                /*-------------------------------------------------------------------------*/
                for (int i = 0; i < C.CSet[order].tSet.Count; i++)
                {
                    T.tSet.Add(C.CSet[order].tSet[i]);
                }

                for (int i = 0; i < transymbol.Count; i++)
                {
                    TSet temp = E_Closure(Move(T, transymbol[i]));
                    temp.tSet.Sort();
                    Tedges.Add(temp);
                }

                for (int i = 0; i < transymbol.Count; i++)
                {
                    if (C.JoinNew(Tedges[i]) == -1)
                    {
                        C.CSet.Add(Tedges[i]);
                        C.CSet[order].next[i] = C.CSet.Count - 1;
                    }
                    else
                    {
                        C.CSet[order].next[i] = C.JoinNew(Tedges[i]);
                    }
                }
            }

            MFAset = C;
            DFAes.Add(MFAset.CSet.Count - 1);
            DFA = MakeDFAcell(C);

            cell   result = DFA;
            string output = null;

            output = output + "开始状态    接受符号    到达状态\n";
            for (int i = 0; i < result.EdgeCount; i++)
            {
                string s = String.Format("{0,-12}{1,-12}{2,-12}\n", result.EdgeSet[i].StartState.StateName, result.EdgeSet[i].TransSymbol, result.EdgeSet[i].EndState.StateName);
                output = output + s;
            }

            richTextBox2.Text = output;

            DFAb          = DFA.StartState.StateName;
            DFAe          = DFA.EndState.StateName;
            textBox4.Text = DFAb.ToString();
            textBox5.Text = DFAe.ToString();

            if (READFILE == false)
            {
                textBox5.Text = DFAe.ToString();
            }
            else
            {
                List <int> ends = new List <int>();
                DFAes = ends;
                for (int i = 0; i < C.CSet.Count; i++)
                {
                    if (C.CSet[i].tSet.Contains(NFAe) == true)
                    {
                        ends.Add(i);
                    }
                }
                string d = String.Join(",", ends.ToArray());
                textBox5.Text = d;
            }
        }
Esempio n. 5
0
        private void NFAToDFA(char[] ch)
        {
            NormalToNFA(ch);
            CloseSet C  = new CloseSet();
            TSet     T0 = new TSet();
            //T0.tSet.Add(NFAb);
            List <int> t = new List <int>();

            t.Add(NFAb);
            T0 = E_Closure(t);

            T0.tSet.Sort();
            //T0.Unrepeated();
            C.CSet.Add(T0);



            while (C.Check() != true)
            {
                int  order = C.Sign();
                TSet Ta    = new TSet();
                TSet Tb    = new TSet();

                List <TSet> Tedges = new List <TSet>();

                TSet T = new TSet();
                /*-------------------------------------------------------------------------*/
                for (int i = 0; i < C.CSet[order].tSet.Count; i++)
                {
                    T.tSet.Add(C.CSet[order].tSet[i]);
                }

                for (int i = 0; i < transymbol.Count; i++)
                {
                    TSet temp = E_Closure(Move(T, transymbol[i]));
                    temp.tSet.Sort();
                    Tedges.Add(temp);
                }

                for (int i = 0; i < transymbol.Count; i++)
                {
                    if (C.JoinNew(Tedges[i]) == -1)
                    {
                        C.CSet.Add(Tedges[i]);
                        C.CSet[order].next[i] = C.CSet.Count - 1;
                    }
                    else
                    {
                        C.CSet[order].next[i] = C.JoinNew(Tedges[i]);
                    }
                }
                /*-------------------------------------------------------------------------*/
                //Ta = E_Closure(Move(T,'a'));
                //Tb = E_Closure(Move(T,'b'));
                //Ta.tSet.Sort();
                //Tb.tSet.Sort();

                //if (C.JoinNew(Ta) == -1)
                //{
                //    C.CSet.Add(Ta);
                //    C.CSet[order].anext = C.CSet.Count-1;
                //}
                //else
                //{
                //    C.CSet[order].anext = C.JoinNew(Ta);
                //}
                //if (C.JoinNew(Tb) == -1)
                //{

                //    C.CSet.Add(Tb);
                //    C.CSet[order].bnext = C.CSet.Count - 1;
                //}
                //else
                //{
                //    C.CSet[order].bnext = C.JoinNew(Tb);
                //}
                /*-------------------------------------------------------------------------*/
            }

            MFAset = C;
            DFA    = MakeDFAcell(C);

            cell   result = DFA;
            string output = null;

            output = output + "开始状态    接受符号    到达状态\n";
            for (int i = 0; i < result.EdgeCount; i++)
            {
                string s = String.Format("{0,-12}{1,-12}{2,-12}\n", result.EdgeSet[i].StartState.StateName, result.EdgeSet[i].TransSymbol, result.EdgeSet[i].EndState.StateName);
                output = output + s;
            }

            richTextBox2.Text = output;

            DFAb          = DFA.StartState.StateName;
            DFAe          = DFA.EndState.StateName;
            textBox4.Text = DFAb.ToString();
            textBox5.Text = DFAe.ToString();
        }