Exemple #1
0
        public void EjecutarSi(Simbolo si)
        {
            FSi           fsi       = (FSi)si.Objeto;
            NodoExpresion condicion = fsi.Condicion.ResolverExpresion(fsi.Incerteza, fsi.RutaArchivo);

            if (TitusNotifiaciones.ContarErrores() == 0 && condicion.Tipo == Constante.TBool)
            {
                //agregar error
                if (TitusNotifiaciones.ContarErrores() == 0 && condicion.Booleano)
                {
                    EjecutarInstrucciones(si.Ambito.TablaSimbolo);
                    SacarAmbito(si.Ambito.TablaSimbolo);
                }
                else
                {
                    if (fsi.Sino != null)
                    {
                        EjecutarInstrucciones(fsi.Sino.TablaSimbolo);
                        SacarAmbito(fsi.Sino.TablaSimbolo);
                    }
                }
            }
            else
            {
                if (TitusNotifiaciones.ContarErrores() == 0)
                {
                    TabError error = new TabError();
                    error.InsertarFila(Constante.ErroEjecucion, "Se esperaba un valor Bool no uno de tipo: " + condicion.Tipo, fsi.RutaArchivo, si.Fila.ToString(), si.Columna.ToString());
                    TitusNotifiaciones.setDatosErrores(error);
                }
            }
        }
Exemple #2
0
        public void EjecutarMientras(Simbolo mientras)
        {
            FMientras     fmientras = (FMientras)mientras.Objeto;
            NodoExpresion condicion = fmientras.Condicion.ResolverExpresion(fmientras.Incerteza, fmientras.RutaArchivo);

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

                        SacarAmbito(fmientras.ambito.TablaSimbolo);
                    }
                    if (TablaVariables.IsDetener())
                    {
                        TablaVariables.SacarVariable();
                    }
                }
                else
                {
                    TabError error = new TabError();
                    error.InsertarFila(Constante.ErroEjecucion, "Se esperaba un valor Bool no uno de tipo: " + condicion.Tipo, fmientras.RutaArchivo, mientras.Fila.ToString(), mientras.Columna.ToString());
                    TitusNotifiaciones.setDatosErrores(error);
                }
            }
        }
Exemple #3
0
        public void EjecutarDeclaracion(Simbolo global)
        {
            FExpresion expresion = (FExpresion)global.Objeto;

            if (expresion != null)
            {
                NodoExpresion valor = expresion.ResolverExpresion(expresion.Incerteza, expresion.RutaArchivo);
                if (TitusNotifiaciones.ContarErrores() == 0)
                {
                    if (global.Tipo == Constante.TString)
                    {
                        if (valor.Tipo == Constante.TString || valor.Tipo == Constante.TNumber || valor.Tipo == Constante.TBool)
                        {
                            valor.Tipo = valor.Tipo;
                            TablaVariables.Tabla.Add(new Variables(global.Tipo, global.Nombre, Constante.TVariable, valor, null, global.Fila, global.Columna));
                        }
                        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 (global.Tipo == Constante.TNumber)
                    {
                        if (valor.Tipo == Constante.TNumber || valor.Tipo == Constante.TBool)
                        {
                            valor.Tipo = valor.Tipo;
                            TablaVariables.Tabla.Add(new Variables(global.Tipo, global.Nombre, Constante.TVariable, valor, null, global.Fila, global.Columna));
                        }
                        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 (global.Tipo == Constante.TBool)
                    {
                        if (valor.Tipo == Constante.TBool)
                        {
                            valor.Tipo = valor.Tipo;
                            TablaVariables.Tabla.Add(new Variables(global.Tipo, global.Nombre, Constante.TVariable, valor, null, global.Fila, global.Columna));
                        }
                        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
            {
                TablaVariables.Tabla.Add(new Variables(global.Tipo, global.Nombre, Constante.TVariable, null, null, global.Fila, global.Columna));
            }
        }
Exemple #4
0
        public void LlenarGlobal()
        {
            //metemos las variables globales a la tabla y los metodos del primer archivo
            foreach (Simbolo global in Inicio.Global.TablaSimbolo)
            {
                switch (global.Rol)
                {
                case Constante.DECLARACION:
                    if (!TablaVariables.BuscarNombre(global.Nombre))
                    {
                        EjecutarDeclaracion(global);
                    }
                    else
                    {
                        TabError error = new TabError();
                        error.InsertarFila(Constante.ErroEjecucion, "Ya hay declarado un metodo o variable con el nombre " + global.Nombre, global.RutaArchivo, global.Fila.ToString(), global.Columna.ToString());
                        TitusNotifiaciones.setDatosErrores(error);
                    }
                    break;

                case Constante.TPrincipal:
                    if (TablaVariables.Tabla[0].Nombre != Constante.TPrincipal)
                    {
                        TablaVariables.Tabla[0] = new Variables(Constante.TPrincipal, Constante.TPrincipal, Constante.TPrincipal, global.Objeto, global.Ambito, global.Fila, global.Columna);
                    }
                    else
                    {
                        TabError error = new TabError();
                        error.InsertarFila(Constante.ErroEjecucion, "Ya hay declarado un metodo principal", global.RutaArchivo, global.Fila.ToString(), global.Columna.ToString());
                        TitusNotifiaciones.setDatosErrores(error);
                    }

                    break;

                case Constante.FUNCION:
                    if (TablaVariables.BuscarVariable(global.Nombre) == null)
                    {
                        if (TablaVariables.BuscarMetodo(global.Nombre, (FFuncion)global.Objeto) == false)
                        {
                            TablaVariables.Tabla.Add(new Variables(global.Tipo, global.Nombre, Constante.TMetodo, global.Objeto, global.Ambito, global.Fila, global.Columna));
                        }
                        else
                        {
                            TabError error = new TabError();
                            error.InsertarFila(Constante.ErroEjecucion, "Ya hay declarado un metodo con el nombre " + global.Nombre + " y los mismos parametros", global.RutaArchivo, global.Fila.ToString(), global.Columna.ToString());
                            TitusNotifiaciones.setDatosErrores(error);
                        }
                    }
                    else
                    {
                        TabError error = new TabError();
                        error.InsertarFila(Constante.ErroEjecucion, "Ya hay declarada una variable con el metodo " + global.Nombre, global.RutaArchivo, global.Fila.ToString(), global.Columna.ToString());
                        TitusNotifiaciones.setDatosErrores(error);
                    }
                    break;
                }
            }
        }
Exemple #5
0
 public void EjecutarPrincipal()
 {
     if (TitusNotifiaciones.ContarErrores() == 0)
     {
         if (TablaVariables.Tabla[0].Nombre == Constante.TPrincipal)
         {
             EjecutarInstrucciones(TablaVariables.Tabla[0].Ambito.TablaSimbolo);
         }
         else
         {
             TabError error = new TabError();
             error.InsertarFila(Constante.ErroEjecucion, "No existe metodo principal", Inicio.Ruta, "1", "1");
             TitusNotifiaciones.setDatosErrores(error);
         }
     }
 }
Exemple #6
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);
        }
Exemple #7
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);
            }
        }
Exemple #8
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);
                }
            }
        }
Exemple #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);
            }
        }
Exemple #10
0
 public void When(TabError @event)
 {
 }