Ejemplo n.º 1
0
        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();
            }
        }
Ejemplo n.º 2
0
        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);
            }
        }