예제 #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);
                }
            }
        }
예제 #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);
                }
            }
        }
예제 #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));
            }
        }
예제 #4
0
 public void EjecutarRetorno(Simbolo retorno)
 {
     if (retorno.Objeto != null)
     {
         FExpresion    aux = (FExpresion)retorno.Objeto;
         NodoExpresion val = aux.ResolverExpresion(retorno.Ambito.Incerteza, retorno.Ambito.RutaArchivo);
         if (TitusNotifiaciones.ContarErrores() == 0)
         {
             TablaVariables.Tabla.Add(new Variables(Constante.TRetorno, Constante.TRetorno, Constante.TRetorno, val, null, retorno.Fila, retorno.Columna));
         }
     }
     else
     {
         TablaVariables.Tabla.Add(new Variables(Constante.TRetorno, Constante.TRetorno, Constante.TRetorno, null, null, retorno.Fila, retorno.Columna));
     }
 }
예제 #5
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);
        }
예제 #6
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();
                }
            }
        }
예제 #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);
            }
        }
예제 #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);
                }
            }
        }