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; }
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); }
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"; } }