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); }
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); }
//读入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("文件格式错误,请检查"); } } }
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; } }
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(); }