public override object ejecutar(Entorno entorno, Reporte reporte)
        {
            Objeto objeto = new Objeto(nombre, new Dictionary <string, Simbolo>(), new Dictionary <string, Tipo>(), reporte);

            foreach (Instruccion declaracion in declaracionesObjetos)
            {
                if (declaracion == null)
                {
                    continue;
                }
                NuevaDeclaracion nuevaDeclaracion = (NuevaDeclaracion)declaracion;


                Simbolo literalEvaluado;
                Simbolo variable;



                if (nuevaDeclaracion.literal != null)
                {
                    literalEvaluado = nuevaDeclaracion.literal.evaluar(entorno, reporte);

                    if (literalEvaluado.tipo.tipo != nuevaDeclaracion.tipo.tipo)
                    {
                        throw new util.ErrorPascal(0, 0, "No se puede declarar la variable/constante \"" + nuevaDeclaracion.id + "\". Tipos de dato incorrecto", "semántico", reporte);
                    }

                    variable = new Simbolo(literalEvaluado.valor, new Tipo(nuevaDeclaracion.tipo.tipo, null), nuevaDeclaracion.id);
                }
                else
                {
                    variable = new Simbolo(null, new Tipo(nuevaDeclaracion.tipo.tipo, null), nuevaDeclaracion.id);
                }

                if (entorno.existeVariable(nuevaDeclaracion.id) || entorno.existeConstante(nuevaDeclaracion.id))
                {
                    throw new util.ErrorPascal(0, 0, "Este id: \"" + nuevaDeclaracion.id + "\" ya existe en este ambito", "semántico", reporte);
                }

                if (nuevaDeclaracion.isVariable)
                {
                    objeto.agregarPropiedad(nuevaDeclaracion.id, nuevaDeclaracion.tipo);
                    //variable.tipo.tipoAuxiliar = nombre;
                    objeto.setValor(nuevaDeclaracion.id, variable);
                }
                else
                {
                    // entorno.declararConstante(nuevaDeclaracion.id, variable);
                }
            }

            entorno.declararType(nombre, new Simbolo(objeto, new Tipo(Tipos.OBJECT, nombre), nombre), linea, columna);

            return(null);
        }
Exemple #2
0
        public override object ejecutar(Entorno entorno, Reporte reporte)
        {
            Simbolo type = entorno.obtenerVariable(nombre);

            if (type.tipo.tipo != Tipos.OBJECT)
            {
                throw new util.ErrorPascal(0, 0, "La variable " + nombre + " no es un objeto", "nombre", reporte);
            }

            Objeto  objeto = (Objeto)type.valor;
            Simbolo valor  = expresion.evaluar(entorno, reporte);

            //valor.tipo.tipoAuxiliar = nombre;
            objeto.setValor(parametro, valor);

            return(null);
        }