예제 #1
0
파일: LR Canonico.cs 프로젝트: Jeld2016/LR1
        private List <Gramatica> CerraduraS(Gramatica C)
        {
            int  ApProd = 0;
            char B;

            List <Gramatica> E = new List <Gramatica>();

            ApProd = Producciones.IndexOf(C.Produc);
            for (int j = 0; j < Der[ApProd].Count(); j++)
            {
                if (Der[ApProd][j] >= 65 && Der[ApProd][j] <= 90)
                {
                    B = Der[ApProd][j];
                    if (j - 1 >= 0)
                    {
                        char ant = Der[ApProd][j - 1];
                        if (ant < 65 || ant > 90 && ant == 176)
                        {
                            E = AgregaProd(Conjuntos[0], B, Der[ApProd][j + 1]);
                        }
                        else
                        {
                            E = AgregaProd(Conjuntos[0], B, '$');
                        }
                    }
                    else
                    {
                        E = AgregaProd(Conjuntos[0], B, '$');
                    }
                }
            }
            return(E);
        }
예제 #2
0
파일: LR Canonico.cs 프로젝트: Jeld2016/LR1
        private Gramatica Ir_a(Gramatica E, char X)
        {
            Gramatica Aux;
            string    RePun;

            RePun = E.Produc.Replace("°" + X, X + "°");
            Aux   = new Gramatica(RePun, E.Prim);
            //AgregaProd(E, X, E.Prim);

            return(Aux);
        }
