Esempio n. 1
0
        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]);

        }
Esempio n. 2
0
        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;

        }
Esempio n. 3
0
        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;
        }
Esempio n. 4
0
        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;
            }

        }
Esempio n. 5
0
        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;


        }
Esempio n. 6
0
        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());

        }
Esempio n. 7
0
        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;
        }
Esempio n. 8
0
        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]);
        }