/// <summary> /// 改变组号 /// </summary> /// <param name="state">要改变组号的状态号</param> /// <param name="newpos">新的组号</param> private void ChangPos(int state, int newpos) { for (int i = 0; i < node.Count; i++) { if (node[i].num == state) { Group.Node newNode = new Group.Node(newpos, node[i].num, node[i].accept); node.RemoveAt(i); node.Add(newNode); break; } } }
public List <DFAD.DFA> DMC(DFAD.DFA[] Dfas, string Starts, string Ends, string States) { bool isrepa = false; int starts = Convert.ToInt16(Starts); int[] ends = new int[Ends.Length]; string[] State = States.Split(','); List <int> node3 = new List <int>(); //终结状态组 List <int> node4 = new List <int>(); //非终结状态组 int[] st = new int[State.Length - 1]; for (int i = 0; i < State.Length - 1; i++) { st[i] = Convert.ToInt16(State[i]); } //得到所有的开始状态和结束状态 for (int i = 0; i < Ends.Length; i++) { ends[i] = Convert.ToInt16(Ends[i]); } for (int i = 0; i < st.Length; i++) { if (Ends.IndexOf(st[i].ToString()) != -1) { Group.Node node1 = new Group.Node(1, st[i], 0); node.Add(node1); node3.Add(node1.num); } else { Group.Node node1 = new Group.Node(0, st[i], 1); node.Add(node1); node4.Add(node1.num); } } //将所有的分组放入堆栈中 nodesStack.Push(node3); nodesStack.Push(node4); //到此为止堆栈中有两个元素,终态集合和非终态集合 while (nodesStack.Count != 0) { List <int> NeedGroup = new List <int>(); NeedGroup = nodesStack.Pop(); if (NeedGroup.Count > 1) { ComparePos(GetAllChar(Dfas), Dfas, NeedGroup); } } string txtTest = ""; for (int i = 0; i < node.Count; i++) { txtTest += "组号:" + node[i].pos.ToString() + "\t\t状态号:" + node[i].num.ToString() + "\t是否为非终结状态:" + node[i].accept.ToString() + "\r\n"; } System.IO.File.WriteAllText(@"c:\txtTest.test", txtTest); txtTest = ""; List <DFAD.DFA> newdfas = new List <DFAD.DFA>(); foreach (DFAD.DFA dfa in Del(Dfas, ChangeDFA(Dfas))) { DFAD.DFA newdfa = new DFAD.DFA(SearchPos(dfa.From), SearchPos(dfa.To), dfa.Varch); for (int i = 0; i < newdfas.Count; i++) { if (newdfa.From == newdfas[i].From && newdfa.To == newdfas[i].To && newdfa.Varch == newdfas[i].Varch) { isrepa = true; break; } else { isrepa = false; continue; } } if (isrepa == false) { newdfas.Add(newdfa); } } List <DFAD.DFA> result = new List <DFAD.DFA>(); for (int i = 0; i < newdfas.Count; i++) { txtTest += newdfas[i].From + "\t" + newdfas[i].Varch + "\t" + newdfas[i].To + "\r\n"; result.Add(newdfas[i]); } txtTest += "终结状态:"; for (int i = 0; i < ChangeDFA(Dfas).Count; i++) { if (ChangeDFA(Dfas)[i].accept == 0) { txtTest += ChangeDFA(Dfas)[i].pos.ToString() + ","; } } txtTest = txtTest.Substring(0, txtTest.Length - 1); txtTest += "\r\n开始状态:"; for (int i = 0; i < node.Count; i++) { if (node[i].num == starts) { txtTest += SearchPos(starts).ToString(); } } System.IO.File.WriteAllText(@"c:\result.dfa", txtTest); return(result); }