private void textoCodigo_TextChanged(object sender, EventArgs e) { cambios = true; bool resultado = Sintactico.analizar(textoCodigo.Text); if (resultado) { textoCodigo.ForeColor = Color.Black; } else { textoCodigo.ForeColor = Color.Red; } if (textoCodigo.TextLength == 0) { limpiar(); } }
private void btnCompilar_Click(object sender, EventArgs e) { try { limpiar(); if (textoCodigo.TextLength == 0) { MessageBox.Show("No se puede compilar esta vacío", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else if (load == true) { AnalizeCode(); } bool resultado = Sintactico.analizar(textoCodigo.Text); dtgSemantico.Rows.Clear(); ParseTree arbol = Sintactico.retornoArbol(textoCodigo.Text); RecorridoParseTree recorrido = new RecorridoParseTree(arbol); var nodos = recorrido.Recorrer(); int con = 0; int menor = 0, mayor = 0; foreach (var item in nodos) { #region Imprime los valores del arbol //MessageBox.Show("#" + con.ToString() //+ " *ITEM: " + item.ToString() //+ " *associativity: " + item.Associativity.ToString() //+ " *Span End position: " + item.Span.EndPosition //+ " *Span Length: " + item.Span.Length //+ " *Span : Location" + item.Span.Location //+ " *Term: " + item.Term.ToString() //+ " *TermErrorAlias: " + item.Term.ErrorAlias //+ " *itemtermName: " + item.Term.Name); #endregion #region Agregado de variables declaradas if (item.Term.Name.Equals("Declaracion")) { String tipodedato = null, variable = null, valor = null; menor = item.Span.EndPosition - item.Span.Length; mayor = item.Span.EndPosition; int totalDeclaradas = 0, priTLD = 3; foreach (var item1 in nodos) { if ((item1.Term.Name.Equals("tipodedato") || item1.Term.Name.Equals("id") || item1.Term.Name.Equals("numero") || item1.Term.Name.Equals("numero-decimal") || item1.Term.Name.Equals("cualquier") || item1.Term.Name.Equals("cualquiercar") || item1.Term.Name.Equals("<>in")) && (item1.Span.EndPosition <= mayor && (item1.Span.EndPosition - item1.Span.Length) >= menor)) { if (item1.Term.Name.Equals("tipodedato")) { tipodedato = item1.ToString().Split(' ').ElementAt(0); } if (item1.Term.Name.Equals("id")) { variable = item1.ToString().Split(' ').ElementAt(0); } if (item1.Term.Name.Equals("numero") || item1.Term.Name.Equals("numero-decimal") || item1.Term.Name.Equals("cualquier") || item1.Term.Name.Equals("cualquiercar") || item1.Term.Name.Equals("tipodedato")) { if (item1.Term.Name.Equals("tipodedato")) { valor = null; } else if (item1.Term.Name.Equals("cualquier")) { valor = item1.ToString().Split('"').ElementAt(1); } else { valor = item1.ToString().Split(' ').ElementAt(0); } } if (item1.Term.Name.Equals("<>in") && tipodedato.Equals("entero")) { int ejem = 0; valor = Interaction.InputBox("Leer por teclado", "Ingrese el valor de \"" + variable + "\" que es de tipo " + tipodedato, "0"); if (!int.TryParse(valor, out ejem)) { tbConsola.SelectionColor = Color.Red; tbConsola.Text += "Error la variable es de tipo entero, no puede asignar un valor distinto a este"; MessageBox.Show("Error de compilación", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } else if (item1.Term.Name.Equals("<>in") && tipodedato.Equals("doble")) { double ejem = 0; valor = Interaction.InputBox("Leer por teclado", "Ingrese el valor de \"" + variable + "\" que es de tipo " + tipodedato, "0"); if (!double.TryParse(valor, out ejem)) { tbConsola.SelectionColor = Color.Red; tbConsola.Text += "Error la variable es de tipo doble, no puede asignar un valor distinto a este"; MessageBox.Show("Error de compilación", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } else if (item1.Term.Name.Equals("<>in") && tipodedato.Equals("flotante")) { float ejem = 0; valor = Interaction.InputBox("Leer por teclado", "Ingrese el valor de \"" + variable + "\" que es de tipo " + tipodedato, "0"); if (!float.TryParse(valor, out ejem)) { tbConsola.SelectionColor = Color.Red; tbConsola.Text += "Error la variable es de tipo flotante, no puede asignar un valor distinto a este"; MessageBox.Show("Error de compilación", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } else if (item1.Term.Name.Equals("<>in") && tipodedato.Equals("cadena")) { valor = Interaction.InputBox("Leer por teclado", "Ingrese el valor de \"" + variable + "\" que es de tipo " + tipodedato, ""); } totalDeclaradas++; if (totalDeclaradas == priTLD) { #region Detecta si ya hay una variable declarada Boolean declarada = false; foreach (var itemTablaSimbolos in ts) { if (variable.Equals(itemTablaSimbolos.variable) && itemTablaSimbolos.tipo.Equals("Declaracion")) { declarada = true; break; } else { declarada = false; } } if (declarada == true) { resultado = false; tbConsola.SelectionStart = tbConsola.TextLength; tbConsola.SelectionLength = 0; tbConsola.SelectionColor = Color.Red; tbConsola.Text += ("Error está declarando dos o mas veces la variable \"" + variable + "\", ya se encuentra declarada") + Environment.NewLine; } else { ts.Add(new TablaSimbolos("Declaracion", tipodedato, variable, valor)); } priTLD = 2; totalDeclaradas = 0; #endregion } } } #region Si se declara una variable sin valor if (totalDeclaradas == 2) { #region Detecta si ya hay una variable declarada Boolean declarada = false; foreach (var itemTablaSimbolos in ts) { if (variable.Equals(itemTablaSimbolos.variable) && itemTablaSimbolos.tipo.Equals("Declaracion")) { declarada = true; break; } else { declarada = false; } } if (declarada == true) { resultado = false; tbConsola.SelectionStart = tbConsola.TextLength; tbConsola.SelectionLength = 0; tbConsola.SelectionColor = Color.Red; tbConsola.Text += ("Error está declarando dos o mas veces la variable \"" + variable + "\", ya se encuentra declarada") + Environment.NewLine; } else { ts.Add(new TablaSimbolos("Declaracion", tipodedato, variable, valor)); } #endregion } #endregion } #endregion #region Detecta si no se ha declarado alguna variable if (item.ToString().Contains("(id)")) { String var = item.ToString().Split(' ').ElementAt(0); Boolean encontrada = false; foreach (var item1 in ts) { if (var.Equals(item1.variable) && item1.tipo.Equals("Declaracion")) { encontrada = true; break; } else { encontrada = false; } } if (encontrada == true) { if (resultado == true) { resultado = true; } else { resultado = false; } } else { resultado = false; tbConsola.SelectionColor = Color.Red; tbConsola.Text += ("No se ha declarado la variable: " + var + " en la linea: " + item.Span.Location) + Environment.NewLine; } } #endregion } #region Error semantico no se pueden declarar variables que son palabras reservadas foreach (var item in nodos) { if (item.ToString().Contains("(id)")) { String[] var = item.ToString().Split(' '); foreach (var item1 in ts) { if (var[0].Equals(item1.variable) && item1.tipo.Equals("Reservada")) { tbConsola.SelectionColor = Color.Red; tbConsola.Text += ("Error no puede utilizar \"" + var[0] + "\" es una palabra reservada en la linea: " + item.Span.Location) + Environment.NewLine; resultado = false; } } } } #endregion #region Añade las variables declaradas al DataGridView desde la lista foreach (var item in ts) { dtgSemantico.Rows.Add(item.tipo, item.tipoDato, item.variable, item.valor); } #endregion #region Ejecución asignaciones, operaciones e impresiones if (resultado) { #region Asigna valores a las variables previamente declaradas int mayorope = 0, menorope = 0; String cadenaOperacion = null, recorridoope = null, variableasignacion = null, tipoDeclaracion = null; Boolean tipoIgual; int vueltas = 0; foreach (var item in nodos) { con++; #region Asigna valores a las variables con valor numérico if (item.Term.Name.Equals("asignacion")) { int primerif = 0; menor = item.Span.EndPosition - item.Span.Length; mayor = item.Span.EndPosition; String tipoVariableAsignacion = null, tipoOtrasId = null, otrasId = null; foreach (var itemTodo in nodos) { if (itemTodo.Span.EndPosition <= mayor && itemTodo.Span.EndPosition - itemTodo.Span.Length >= menor) { if (itemTodo.Term.Name.Equals("id") || itemTodo.Term.Name.Equals("numero") || itemTodo.Term.Name.Equals("numero-decimal") || itemTodo.Term.Name.Equals("+") || itemTodo.Term.Name.Equals("-") || itemTodo.Term.Name.Equals("*") || itemTodo.Term.Name.Equals("/") || itemTodo.Term.Name.Equals("^") || itemTodo.Term.Name.Equals("√") || itemTodo.Term.Name.Equals("(") || itemTodo.Term.Name.Equals(")")) { if (primerif != 0) { otrasId = itemTodo.ToString().Split(' ').ElementAt(0); cadenaOperacion += otrasId; if (itemTodo.Term.Name.Equals("id")) { foreach (DataGridViewRow variablesId in dtgSemantico.Rows) { if (otrasId.Equals(variablesId.Cells["Variable"].Value)) { tipoOtrasId = variablesId.Cells["TipoDeDato"].Value.ToString(); if (!tipoVariableAsignacion.Equals(tipoOtrasId)) { tbConsola.Text += "Error en las asignaciones los tipo de dato no pueden ser distintos"; MessageBox.Show("Error de compilación", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } } } } else { variableasignacion = itemTodo.ToString().Split(' ').ElementAt(0); foreach (DataGridViewRow variableAsign in dtgSemantico.Rows) { if (variableasignacion.Equals(variableAsign.Cells["Variable"].Value)) { tipoVariableAsignacion = variableAsign.Cells["TipoDeDato"].Value.ToString(); } } } primerif++; } } } String car, car2; //MessageBox.Show(cadenaOperacion); foreach (DataGridViewRow itemOpe in dtgSemantico.Rows) { car = Convert.ToString(itemOpe.Cells["Variable"].Value); car2 = Convert.ToString(itemOpe.Cells["Valor"].Value); if (car != "") { cadenaOperacion = cadenaOperacion.Replace(car, car2); } } ParseTreeNode resultadoOpe = Sintactico.operaciones(cadenaOperacion); recorridoope = RecorridoOperacion.resolverOperacion(resultadoOpe); foreach (DataGridViewRow itemTablaSimbolos in dtgSemantico.Rows) { if (variableasignacion.Equals(itemTablaSimbolos.Cells["Variable"].Value) && itemTablaSimbolos.Cells["Tipo"].Value.Equals("Declaracion")) { itemTablaSimbolos.Cells["Valor"].Value = recorridoope; } } cadenaOperacion = null; } #endregion #region Asigna valores a las variables con cualquier tipo de valor else if (item.Term.Name.Equals("asignacionCadena")) { String valor = null; menor = item.Span.EndPosition - item.Span.Length; mayor = item.Span.EndPosition; bool entro = false; foreach (var item1 in nodos) { if (item1.Span.EndPosition <= mayor && item1.Span.EndPosition - item1.Span.Length >= menor) { if (item1.Term.Name.Equals("id") && entro == false) { variableasignacion = item1.ToString().Split(' ').ElementAt(0); } if (item1.Term.Name.Equals("=")) { entro = true; } if (item1.Term.Name.Equals("cualquier") && entro == true) { valor += item1.ToString().Split('"').ElementAt(1); } if (item1.Term.Name.Equals("id") && entro == true) { foreach (DataGridViewRow valorId in dtgSemantico.Rows) { if (item1.ToString().Split(' ').ElementAt(0).Equals(valorId.Cells["Variable"].Value) && valorId.Cells["Tipo"].Value.Equals("Declaracion") && valorId.Cells["TipoDeDato"].Value.Equals("cadena")) { valor += valorId.Cells["Valor"].Value; } else if ((item1.ToString().Split(' ').ElementAt(0).Equals(valorId.Cells["Variable"].Value) && valorId.Cells["Tipo"].Value.Equals("Declaracion") && !valorId.Cells["TipoDeDato"].Value.Equals("cadena"))) { resultado = false; tbConsola.SelectionColor = Color.Red; tbConsola.Text = "Error no se puede concatenar un entero con una cadena"; MessageBox.Show("Error de compilación", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } } } } foreach (DataGridViewRow itemTablaSimbolos in dtgSemantico.Rows) { if (variableasignacion.Equals(itemTablaSimbolos.Cells["Variable"].Value) && itemTablaSimbolos.Cells["Tipo"].Value.Equals("Declaracion")) { itemTablaSimbolos.Cells["Valor"].Value = valor; } } } #endregion } #endregion #region Imprime valores de variables, impresiones complejas, numeros etc. foreach (var item in nodos) { #region Imprime valores individuales if (item.Term.Name.Equals("impresion")) { menor = item.Span.EndPosition - item.Span.Length; mayor = item.Span.EndPosition; foreach (var item1 in nodos) { if ((item1.Term.Name.Equals("id")) && (item1.Span.EndPosition <= mayor && (item1.Span.EndPosition - item1.Span.Length) >= menor)) { foreach (DataGridViewRow itemTablaSimbolos in dtgSemantico.Rows) { if (item1.ToString().Split(' ').ElementAt(0).Equals(itemTablaSimbolos.Cells["Variable"].Value)) { if (itemTablaSimbolos.Cells["Valor"].Value == null) { tbConsola.Text += (itemTablaSimbolos.Cells["Variable"].Value + " Variable sin valor asignado") + Environment.NewLine; } else { tbConsola.Text += (itemTablaSimbolos.Cells["Valor"].Value.ToString() + Environment.NewLine); } } } } else if ((item1.Term.Name.Equals("cualquier")) && (item1.Span.EndPosition <= mayor && (item1.Span.EndPosition - item1.Span.Length) >= menor)) { tbConsola.Text += (item1.ToString().Split('"').ElementAt(1)) + Environment.NewLine; } else if ((item1.Term.Name.Equals("numero") || (item1.Term.Name.Equals("numero-decimal"))) && (item1.Span.EndPosition <= mayor && (item1.Span.EndPosition - item1.Span.Length) >= menor)) { tbConsola.Text += (item1.ToString().Split(' ').ElementAt(0)) + Environment.NewLine; } } } #endregion #region Imprime valores Complejos if (item.Term.Name.Equals("impresionCompleja")) { menor = item.Span.EndPosition - item.Span.Length; mayor = item.Span.EndPosition; foreach (var item1 in nodos) { if ((item1.Term.Name.Equals("cualquier")) && (item1.Span.EndPosition <= mayor && (item1.Span.EndPosition - item1.Span.Length) >= menor)) { tbConsola.Text += (item1.ToString().Split('"').ElementAt(1)); } if ((item1.Term.Name.Equals("id")) && (item1.Span.EndPosition <= mayor && (item1.Span.EndPosition - item1.Span.Length) >= menor)) { foreach (DataGridViewRow itemTablaSimbolos in dtgSemantico.Rows) { if (item1.ToString().Split(' ').ElementAt(0).Equals(itemTablaSimbolos.Cells["Variable"].Value)) { if (itemTablaSimbolos.Cells["Valor"].Value == null) { tbConsola.Text += (itemTablaSimbolos.Cells["Variable"].Value + " Variable sin valor asignado"); } else { tbConsola.Text += (itemTablaSimbolos.Cells["Valor"].Value.ToString()); } } } } else if ((item1.Term.Name.Equals("numero") || (item1.Term.Name.Equals("numero-decimal"))) && (item1.Span.EndPosition <= mayor && (item1.Span.EndPosition - item1.Span.Length) >= menor)) { tbConsola.Text += (item1.ToString().Split(' ').ElementAt(0)) + Environment.NewLine; } } tbConsola.Text += Environment.NewLine; } #endregion #endregion if (item.Term.Name.Equals("condicional")) { menor = item.Span.EndPosition - item.Span.Length; mayor = item.Span.EndPosition; foreach (var item1 in nodos) { if ((item1.Span.EndPosition <= mayor && (item1.Span.EndPosition - item1.Span.Length) >= menor)) { //Si quiero hacer el if, aquí está la magia nodos.Remove(item1); } } } } tbConsola.Text += ("Compilación correcta") + Environment.NewLine; } else { tbConsola.SelectionColor = Color.Red; MessageBox.Show("Error de compilación", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } ts.Clear(); LlenadoTablaSimbolos(); #endregion } catch (NullReferenceException ex) { MessageBox.Show("Excepción " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }