private closure_word go_function(List <Item> tt, char w) { closure_word fff = new closure_word(); for (int i = 0; i < tt.Count; i++) { if (tt[i].VT.IndexOf('.') == tt[i].VT.Length - 1) { List <Item> t6 = new List <Item>(); t6.Add(tt[i]); fff.closure = t6; List <char> ssa = new List <char>(); ssa.Add(' '); fff.word = ssa; } else { if (w == tt[i].VT[tt[i].VT.IndexOf('.') + 1]) { string str = tt[i].VT; string temp_s = ""; for (int k = 0; k < str.Length; k++) //取出点后面的字符,并将点后移一位 { if (str[k] != '.') { temp_s = temp_s + str[k]; } else { temp_s = temp_s + str[k + 1] + '.'; k = k + 1; } } Item ttd = new Item(); ttd.VN = tt[i].VN; ttd.VT = temp_s; fff.closure = closure(ttd); //获得下一个状态的子集 List <char> word_form = new List <char>(); for (int ii = 0; ii < fff.closure.Count; ii++) { char aad = ' '; if (fff.closure[ii].VT.IndexOf('.') == fff.closure[ii].VT.Length - 1) { } else { aad = fff.closure[ii].VT[fff.closure[ii].VT.IndexOf('.') + 1]; } word_form.Add(aad); } fff.word = word_form; break; } } } return(fff); }
private void button7_Click(object sender, EventArgs e) { List <Item> temp_item = new List <Item>(); List <char> word_form = new List <char>(); listView1.Items.Clear(); L_arc.Clear(); state_word.Clear(); temp_I.Clear(); if (ItemC.Count == 0) { MessageBox.Show("请先确认文法"); // this.Close(); } else { //---------------------获得起始状态的#_Closure----------------------// temp_item.Add(ItemC[0]); for (int i = 0; i < ItemC.Count; i++) { if (ItemC[i].VN.ToString() == temp_item[0].VT) { Item tt = new Item(); tt.VN = ItemC[i].VN; tt.VT = '.' + ItemC[i].VT; temp_item.Add(tt); } } temp_item[0].VT = '.' + temp_item[0].VT; temp_I.Add(temp_item); for (int i = 0; i < temp_I[0].Count; i++) { char aad = temp_I[0][i].VT[temp_I[0][i].VT.IndexOf('.') + 1]; word_form.Add(aad); } state_word.Add(word_form); //----------------------------------------------------------------// int tmp2 = 0; for (int ii = 0; ii < temp_I.Count; ii++) { int tmp_num = temp_I[ii].Count; for (int jj = 0; jj < state_word[ii].Count; jj++) { closure_word cw = new closure_word(); cw = go_function(temp_I[ii], state_word[ii][jj]); //--------------------判断是否已经存在--------------------------------// Boolean fla = false; int num = 0; int p; for (p = 0; p < temp_I.Count; p++) { if (cw.closure.Count == temp_I[p].Count) { for (int pp = 0; pp < cw.closure.Count; pp++) { for (int ppp = 0; ppp < cw.closure.Count; ppp++) { if ((cw.closure[ppp].VN == temp_I[p][pp].VN) && (cw.closure[ppp].VT == temp_I[p][pp].VT)) { num++; break; } } } if (num == cw.closure.Count) { fla = true; break; } num = 0; } } //----------------------------------------------------------------------------------------// if (fla == false) { tmp_num--; if (tmp_num >= 0) { tmp2++; } state_word.Add(cw.word); temp_I.Add(cw.closure); NFANode ARC = new NFANode(); ARC.From = ii; ARC.To = tmp2; ARC.Word = state_word[ii][jj]; L_arc.Add(ARC); } else { fla = false; NFANode ARC = new NFANode(); ARC.From = ii; ARC.To = p; ARC.Word = state_word[ii][jj]; L_arc.Add(ARC); } } } ///////////////////////////////// listView1.Items.Clear(); for (int ab = 0; ab < temp_I.Count; ab++) { string asf = ""; for (int dsf = 0; dsf < temp_I[ab].Count; dsf++) { asf = asf + temp_I[ab][dsf].VN + "->" + temp_I[ab][dsf].VT + " "; } ListViewItem lvi = new ListViewItem(); lvi.Text = ab.ToString(); lvi.SubItems.Add(asf); listView1.Items.Add(lvi); } } }