예제 #1
0
        public void SacarAmbito(List <Simbolo> variables)
        {
            int cont = variables.Count - 1;

            while (cont >= 0)
            {
                if (variables[cont].Rol == Constante.DECLARACION)
                {
                    if (TablaVariables.ExisteVariableTope(variables[cont].Nombre))
                    {
                        TablaVariables.SacarVariable(variables[cont].Nombre);
                    }
                }
                cont--;
            }
        }
예제 #2
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);
                }
            }
        }