예제 #1
0
        private void muestra_tabla_analisis(Gramatica g)
        {
            DataTable table = new DataTable();

            table.Columns.Add(" ");
            List <string> row_items;

            foreach (char c in g.Terminales)
            {
                if (c != '\u03B5')
                {
                    table.Columns.Add("" + c);
                }
            }

            for (int i = 0; i < g.TablaAnalisis.Count; i++)
            {
                row_items = new List <string>();
                row_items.Add(g.Producciones[i].LeftItems[0]);

                foreach (string item in g.TablaAnalisis[i])
                {
                    row_items.Add(item);
                }

                table.Rows.Add(row_items.ToArray());
            }

            dg_tabla_analisis.DataSource = table;
            for (int i = 0; i < table.Columns.Count; i++)
            {
                dg_tabla_analisis.Columns[i].Width = 80;
                dg_tabla_analisis.Columns[i].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                dg_tabla_analisis.Columns[i].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
            }

            dg_tabla_analisis.Columns[0].Width = 30;
        }
예제 #2
0
        private int evalua_cadena(Gramatica g, string entrada)
        {
            Stack <string> pila        = new Stack <string>();
            int            line_number = 0;

            entrada += "$";
            pila.Push("$");
            pila.Push(g.Producciones[0].LeftItems[0]);

            tb_pila_in.Text = "" + line_number + ": " + entrada + "\r\n";
            tb_pila_ev.Text = "" + line_number + ": " + "$" + g.Producciones[0].LeftItems[0] + "\r\n";
            line_number++;
            while (entrada.Length != 0 && pila.Count != 0)
            {
                string tope = pila.Pop();
                // si el elemento de la pila es terminal
                if (Produccion.IsTerminal(tope[0]))
                {
                    // Si el elemento del tope es igual al de la entrada, continua
                    // con el siguiente.
                    if (tope == "$" && tope == "" + entrada[0])
                    {
                        return(1);
                    }

                    if (tope[0] == entrada[0])
                    {
                        entrada = entrada.Remove(0, 1);
                    }
                    else
                    if (tope != "\u03B5")
                    {
                        return(0);
                    }
                }
                else // si el tope es un no terminal
                {
                    string element = busca_tabla_analisis(tope, "" + entrada[0]);
                    if (element != "")
                    {
                        List <string> invertidos = genera_tokens(element);
                        foreach (string s in invertidos)
                        {
                            pila.Push(s);
                        }
                    }
                    else
                    {
                        return(0);
                    }
                }

                // Guarda los datos de la iteración para mostrar la pila de evaluación

                string aux = "";
                foreach (string s in pila)
                {
                    aux = aux + s;
                }
                tb_pila_ev.Text += "" + line_number + ": " + aux + "\r\n";
                tb_pila_in.Text += "" + line_number + ": " + entrada + "\r\n";
                line_number++;
            }

            return(0);
        }
예제 #3
0
        private void btn_analizar_Click(object sender, EventArgs e)
        {
            Gramatica.GRAM_ERROR err_code;

            gram = new Gramatica();
            String[] lines = tb_gramatica.Lines;
            tb_recursiva.Text   = "";
            tb_factorizada.Text = "";
            tb_primero.Text     = "";
            tb_siguiente.Text   = "";

            // Si hay lineas que analizar...
            if (lines.Length != 0)
            {
                // Analiza las lineas de la gramatica y devielve el error.
                err_code = gram.AnalizaLineas(lines);

                // Si no hay errores
                if (err_code == Gramatica.GRAM_ERROR.NO_ERROR)
                {
                    // Si el tipo de gramatica no es regular o libre de contexto muestra error
                    if (gram.Type != Gramatica.TIPO_GRAMATICA.LIBRE_DE_CONTEXTO && gram.Type != Gramatica.TIPO_GRAMATICA.REGULAR)
                    {
                        tb_msg.Text = "Error, la gramática no es libre de contexto";
                        return;
                    }

                    // Elimina la recursividad por la izquierda
                    gram.elimina_recursividad();
                    foreach (Produccion prod in gram.Producciones)
                    {
                        tb_recursiva.Text += prod.Value + "\r\n";
                    }

                    // Factoriza la gramática
                    gram.factoriza();
                    foreach (Produccion prod in gram.Producciones)
                    {
                        tb_factorizada.Text += prod.Value + "\r\n";
                    }


                    // Calcula el primero de la gramática
                    gram.calcula_primero();
                    for (int i = 0; i < gram.Primero.Count; i++)
                    {
                        Produccion prod = gram.Primero[i];
                        if (prod.LeftItems[0].Length > 1)
                        {
                            tb_primero.Text += "P(" + prod.LeftItems[0] + ")" + " =  { ";
                        }
                        else
                        {
                            tb_primero.Text += "P(" + prod.LeftItems[0] + ")" + "  =  { ";
                        }

                        for (int j = 0; j < prod.RightItems.Count; j++)
                        {
                            tb_primero.Text += prod.RightItems[j];
                            if (j < prod.RightItems.Count - 1)
                            {
                                tb_primero.Text += " , ";
                            }
                        }
                        tb_primero.Text += " }\r\n";
                    }

                    gram.calcula_siguiente();
                    for (int i = 0; i < gram.Siguiente.Count; i++)
                    {
                        Produccion prod = gram.Siguiente[i];
                        if (prod.LeftItems[0].Length > 1)
                        {
                            tb_siguiente.Text += "S(" + prod.LeftItems[0] + ")" + " =  { ";
                        }
                        else
                        {
                            tb_siguiente.Text += "S(" + prod.LeftItems[0] + ")" + "  =  { ";
                        }

                        for (int j = 0; j < prod.RightItems.Count; j++)
                        {
                            tb_siguiente.Text += prod.RightItems[j];
                            if (j < prod.RightItems.Count - 1)
                            {
                                tb_siguiente.Text += " , ";
                            }
                        }
                        tb_siguiente.Text += " }\r\n";
                    }
                    gram.genera_tabla_analisis();
                    muestra_tabla_analisis(gram);

                    tb_recursiva.Text   = tb_recursiva.Text.Replace("|", " | ");
                    tb_recursiva.Text   = tb_recursiva.Text.Replace("->", " -> ");
                    tb_factorizada.Text = tb_factorizada.Text.Replace("|", " | ");
                    tb_factorizada.Text = tb_factorizada.Text.Replace("->", " -> ");
                }
                else // Si hay errores...
                {
                    // Si el error es de gramatica vacía, muestra error de gramática vacía
                    if (err_code == Gramatica.GRAM_ERROR.EMPTY_GRAM)
                    {
                        tb_msg.Text = "Gramática vacia, no hay gramática a evaluar";
                    }
                    else // si no es error de gramática vacia, muestra mensaje de error en la gramática.
                    {
                        tb_msg.Text = "Error en la gramática.";
                    }
                }
            }
            else // Si no hay lineas que analizar, muestra error de gramática vacía.
            {
                tb_msg.Text = "Gramática vacia, no hay gramática a evaluar";
            }
        }