void barren() { List<rule> nrl = new List<rule>(rule_list); Y.Add(""); int i = 0; do { ++i; debv.Items.Add(" Step " + i); foreach (rule r in nrl) { debv.Items.Add(r.head.ToString()); } List<String> tmp = new List<String>(); foreach (rule item in nrl) { foreach (String s in item.sub) { if (s.Length == 1) { if (vt_list.Contains(s) || s == ex.ToString()) { tmp.Add(item.head.ToString()); break; } } else { String sub = ""; for (int j = 0; j < s.Length; j++) { if (vt_list.Contains(s[j].ToString()) || Y[i - 1].Contains(s[j].ToString())) { sub += s[j]; } else { break; } } if (sub.Length == s.Length) { tmp.Add(item.head.ToString()); break; } } } } Y.Add(Y[i - 1] + string.Join("", tmp)); foreach (String S in tmp) { rule B = new rule(); foreach (rule R in nrl) { if (R.head.ToString() == S) { B = R; break; } } nrl.Remove(B); } } while (Y[i - 1] != Y[i]); }
private void emp_Click(object sender, EventArgs e) { emptrul(); List<rule> nrl = new List<rule>(); List<String> Wi = new List<String>(); foreach (char ch in W.Last()) { Wi.Add(ch.ToString()); } foreach (rule R in rl2) { List<String> tmp = new List<String>(); foreach (String s in R.sub) { if (s != ex.ToString()) { tmp.Add(s); } } rule B = new rule(); B.head = R.head; B.sub = new List<String>(tmp); nrl.Add(B); } rl2 = new List<rule>(nrl); nrl.Clear(); foreach (rule R in rl2) { List<String> tmp = new List<String>(); foreach (String s in R.sub) { if (s.Length > 1) { String st = ""; foreach (char ch in s) { if (Wi.Contains(ch.ToString())) { st += ch; } } if (st != "") { double b = st.Length, d = 0; d = Math.Pow(2, b) - 1; int a = 0; // Double to int conversion can overflow. try { a = Convert.ToInt32(d); } catch (System.OverflowException) { } for (int ai = a; a >= 0; --a, ai = a) { String comb = ""; foreach (char ch in s) { if (vn2.Contains(ch.ToString())) { if (ai % 2 == 1) { comb += ch; ai /= 2; } else { ai /= 2; } } else { comb += ch; } } tmp.Add(comb); } } } } foreach (String s in tmp) { debv.Items.Add(s); } rule B = new rule(); B.head = R.head; B.sub = new List<String>(R.sub.Concat(tmp).Distinct()); nrl.Add(B); } rl2 = new List<rule>(); foreach (rule R in nrl) { List<String> tmp = new List<String>(); foreach (String s in R.sub) { if (s != R.head.ToString() && s != "") { tmp.Add(s); } } rule B = new rule(); B.head = R.head; B.sub = new List<String>(tmp); rl2.Add(B); } rules2.Clear(); /* foreach (rule R in rl2) { rules2.Items.Add(R.head + ">" + string.Join("|", R.sub.ToArray())); }*/ if (Wi.Contains(targ)) { String alf = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"; Alf = new List<String>((alf.Split(',').Except(vn2))); Random r = new Random(); vn2.Add(Alf[r.Next(Alf.Count)]); rule B = new rule(); String trt = ""; trt += targ; trt += "|"; trt += "!"; String[] trg = trt.Split('|'); B.head = vn2.Last()[0]; B.sub = new List<String>(trg); nrl = new List<rule>(); nrl.Add(B); targ = vn2.Last(); foreach (rule R in rl2) { nrl.Add(R); } rl2 = new List<rule>(nrl); } foreach (rule R in rl2) { rules2.Items.Add(R.head + ">" + string.Join("|", R.sub.ToArray())); } ntarg.Text = targ; newnt.Text = String.Join(",", vn2); newt.Text = String.Join(",", vt2); gen2.Enabled = true; bar.Enabled = false; emp.Enabled = false; cycl.Enabled = true; }
private void cycl_Click(object sender, EventArgs e) { cycles(); List<rule> nrl = new List<rule>(); List<set> srl = new List<set>(); foreach (set S in N) { List<String> acc = new List<String>(); if (S.sub.Last() != "") { List<String> tim = new List<String>(); foreach (char ch in S.sub.Last()) { tim.Add(ch.ToString()); } foreach (rule R in rl2) { if (R.head.ToString() == S.head) { foreach (String s in R.sub) { if (!tim.Contains(s)) { acc.Add(s); } } } } rule B = new rule(); B.head = S.head[0]; B.sub = new List<String>(acc); nrl.Add(B); srl.Add(S); } else { foreach (rule R in rl2) { if (R.head.ToString() == S.head) { nrl.Add(R); } } } } foreach (set S in srl) { List<String> tim = new List<String>(); foreach (char ch in S.sub.Last()) { tim.Add(ch.ToString()); } foreach (rule R in nrl) { if (R.head.ToString() == S.head) { foreach (rule R1 in nrl) { if (tim.Contains(R1.head.ToString())) { R.sub = new List<String>(R.sub.Concat((R1.sub)).Distinct()); } } } } } rl2 = new List<rule>(nrl); rules2.Clear(); foreach (rule R in nrl) { rules2.Items.Add(R.head.ToString() + ">" + string.Join("|", R.sub)); } cycl.Enabled = false; }
void deleted(ListView rul, List<rule> rl, Button g) { foreach (ListViewItem item in rul.SelectedItems) { rule R = new rule(); rule B = new rule(); String lin = item.Text.Substring(0, 1); R.head = lin[0]; foreach (rule i in rl) { if (i.head == R.head) { B = i; } } rl.Remove(B); rul.Items.Remove(item); } if (rul.Items.Count < 1) { g.Enabled = false; } }
private void bar_Click(object sender, EventArgs e) { rl2 = new List<rule>(); rules2.Clear(); debv.Clear(); barren(); gen2.Enabled = true; List<String> dterm; vn2 = new List<string>(); vt2 = new List<string>(vt_list); for (int i = 0; i < Y.Last().Length; i++) { if (vn_list.Contains(Y.Last()[i].ToString())) { vn2.Add(Y.Last()[i].ToString()); } } dterm = new List<String>(vn_list.Except(vn2)); newnt.Text = String.Join(",", vn2); newt.Text = String.Join(",", vt_list); foreach (rule R in rule_list) { if (vn2.Contains(R.head.ToString())) { List<String> tm = new List<String>(); foreach (String s in R.sub) { foreach (String i in dterm) { if (s.Contains(i)) { tm.Add(s); } } } rule B = new rule(); B = R; foreach (String s in tm.Distinct()) { B.sub.Remove(s); } rl2.Add(B); rules2.Items.Add(B.head + ">" + string.Join("|", B.sub.ToArray())); } } debv.Items.Add(" vn: "); foreach (String s in vn2) { debv.Items.Add(s); } debv.Items.Add(" vt: "); foreach (String s in vt2) { debv.Items.Add(s); } bar.Enabled = false; rs.Enabled = true; }
void generation(List<rule> rl, ListView to, List<chain> el, List<String> neterm) { to.Clear(); debv.Clear(); DateTime date1 = DateTime.Now; debv.Items.Add(date1.ToLongTimeString()); List<chain> chl = new List<chain>(); List<String> exort = new List<String>(); el.Clear(); el.Add(new chain("", "")); chl.Add(new chain(targ, targ)); pb.Value = pb.Minimum; int jj = 0; rule Res = new rule(); for (int i = 0; i<chl.Count; i++) { it.Text = i.ToString(); chain c = new chain("", ""); c = chl[i]; String str = c.data; String ts = ""; foreach (char ch in str) { if (!neterm.Contains(ch.ToString())) { ts += ch; } } if (ts.Length <= max.Value && ts.Length != str.Length) { foreach (char ch in str) { if (neterm.Contains(ch.ToString())) { rule B = new rule(); foreach (rule R in rl) { if (R.head == ch) { B = R; break; } } foreach (String s in B.sub) { Application.DoEvents(); if (str.Length == 1) { chl.Add(new chain(s, c.parents + "->" + s)); exort.Add(s); } else { String beg = ""; String fin = ""; try { beg = str.Substring(0, str.IndexOf(ch)); } catch (Exception) { throw; } try { fin = str.Substring(str.IndexOf(ch) + 1, str.Length - str.IndexOf(ch) - 1); } catch (Exception) { throw; } String sw = beg + s + fin; sw = sw.Replace(ex.ToString(), ""); int kost = sw.Length - ts.Length; if (!exort.Contains(sw) && kost<30) { chl.Add(new chain(sw, c.parents + "->" + sw)); exort.Add(sw); } //debv.Items.Add(" из " + str + " заменили первое вхождение " + ch.ToString() + " получили " +sw); } } break; } } } else if (ts.Length == str.Length) { el.Add(c); } double j = ((double)i / (int)(chl.Count)) * 100; if (jj < Convert.ToInt32(j)) { jj = Convert.ToInt32(j); } pb.Value = jj; pb.CreateGraphics().DrawString(jj.ToString() + "%", new Font("Microsoft Sans Serif", (float)8.25, FontStyle.Regular), Brushes.Black, new PointF(pb.Width / 2 - 10, pb.Height / 2 - 7)); } el.Remove(el.First()); el.Sort(delegate (chain p1, chain p2) { return p1.data.Length.CompareTo(p2.data.Length); }); pb.Value = pb.Maximum; pb.CreateGraphics().DrawString(pb.Maximum + "%", new Font("Microsoft Sans Serif", (float)8.25, FontStyle.Regular), Brushes.Black, new PointF(pb.Width / 2 - 10, pb.Height / 2 - 7)); foreach (chain c in el) { if (c.data.Length >= min.Value && c.data.Length <= max.Value) { to.Items.Add(c.data.Replace(ex.ToString(), "")); } } date1 = DateTime.Now; debv.Items.Add(date1.ToLongTimeString()); }
String newrule(String lin) { clrrules(); if (lin.Length < 1) { MessageBox.Show("Пустое правило", "Ошибка"); return ""; } rule R = new rule(); R.sub = new List<String>(); String[] str = lin.Split('>'); List<String> temp = new List<string>(str); R.head = temp.First()[0]; R.sub = new List<string>(temp.Last().Split('|')); if (term.Text == "" || nterm.Text == "") { MessageBox.Show("Не задан список терминалов или нетерминалов", "Ошибка"); return ""; } if (!vn_list.Contains(R.head.ToString()) || temp.First().ToString().Length > 1) { MessageBox.Show("Левая часть должна состоять из одного нетерминала", "Ошибка"); return ""; } foreach (String s in R.sub) { for (int i = 0; i < s.Length; i++) { if (!vt_list.Contains(s[i].ToString()) && !vn_list.Contains(s[i].ToString()) && s[i] != ex) { MessageBox.Show("В правой части содержится неизвестный символ " + s[i], "Ошибка"); return ""; } } } foreach (ListViewItem s in rules.Items) { if (R.head == s.Text.Substring(0, 1)[0]) { MessageBox.Show("Правило для " + R.head.ToString() + " уже существует! Чтобы изменить правило, удалите его и внесите с изменениями", "Ошибка"); return ""; } } rule_list.Add(R); gen.Enabled = true; bar.Enabled = true; //emp.Enabled = true; return lin; }
void reachless() { debv.Clear(); targ = target.SelectedItem.ToString(); List<String> acc = new List<String>(); List<String> cros = new List<String>(); List<String> vi; List<String> vn3 = new List<String>(vn2); V.Add(targ); int i = 0; do { vi = new List<String>(); acc.Clear(); foreach (char ch in V[i]) { acc.Add(ch.ToString()); } for (int j = 0; j < V[i].Length; j++) { vi.Add(V[i][j].ToString()); } ++i; debv.Items.Add(" Step " + i); cros.Clear(); cros = new List<String>(vn3.Intersect(vi)); foreach (String item in cros) { rule B = new rule(); foreach (rule R in rl2) { if (R.head.ToString() == item) { B = R; break; } } foreach (String s in B.sub) { if (s.Length == 1) { if (vt2.Contains(s) || vn2.Contains(s)) { acc.Add(s); } } else { for (int j = 0; j < s.Length; j++) { if (vt2.Contains(s[j].ToString()) || vn2.Contains(s[j].ToString())) { acc.Add(s[j].ToString()); } } } } } for (int j = 0; j < V[i - 1].Length; j++) { vn3.Remove(V[i - 1][j].ToString()); } V.Add(String.Join("", acc.Distinct())); foreach (char s in V[i]) { debv.Items.Add(s.ToString()); } } while (V[i - 1] != V[i]); }