예제 #3
0
파일: LR Canonico.cs 프로젝트: Jeld2016/LR1
        private void CreaTabla()
        {
            //Funcion Ir_Falsa
            for (int i = 0; i < Conjuntos.Count(); i++)
            {
                for (int k = 0; k < X.Count; k++)
                {
                    bool             term = true;
                    List <Gramatica> Aux  = new List <Gramatica>();
                    for (int j = 0; j < Conjuntos[i].Count; j++)
                    {
                        for (int l = 0; l < Conjuntos[i][j].Produc.Count(); l++)
                        {
                            if (Conjuntos[i][j].Produc[l] == 176)
                            {
                                if (X[k] > 65 && X[k] < 90)
                                {
                                    term = false;
                                }
                                if (l + 1 != Conjuntos[i][j].Produc.Count())
                                {
                                    if (Conjuntos[i][j].Produc[l + 1] == X[k])
                                    {
                                        Gramatica result = Ir_a(Conjuntos[i][j], X[k]);
                                        Aux.Add(result);
                                    }
                                }
                            }
                        }
                    }
                    for (int result = 0; result < Aux.Count; result++)
                    {
                        for (int rec = 0; rec < Aux[result].Produc.Count(); rec++)
                        {
                            if (Aux[result].Produc[rec] == 176)
                            {
                                if (rec + 1 < Aux[result].Produc.Count())
                                {
                                    if (Aux[result].Produc[rec + 1] >= 65 && Aux[result].Produc[rec + 1] <= 90)
                                    {
                                        Aux = AgregaProdS(Aux, Aux[result].Produc[rec + 1], Aux[result].Prim);
                                    }
                                }
                            }
                        }
                    }


                    bool repetir = false;
                    for (int rp = 0; rp < Conjuntos.Count; rp++)
                    {
                        repetir = Repeticion(Conjuntos[rp], Aux);
                        if (repetir)
                        {
                            if (term)
                            {
                                orAc.Add(i);
                                Acciones.Add("d" + rp);
                                orPri.Add(X[k]);
                                break;
                            }
                            else
                            {
                                orAc.Add(i);
                                Acciones.Add("" + rp);
                                orPri.Add(X[k]);
                                break;
                            }
                        }
                    }
                }
            }
            string A;

            string[] div;
            // Producciones sin el punto
            for (int i = 0; i < Producciones.Count; i++)
            {
                A = Producciones[i].Replace("°", "");
                ProSP.Add(A);
            }

            for (int i = 0; i < Conjuntos.Count; i++)
            {
                for (int j = 0; j < Conjuntos[i].Count; j++)
                {
                    for (int k = 0; k < Conjuntos[i][j].Produc.Count(); k++)
                    {
                        //aqui
                        //div = Conjuntos[i][j].Produc.Split('➳');
                        div = SplitFlecha(Conjuntos[i][j].Produc);
                        if (div[0].Length == 1)
                        {
                            if (Conjuntos[i][j].Produc[k] == '°' && k == Conjuntos[i][j].Produc.Count() - 1)
                            {
                                string cambio = Conjuntos[i][j].Produc.Replace("°", "");
                                for (int l = 0; l < ProSP.Count; l++)
                                {
                                    if (cambio == ProSP[l])
                                    {
                                        orAc.Add(i);
                                        Acciones.Add("r" + l);
                                        orPri.Add(Conjuntos[i][j].Prim);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            orAc.Add(1);
            Acciones.Add("Aceptado");
            orPri.Add('$');
        }
예제 #4
0
파일: LR Canonico.cs 프로젝트: Jeld2016/LR1
        private void button1_Click(object sender, EventArgs e)
        {
            Aumentada();
            button2.Visible = true;
            List <Gramatica> E = new List <Gramatica>();

            E.Add(new Gramatica(Producciones[0], '$'));


            C = Cerradura(E);
            Conjuntos.Add(C);


            bool repeat = true;

            for (int i = 0; i < Der.Count(); i++)
            {
                for (int j = 0; j < Der[i].Count(); j++)
                {
                    if (X.Count == 0 && Der[i][j] != 176)
                    {
                        X.Add(Der[i][j]);
                    }
                    else
                    {
                        for (int k = 0; k < X.Count; k++)
                        {
                            if (Der[i][j] == X[k] || Der[i][j] == 176)
                            {
                                repeat = true;
                                k      = X.Count;
                            }
                            else
                            {
                                repeat = false;
                            }
                        }

                        if (!repeat)
                        {
                            X.Add(Der[i][j]);
                        }

                        repeat = true;
                    }
                }
            }
            for (int i = 0; i < Conjuntos.Count(); i++)
            {
                for (int k = 0; k < X.Count; k++)
                {
                    List <Gramatica> Aux = new List <Gramatica>();
                    for (int j = 0; j < Conjuntos[i].Count; j++)
                    {
                        for (int l = 0; l < Conjuntos[i][j].Produc.Count(); l++)
                        {
                            if (Conjuntos[i][j].Produc[l] == 176)
                            {
                                if (l + 1 != Conjuntos[i][j].Produc.Count())
                                {
                                    if (Conjuntos[i][j].Produc[l + 1] == X[k])
                                    {
                                        Gramatica result = Ir_a(Conjuntos[i][j], X[k]);
                                        Aux.Add(result);
                                    }
                                }
                            }
                        }
                    }
                    for (int result = 0; result < Aux.Count; result++)
                    {
                        for (int rec = 0; rec < Aux[result].Produc.Count(); rec++)
                        {
                            if (Aux[result].Produc[rec] == 176)
                            {
                                if (rec + 1 < Aux[result].Produc.Count())
                                {
                                    if (Aux[result].Produc[rec + 1] >= 65 && Aux[result].Produc[rec + 1] <= 90)
                                    {
                                        Aux = AgregaProdS(Aux, Aux[result].Produc[rec + 1], Aux[result].Prim);
                                    }
                                }
                            }
                        }
                    }

                    bool repetir = false;
                    for (int rp = 0; rp < Conjuntos.Count; rp++)
                    {
                        repetir = Repeticion(Conjuntos[rp], Aux);
                        if (repetir)
                        {
                            break;
                        }
                    }

                    if (Aux.Count != 0 && !repetir)
                    {
                        Conjuntos.Add(Aux);
                    }
                }
            }
            CreaTabla();

            TAnalisisS.Columns.Add("Estado", "Estado");
            for (int i = 0; i < X.Count; i++)
            {
                if (X[i] >= 97)
                {
                    TAnalisisS.Columns.Add(X[i].ToString(), X[i].ToString());
                }
            }
            TAnalisisS.Columns.Add("$", "$");
            for (int i = 0; i < X.Count; i++)
            {
                if (X[i] < 97)
                {
                    TAnalisisS.Columns.Add(X[i].ToString(), X[i].ToString());
                }
            }
            for (int i = 0; i < Conjuntos.Count; i++)
            {
                TAnalisisS.Rows.Add();
            }
            for (int i = 0; i < orAc.Count; i++)
            {
                TAnalisisS.Rows[orAc[i]].Cells[0].Value = orAc[i];
                for (int j = 0; j < TAnalisisS.ColumnCount; j++)
                {
                    if (orPri[i].ToString() == TAnalisisS.Columns[j].HeaderText)
                    {
                        TAnalisisS.Rows[orAc[i]].Cells[j].Value = Acciones[i];
                    }
                }
            }
        }