Example #1
0
        public Ejecutar(EjecutarSBS inicio)
        {
            Inicio = inicio;

            if (TitusNotifiaciones.ContarErrores() == 0)
            {
                BuscarErroresGlobal(Inicio);
                if (TitusNotifiaciones.ContarErrores() == 0)
                {
                    TablaVariables.Tabla.Add(new Variables());//asignamos el espacio para el principal
                    LlenarGlobal();
                }

                if (TitusNotifiaciones.ContarErrores() == 0)
                {
                    LlenarIncluyes(Inicio);
                }

                if (TitusNotifiaciones.ContarErrores() == 0)
                {
                    EjecutarPrincipal();
                }

                if (TitusNotifiaciones.ContarErrores() == 0)
                {
                    TitusNotifiaciones.MostrarImagen();
                }
            }
            if (TitusNotifiaciones.ContarErrores() > 0)
            {
                MessageBox.Show("Se encontraron error, favor revisar las notifiaciones", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                MessageBox.Show("Ejecucion realizada con exito.", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
Example #2
0
        public static Variables BuscarMetodo(String nombre, FLlamada lista)
        {
            int       cont       = TablaVariables.Tabla.Count - 1;
            bool      encontrado = false;
            Variables variable   = null;

            while (cont >= 0 && TitusNotifiaciones.ContarErrores() == 0 && !encontrado)
            {
                if (TablaVariables.Tabla[cont].Nombre == nombre && TablaVariables.Tabla[cont].Rol == Constante.TMetodo)
                {
                    FFuncion funcion = (FFuncion)Tabla[cont].Valor;

                    if (funcion.Parametros.Count == lista.Parametros.Count)
                    {
                        int     i      = 0;
                        Boolean estado = true;
                        while (i < funcion.Parametros.Count && estado)
                        {
                            NodoExpresion exp = (NodoExpresion)lista.Parametros[i].ResolverExpresion(Constante.DefaultDefineNumber, funcion.RutaArchivo);
                            if (!(exp.Tipo == funcion.Parametros[i].Tipo))
                            {
                                estado = false;
                            }
                            i++;
                        }
                        if (estado == true)
                        {
                            encontrado = !encontrado;
                            variable   = TablaVariables.Tabla[cont];
                        }
                    }
                }
                cont--;
            }
            return(variable);
        }
Example #3
0
        private String DibujarAST(int linea, int columna)
        {
            String           cadena = "";
            List <Variables> lista  = TablaVariables.BuscarMetodo(Id);

            if (lista.Count > 0)
            {
                foreach (Variables metodo in lista)
                {
                    int i      = 0;
                    int actual = i;
                    cadena = "digraph G{\n\tgraph[rankir = \"LR\"];\n\tnode[shape = box, fontsize = 16, fontname = \"Arial\", style = filled, fillcolor = grey88];\n\t";
                    cadena = cadena + "\t\tnodo" + actual.ToString() + "[label=\"" + metodo.Tipo + ": " + metodo.Nombre + "(";
                    FFuncion parametros = (FFuncion)metodo.Valor;
                    String   aux        = "";
                    String   para       = "";
                    foreach (Simbolo p in parametros.Parametros)
                    {
                        para = aux + p.Tipo;
                        aux  = para + ", ";
                    }

                    cadena = cadena + para + ")\"]\n";

                    if (metodo.Ambito != null)
                    {
                        foreach (Simbolo simbolo in metodo.Ambito.TablaSimbolo)
                        {
                            i++;
                            int actualambito = i;
                            cadena = cadena + GenerarArbolGraphics(ref i, simbolo);
                            cadena = cadena + "\t\tnodo" + actual.ToString() + "->nodo" + actualambito.ToString() + "\n";
                        }
                    }
                    cadena = cadena + "\n}";

                    try
                    {
                        String ruta      = RutaImagen + "\\";
                        String rutatxt   = ruta + "AST_" + metodo.Nombre + "_" + (TitusNotifiaciones.ListaImagenes.Images.Count + 1).ToString() + ".txt";
                        String rutaimg   = ruta + "AST_" + metodo.Nombre + "_" + (TitusNotifiaciones.ListaImagenes.Images.Count + 1).ToString() + ".png";
                        String nombreimg = "AST_" + metodo.Nombre + "_" + (TitusNotifiaciones.ListaImagenes.Images.Count + 1).ToString() + ".png";

                        /*if (File.Exists(rutaimg))
                         * {
                         *  File.Delete(rutaimg);
                         * }*/
                        File.WriteAllText(rutatxt, cadena);

                        ProcessStartInfo startInfo = new ProcessStartInfo("dot.exe");
                        startInfo.Arguments = "-Tjpg  " + @rutatxt + " -o " + @rutaimg;
                        Process.Start(startInfo);

                        System.Threading.Thread.Sleep(3000);

                        TitusNotifiaciones.MeterImagen(nombreimg, rutaimg);
                    }
                    catch
                    {
                    }
                }
            }
            else
            {
                TabError error = new TabError();
                error.InsertarFila(Constante.ErroEjecucion, "No se encontro ningun metodo con el nombre " + Id, RutaArchivo, linea.ToString(), columna.ToString());
                TitusNotifiaciones.setDatosErrores(error);
            }
            return(cadena);
        }
Example #4
0
        public void EjecutarAsignacion(Simbolo global)
        {
            FExpresion expresion = (FExpresion)global.Objeto;

            if (expresion != null)
            {
                NodoExpresion valor = expresion.ResolverExpresion(expresion.Incerteza, expresion.RutaArchivo);
                Variables     aux   = TablaVariables.BuscarVariable(global.Nombre);
                if (TitusNotifiaciones.ContarErrores() == 0)
                {
                    if (aux != null)
                    {
                        if (aux.Tipo == Constante.TString)
                        {
                            if (valor.Tipo == Constante.TString || valor.Tipo == Constante.TNumber || valor.Tipo == Constante.TBool)
                            {
                                valor.Tipo = valor.Tipo;
                                aux.Valor  = new NodoExpresion(valor);
                            }
                            else
                            {
                                TabError error = new TabError();
                                error.InsertarFila(Constante.ErroEjecucion, "No se puede asignar una variable de tipo " + global.Tipo + " un valor " + valor.Tipo, global.RutaArchivo, global.Fila.ToString(), global.Columna.ToString());
                                TitusNotifiaciones.setDatosErrores(error);
                            }
                        }
                        else if (aux.Tipo == Constante.TNumber)
                        {
                            if (valor.Tipo == Constante.TNumber || valor.Tipo == Constante.TBool)
                            {
                                valor.Tipo = valor.Tipo;
                                aux.Valor  = new NodoExpresion(valor);
                            }
                            else
                            {
                                TabError error = new TabError();
                                error.InsertarFila(Constante.ErroEjecucion, "No se puede asignar una variable de tipo " + global.Tipo + " un valor " + valor.Tipo, global.RutaArchivo, global.Fila.ToString(), global.Columna.ToString());
                                TitusNotifiaciones.setDatosErrores(error);
                            }
                        }
                        else if (aux.Tipo == Constante.TBool)
                        {
                            if (valor.Tipo == Constante.TBool)
                            {
                                valor.Tipo = valor.Tipo;
                                aux.Valor  = new NodoExpresion(valor);
                            }
                            else
                            {
                                TabError error = new TabError();
                                error.InsertarFila(Constante.ErroEjecucion, "No se puede asignar una variable de tipo " + global.Tipo + " un valor " + valor.Tipo, global.RutaArchivo, global.Fila.ToString(), global.Columna.ToString());
                                TitusNotifiaciones.setDatosErrores(error);
                            }
                        }
                    }
                    else
                    {
                        TabError error = new TabError();
                        error.InsertarFila(Constante.ErroEjecucion, "Variable no declarada: " + global.Nombre, global.RutaArchivo, global.Fila.ToString(), global.Columna.ToString());
                        TitusNotifiaciones.setDatosErrores(error);
                    }
                }
            }
        }
Example #5
0
        public void EjecutarSelecciona(Simbolo selecciona)
        {
            FSelecciona   fselecciona = (FSelecciona)selecciona.Objeto;
            NodoExpresion condicion   = fselecciona.Expresion.ResolverExpresion(fselecciona.Incerteza, fselecciona.RutaArchivo);

            if (TitusNotifiaciones.ContarErrores() == 0)
            {
                int     cont          = 0;
                int     posencontrado = -1;
                Boolean encontrado    = false;
                while (cont < fselecciona.Casos.Count && !TablaVariables.IsDetener() && !TablaVariables.IsRetorno() && TitusNotifiaciones.ContarErrores() == 0 && !TablaVariables.IsRetorno())
                {
                    if (fselecciona.Casos[cont].Tipo == condicion.Tipo)
                    {
                        if (!encontrado)
                        {
                            if (fselecciona.Casos[cont].Tipo == Constante.TNumber)
                            {
                                if (fselecciona.Casos[cont].ValNumero == condicion.Numero)
                                {
                                    EjecutarCaso(fselecciona.Casos[cont]);
                                    encontrado    = true;
                                    posencontrado = cont;
                                    SacarAmbito(fselecciona.Casos[cont].ambito.TablaSimbolo);
                                }
                            }
                            else
                            {
                                if (fselecciona.Casos[cont].ValCadena == condicion.Cadena)
                                {
                                    EjecutarCaso(fselecciona.Casos[cont]);

                                    SacarAmbito(fselecciona.Casos[cont].ambito.TablaSimbolo);
                                }
                            }
                        }

                        //seguimos ejcutando si no hay detener en el algun caso
                        if (encontrado && cont > posencontrado)
                        {
                            EjecutarCaso(fselecciona.Casos[cont]);

                            SacarAmbito(fselecciona.Casos[cont].ambito.TablaSimbolo);
                        }
                    }

                    cont++;
                }
                if (!encontrado && !TablaVariables.IsDetener() && !TablaVariables.IsRetorno() && TitusNotifiaciones.ContarErrores() == 0 && !TablaVariables.IsRetorno())
                {
                    if (fselecciona.Defecto != null)
                    {
                        EjecutarCaso(fselecciona.Defecto);
                    }
                }
                //si encontro un detener lo sacamos para que siga metiendo mas ambitos
                if (TablaVariables.IsDetener())
                {
                    TablaVariables.SacarVariable();
                }
            }
        }
Example #6
0
        public void EjecutarFuncion(Simbolo simbolo)
        {
            FLlamada  listaparametros = (FLlamada)simbolo.Objeto;
            Variables metodo          = TablaVariables.BuscarMetodo(simbolo.Nombre, listaparametros);

            if (metodo != null)
            {
                FFuncion funcion = (FFuncion)metodo.Valor;
                FLlamada llamada = (FLlamada)simbolo.Objeto;


                if (funcion.Parametros.Count == llamada.Parametros.Count)
                {
                    //metemos el return
                    //Variables retorno = new Variables(Constante.TRetorno, Constante.TRetorno, Constante.RETORNO, null, null, 0, 0);
                    //TablaVariables.Tabla.Add(retorno);
                    int cont = 0;
                    //meter variables de los parametros
                    while (cont < funcion.Parametros.Count && TitusNotifiaciones.ContarErrores() == 0)
                    {
                        FExpresion    f = (FExpresion)llamada.Parametros[cont];
                        NodoExpresion resultadoparametro = f.ResolverExpresion(funcion.Incerteza, funcion.RutaArchivo);
                        if (TitusNotifiaciones.ContarErrores() == 0)
                        {
                            if (funcion.Parametros[cont].Tipo == resultadoparametro.Tipo)
                            {
                                Variables parametro = new Variables(funcion.Parametros[cont].Tipo, funcion.Parametros[cont].Nombre, Constante.TVariable, resultadoparametro, null, simbolo.Fila, simbolo.Columna);
                                TablaVariables.Tabla.Add(parametro);
                            }
                            else
                            {
                                //error de asignacion del tipo de parametro
                                TabError error = new TabError();
                                error.InsertarFila(Constante.ErroEjecucion, "Se esperaba un tipo: " + funcion.Parametros[cont].Tipo + ", no un tipo: " + resultadoparametro.Tipo, funcion.RutaArchivo, resultadoparametro.Linea.ToString(), resultadoparametro.Columna.ToString());
                                TitusNotifiaciones.setDatosErrores(error);
                            }
                        }
                        cont++;
                    }

                    //ejecuatamos el metodo
                    if (TitusNotifiaciones.ContarErrores() == 0)
                    {
                        Ejecutar execute = new Ejecutar();
                        execute.EjecutarInstrucciones(metodo.Ambito.TablaSimbolo);

                        //obtenemos el valor del return

                        if (TablaVariables.IsRetorno())
                        {
                            TablaVariables.SacarVariable();
                        }
                        execute.SacarAmbito(metodo.Ambito.TablaSimbolo);
                        execute.SacarAmbito(funcion.Parametros);
                    }
                }
                else
                {
                    //error de cantidad de parametros
                    TabError error = new TabError();
                    error.InsertarFila(Constante.ErroEjecucion, "La funcion esperaba " + funcion.Parametros.Count + " parametros", funcion.RutaArchivo, simbolo.Fila.ToString(), simbolo.Columna.ToString());
                    TitusNotifiaciones.setDatosErrores(error);
                }
            }
            else
            {
                TabError error = new TabError();
                error.InsertarFila(Constante.ErroEjecucion, "No existe la funcion " + simbolo.Nombre + "()", simbolo.RutaArchivo, simbolo.Fila.ToString(), simbolo.Columna.ToString());
                TitusNotifiaciones.setDatosErrores(error);
            }
        }
Example #7
0
        public void EjecutarPara(Simbolo para)
        {
            FPara fpara = (FPara)para.Objeto;

            //ejecutamos la declaracion
            EjecutarDeclaracion(fpara.Declaracion);
            NodoExpresion condicion = fpara.Condicion.ResolverExpresion(fpara.Incerteza, fpara.RutaArchivo);

            if (TitusNotifiaciones.ContarErrores() == 0)
            {
                if (condicion.Tipo == Constante.TBool)
                {
                    while (TitusNotifiaciones.ContarErrores() == 0 && condicion.Booleano && !TablaVariables.IsRetorno() && !TablaVariables.IsDetener() && !TablaVariables.IsRetorno())
                    {
                        condicion = fpara.Condicion.ResolverExpresion(fpara.Incerteza, fpara.RutaArchivo);
                        if (condicion.Booleano)
                        {
                            EjecutarInstrucciones(fpara.ambito.TablaSimbolo);
                        }


                        if (TablaVariables.IsContinuar())
                        {
                            TablaVariables.SacarVariable();
                        }
                        condicion = fpara.Condicion.ResolverExpresion(fpara.Incerteza, fpara.RutaArchivo);
                        //sacamos el ambito
                        SacarAmbito(fpara.ambito.TablaSimbolo);
                        //realizamos la operacion ya sea ++ o --
                        if (fpara.Operacion == Constante.TAumento)
                        {
                            Variables var = TablaVariables.ObtenerTope();
                            if (var.Nombre == fpara.Declaracion.Nombre)
                            {
                                NodoExpresion val = (NodoExpresion)(var.Valor);
                                val.Numero = val.Numero + 1;
                                val.Cadena = val.Numero.ToString();
                            }
                        }
                        else
                        {
                            Variables var = TablaVariables.ObtenerTope();
                            if (var.Nombre == fpara.Declaracion.Nombre)
                            {
                                NodoExpresion val = (NodoExpresion)(var.Valor);
                                val.Numero = val.Numero - 1;
                                val.Cadena = val.Numero.ToString();
                            }
                        }
                    }

                    if (TablaVariables.IsDetener())
                    {
                        TablaVariables.SacarVariable();
                    }
                    //sacamos la variable de operacion
                    if (TablaVariables.ExisteVariableTope(fpara.Declaracion.Nombre))
                    {
                        TablaVariables.SacarVariable();
                    }
                }
                else
                {
                    TabError error = new TabError();
                    error.InsertarFila(Constante.ErroEjecucion, "Se esperaba un valor Bool no uno de tipo: " + condicion.Tipo, fpara.RutaArchivo, para.Fila.ToString(), para.Columna.ToString());
                    TitusNotifiaciones.setDatosErrores(error);
                }
            }
        }
Example #8
0
        public void EjecutarInstrucciones(List <Simbolo> instrucciones)
        {
            foreach (Simbolo instruccion in instrucciones)
            {
                if (TitusNotifiaciones.ContarErrores() == 0 && !TablaVariables.IsContinuar() && !TablaVariables.IsDetener() && !TablaVariables.IsRetorno())
                {
                    switch (instruccion.Rol)
                    {
                    case Constante.DECLARACION:
                        EjecutarDeclaracion(instruccion);
                        break;

                    case Constante.ASIGNACION:
                        EjecutarAsignacion(instruccion);
                        break;

                    case Constante.TDetener:
                        EjecutarDetener(instruccion);
                        break;

                    case Constante.TRetorno:
                        EjecutarRetorno(instruccion);
                        break;

                    case Constante.TContinuar:
                        EjecutarContinuar(instruccion);
                        break;

                    case Constante.TSelecciona:
                        EjecutarSelecciona(instruccion);
                        break;

                    case Constante.TMientras:
                        EjecutarMientras(instruccion);
                        break;

                    case Constante.THasta:
                        EjecutarHasta(instruccion);
                        break;

                    case Constante.TMostrar:
                        FMostrar mostrar = (FMostrar)instruccion.Objeto;
                        mostrar.Mostrar(instruccion.Fila, instruccion.Columna, mostrar.RutaArchivo);
                        break;

                    case Constante.TDibujarEXP:
                        FDibujarExpresion dexp = (FDibujarExpresion)instruccion.Objeto;
                        dexp.DibujarExpresion();
                        break;

                    case Constante.TDibujarAST:
                        FDibujarAST dast = (FDibujarAST)instruccion.Objeto;
                        dast.DibujarAst(instruccion.Fila, instruccion.Columna);
                        break;

                    case Constante.TPara:
                        EjecutarPara(instruccion);
                        break;

                    case Constante.LLAMADA_FUNCION:
                        EjecutarFuncion(instruccion);
                        break;

                    case Constante.TSi:
                        EjecutarSi(instruccion);
                        break;
                    }
                }
            }
        }
Example #9
0
        public void Mostrar(int Fila, int Columna, String ruta)
        {
            String cadena_nueva = "";
            String numero       = "";
            bool   posicion     = false;

            for (int i = 0; i < Cadena.Length && TitusNotifiaciones.ContarErrores() == 0; i++)
            {
                char letra = Cadena[i];
                if (posicion)
                {
                    if (letra == '}')
                    {
                        posicion = false;
                        try
                        {
                            int pos = Int32.Parse(numero);
                            if (pos <= Parametros.Count - 1)
                            {
                                NodoExpresion val = Parametros[pos].ResolverExpresion(Incerteza, ruta);
                                if (TitusNotifiaciones.ContarErrores() == 0)
                                {
                                    if (val.Tipo == Constante.TNumber)
                                    {
                                        cadena_nueva = cadena_nueva + val.Numero.ToString();
                                    }
                                    else if (val.Tipo == Constante.TString)
                                    {
                                        cadena_nueva = cadena_nueva + val.Cadena;
                                    }
                                    else
                                    {
                                        cadena_nueva = cadena_nueva + val.Cadena;
                                    }
                                }
                            }
                            else
                            {
                                TabError Error = new TabError();
                                Error.InsertarFila(Constante.ErroEjecucion, "Acceso fuera de rango", "pendient", Fila.ToString(), Columna.ToString());
                                TitusNotifiaciones.setDatosErrores(Error);
                            }
                        }
                        catch
                        {
                            TabError Error = new TabError();
                            Error.InsertarFila(Constante.ErroEjecucion, "El valor debe ser numerico mayor o igual a 0", "pendient", Fila.ToString(), Columna.ToString());
                            TitusNotifiaciones.setDatosErrores(Error);
                        }
                    }
                    else
                    {
                        numero = numero + letra;
                    }
                }
                else
                {
                    if (letra == '{')
                    {
                        posicion = true;
                        numero   = "";
                    }
                    else
                    {
                        cadena_nueva = cadena_nueva + letra;
                    }
                }
            }
            if (TitusNotifiaciones.ContarErrores() == 0)
            {
                TitusNotifiaciones.ImprimirConsola(cadena_nueva);
            }
        }