private void rutinaReturn(Cuadruplo cuad)
        {
            int tipo = 0;

            if (cuad.resultado != null)
            {
                valueReturn  = getValue(cuad.resultado.ToString(), ref tipo);
                contadorProg = pilaDeLLamadas[0];
                pilaDeLLamadas.RemoveAt(0);
                if (pilaDeLLamadas.Count != 0)
                {
                    if (tablaDeCuadruplos[contadorProg].resultado.ToString().Equals("") == false)
                    {
                        setValue(tablaDeCuadruplos[contadorProg].resultado.ToString(), valueReturn);
                        tipo = int.Parse(tablaDeCuadruplos[contadorProg].argumento2.ToString());
                        for (int i = 0; i < tipo; i++)
                        {
                            listaParametroLocales.RemoveAt(0);
                        }
                    }
                    contadorProg++;
                }
                else
                {
                    contadorProg = tablaDeCuadruplos.Count - 1;
                }
            }
            else
            {
            }
        }
        private void rutinaAritmetica(Cuadruplo cuad)
        {
            int    tipo = 0, tipo2 = 0;
            object val2 = getValue(cuad.argumento2.ToString(), ref tipo2), val1 = getValue(cuad.argumento1.ToString(), ref tipo);
            double resultado = 0;

            string ar1 = cuad.argumento1.ToString(), ar2 = cuad.argumento2.ToString();

            if (ar1[0] == '$') // si corresponde a un parametro
            {
                ar1 = ar1.Replace("$", "");

                tipo = int.Parse(ar1); // Regresa el apuntador a la lista de parametros

                val1 = listaParametroLocales[tipo - 1].valor;
            }
            if (ar2[0] == '$') //si corresponde a un parametro
            {
                ar2   = ar2.Replace("$", "");
                tipo2 = int.Parse(ar2);
                val2  = listaParametroLocales[tipo2 - 1].valor;
            }
            /* typear las variables */

            if (val1 != null && val2 != null)
            {
                switch (cuad.operador.ToString())
                {
                case "+":
                    resultado = double.Parse(val1.ToString()) + double.Parse(val2.ToString());
                    break;

                case "-":
                    resultado = double.Parse(val1.ToString()) - double.Parse(val2.ToString());
                    break;

                case "*":
                    resultado = double.Parse(val1.ToString()) * double.Parse(val2.ToString());
                    break;

                case "/":
                    resultado = double.Parse(val1.ToString()) / double.Parse(val2.ToString());
                    break;
                }
                setValue(cuad.resultado.ToString(), resultado);
            }
            else
            {
                if (val1 != null && val2 == null)
                {
                    if (cuad.operador.ToString().Equals("-"))
                    {
                        resultado = double.Parse(val1.ToString()) * -1;
                        setValue(cuad.resultado.ToString(), resultado);
                    }
                }
            }
        }
        private void Read(Cuadruplo cuad)
        {
            io.Close();
            io = new EntradaSalida(ListaDeCadenas);
            io.update(ListaDeCadenas);
            io.ShowDialog();

            setValue(cuad.resultado.ToString(), io.getVal);
            ListaDeCadenas.Add(io.getVal.ToString());
            io = new EntradaSalida(ListaDeCadenas);
            io.update(ListaDeCadenas);
            io.Show();
        }
        private void imprimir(Cuadruplo cuad)
        {
            int    t   = 0;
            object obj = getValue(cuad.argumento1.ToString(), ref t);

            if (obj != null)
            {
                this.ListaDeCadenas.Add(obj.ToString());

                io.update(ListaDeCadenas);
            }
            else
            {
                error          = true;
                errorSemantico = "No existe el argumento " + cuad.argumento1.ToString();
            }
        }
        private void rutinaGoto(Cuadruplo cuad)
        {
            int    tipo = 0, tipo2 = 0;
            object val2 = getValue(cuad.argumento2.ToString(), ref tipo2), val1 = getValue(cuad.argumento1.ToString(), ref tipo);
            bool   band = false;
            double v1 = 0, v2 = 0;

            if (cuad.operador.Equals("goto") == false)
            {
                v1 = double.Parse(val1.ToString());
                v2 = double.Parse(val2.ToString());
            }
            switch (cuad.operador.ToString())
            {
            case "goto":
                band = true;
                break;

            case "if <":
                if (v1 < v2)
                {
                    band = true;
                }
                break;

            case "if <=":
                if (v1 <= v2)
                {
                    band = true;
                }
                break;



            case "if >":
                if (v1 > v2)
                {
                    band = true;
                }
                break;

            case "if >=":
                if (v1 >= v2)
                {
                    band = true;
                }
                break;


            case "if ==":
                if (v1 == v2)
                {
                    band = true;
                }
                break;



            case "if !=":
                if (v1 != v2)
                {
                    band = true;
                }
                break;
            }

            if (band == true)
            {
                contadorProg = int.Parse(cuad.resultado.ToString());
            }
            else
            {
                contadorProg++;
            }
        }
        private void rutinaAsignacion(Cuadruplo cuad)
        {
            string res  = cuad.resultado.ToString();
            string arg1 = cuad.argumento1.ToString();
            string arg2 = cuad.argumento2.ToString();

            string[] separador = { "[", "]", " " };
            string[] arreglo; // nombre del arreglo y desplazamiento
            int      desp;

            string despArray;
            object value = null;
            int    tipo  = 0;
            double number;

            List <object> arr;

            if (res.Contains('[') == true) // si se le asigna a un arreglo  a[i] = x
            {
                arreglo   = res.Replace(" ", "").Split(separador, StringSplitOptions.RemoveEmptyEntries);
                res       = arreglo[0]; // nombre del arreglo
                despArray = arreglo[1];
                desp      = this.getDesplazamientoArray(res, despArray);
                if (desp != -1)
                {
                    try
                    {
                        value     = getValue(res, ref tipo);
                        arr       = value as List <object>;
                        value     = getValue(arg1, ref tipo);
                        arr[desp] = value;
                        value     = arr;
                        setValue(res, value);
                    }
                    catch
                    {
                        error          = true;
                        errorSemantico = "Error en acceso del arreglo " + res;
                    }
                }
            }
            else
            {
                if (arg1.Contains('[') == true)
                {
                    arreglo   = arg1.Replace(" ", "").Split(separador, StringSplitOptions.RemoveEmptyEntries);
                    arg1      = arreglo[0]; // nombre
                    despArray = arreglo[1];

                    desp = this.getDesplazamientoArray(arg1, despArray);
                    if (desp != -1)
                    {
                        try
                        {
                            value = getValue(arg1, ref tipo);
                            arr   = value as List <object>;
                            value = getValue(res, ref tipo);
                            value = arr[desp];
                            setValue(res, value);
                        }
                        catch
                        {
                            error          = true;
                            errorSemantico = "Error en acceso del arreglo " + res;
                        }
                    }
                }
                else
                {
                    bool result = double.TryParse(arg1, out number);
                    if (result)
                    {
                        value = number;
                    }
                    else
                    {
                        value = getValue(arg1, ref tipo);
                    }
                    if (value != null)
                    {
                        setValue(res, value);
                    }
                }
            }
        }
        public void procesaCuadruplos(Cuadruplo cuad)
        {
            string operador = cuad.operador.ToString();

            if (operador.Equals("*") || operador.Equals("/") || operador.Equals("+") || operador.Equals("-"))
            {
                this.rutinaAritmetica(cuad);
                contadorProg++;
            }
            else
            {
                if (operador.Equals("="))
                {
                    this.rutinaAsignacion(cuad);
                    contadorProg++;
                }
                else
                {
                    if (operador.Equals("goto") || operador.Equals("if <") || operador.Equals("if <=") || operador.Equals("if ==") || operador.Equals("if !=") || operador.Equals("if >") || operador.Equals("if >="))
                    {
                        this.rutinaGoto(cuad);
                    }
                    else
                    {
                        if (operador.Equals("param"))
                        {
                            int i = buscaSimbolo(cuad.resultado.ToString());
                            if (i != -1)
                            {
                                Simbolo s = tablaDeSimbolos[i];
                                parametrosGenerales.Insert(0, new Simbolo(s.nombre, s.valor, s.tipo, s.arreglo));
                                contadorProg++;
                            }
                            else
                            {
                                error          = true;
                                errorSemantico = "No existe el simbolo " + cuad.resultado.ToString();
                            }
                        }
                        else
                        {
                            if (operador.Equals("call f") || operador.Equals("call p"))
                            {
                                int i = buscaSimbolo(cuad.argumento1.ToString());

                                if (i != -1 && (tablaDeSimbolos[i].tipo.ToString().Equals("func") || tablaDeSimbolos[i].tipo.ToString().Equals("proc")))
                                {
                                    pilaDeLLamadas.Insert(0, contadorProg);
                                    Simbolo s = tablaDeSimbolos[i];
                                    contadorProg = (int)s.valor;
                                    // listaParametroLocales.Clear();
                                    for (i = 0; i < int.Parse(cuad.argumento2.ToString()); i++)
                                    {
                                        listaParametroLocales.Insert(0, parametrosGenerales[0]);
                                        parametrosGenerales.RemoveAt(0);
                                    }
                                    //listaParametroLocales.Reverse();
                                }
                                else
                                {
                                    error          = true;
                                    errorSemantico = "No existe el simbolo " + cuad.resultado.ToString();
                                }
                            }
                            else
                            {
                                if (operador.Equals("return"))
                                {
                                    this.rutinaReturn(tablaDeCuadruplos[contadorProg]);
                                }
                                else
                                {
                                    if (operador.Equals("print"))
                                    {
                                        imprimir(tablaDeCuadruplos[contadorProg]);
                                        contadorProg++;
                                    }
                                    else
                                    {
                                        if (operador.Equals("read"))
                                        {
                                            Read(tablaDeCuadruplos[contadorProg]);
                                            contadorProg++;
                                        }

                                        else
                                        {
                                            contadorProg++;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }