Пример #1
0
        public Tipos GetTipo(Entorno e)
        {
            Simbolo simbolo = e.Obtener(id);

            if (simbolo != null)
            {
                if (simbolo.IsObject())
                {
                    Objeto  objeto = (Objeto)simbolo;
                    Simbolo aux    = null;
                    foreach (string atributo in atributos)
                    {
                        aux = objeto.GetAtributo(atributo);
                        if (aux == null)
                        {
                            return(Tipos.NULL);
                        }
                        if (aux.IsObject())
                        {
                            objeto = (Objeto)aux;
                        }
                    }
                    if (aux == null)
                    {
                        return(Tipos.NULL);
                    }
                    return(aux.tipo);
                }
            }
            return(Tipos.NULL);
        }
Пример #2
0
        public void Ejecutar(Entorno e)
        {
            Tabla tabla = e.ObtenerTabla(nombreTabla);

            if (tabla == null)
            {
                Console.WriteLine("No se efectuo la instruccion select porque no se encontro la tabla " + nombreTabla);
                return;
            }
            //Si la tabla existe
            if (columnas == null)
            {
                //Si es un select *
                foreach (DataRow row in tabla.Select())
                {
                    foreach (DataColumn column in tabla.data.Columns)
                    {
                        Console.Write(row[column] + " ");
                    }
                    Console.WriteLine("");
                }
                return;
            }
            //Si es un select con columnas en especifico
            string[]  selectedColumns = columnas.Select(col => col.nombre).ToArray();
            DataTable dt = new DataView(tabla.data).ToTable(false, selectedColumns);

            foreach (DataRow row in dt.Select())
            {
                foreach (DataColumn column in dt.Columns)
                {
                    //Si es un acceso a un atributo de objeto
                    if (row[column] is Objeto objeto)
                    {
                        var query = columnas.Where(col => col.nombre.Equals(column.ColumnName)).FirstOrDefault();
                        if (query != null)
                        {
                            Simbolo aux = null;
                            foreach (String atributo in query.atributos)
                            {
                                aux = objeto.GetAtributo(atributo);
                                if (aux.IsObject())
                                {
                                    objeto = (Objeto)aux;
                                }
                            }
                            Console.Write(aux.valor + " ");
                        }
                    }
                    //Si es un atributo directo de la tabla
                    else
                    {
                        Console.Write(row[column] + " ");
                    }
                }
                Console.WriteLine("");
            }
        }
Пример #3
0
        public void Ejecutar(Entorno e)
        {
            Simbolo s = e.Obtener(id);

            if (s == null)
            {
                Console.WriteLine("No existe el identificador " + id + " en este entorno");
                return;
            }
            //Si existe el simbolo
            if (!s.IsObject())
            {
                Console.WriteLine("No se puede acceder a los atributos de " + id + " porque no es un objeto");
                return;
            }
            //Si es un objeto
            Objeto  o   = (Objeto)s;
            Simbolo aux = null;

            foreach (string atributo in atributos)
            {
                aux = o.GetAtributo(atributo);
                if (aux == null)
                {
                    Console.WriteLine("No se puede acceder al atributo " + atributo);
                    return;
                }
                //Si encontro el atributo verifico si es un objeto para actualizar mi objecto de acceso
                if (aux.IsObject())
                {
                    o = (Objeto)aux;
                }
            }
            //Una vez tengo el simbolo solicitado, actualizo su valor

            /******************************************
             *  AQUI ME FALTA LA COMPROBACION DE TIPOS
             *******************************************/

            Object val = valor.GetValor(e);

            if (aux != null)
            {
                aux.valor = val;
            }
        }
Пример #4
0
        public object GetValor(Entorno e)
        {
            Simbolo simbolo = e.Obtener(id);

            if (simbolo == null)
            {
                Console.WriteLine("No se encontro el identificador " + id + "en este entorno D:");
                return(null);
            }

            //Si se encontro el simbolo
            if (!simbolo.IsObject())
            {
                Console.WriteLine("El identificador " + id + " no es un objeto");
                return(null);
            }

            //Si es un objeto
            Objeto  objeto = (Objeto)simbolo;
            Simbolo aux    = null;

            foreach (string atributo in atributos)
            {
                aux = objeto.GetAtributo(atributo);
                if (aux == null)
                {
                    Console.WriteLine("El objeto " + id + " no contiene ningun atributo " + atributo);
                    return(null);
                }
                if (aux.IsObject())
                {
                    objeto = (Objeto)aux;
                }
            }
            //Si nuestro auxiliar es null
            if (aux == null)
            {
                Console.WriteLine("Error al acceder a los atributos de " + id);
                return(null);
            }

            return(aux.valor);
        }
Пример #5
0
        public void Ejecutar(Entorno e)
        {
            Simbolo s = e.Obtener(id);

            if (s == null)
            {
                Console.WriteLine("No se encontro el id " + id + " en este entorno");
                return;
            }
            //Si se encontro el simbolo
            if (!s.IsObject())
            {
                Console.WriteLine("El id " + id + " no es un objeto");
                return;
            }
            //Si es un objeto
            Objeto o = (Objeto)s;

            idStructGenerador = idStructGenerador.Equals("") ? o.idStructGenerador : idStructGenerador;
            if (!o.idStructGenerador.Equals(idStructGenerador, System.StringComparison.InvariantCultureIgnoreCase))
            {
                Console.WriteLine("No se puede asigar a un objeto tipo " + o.idStructGenerador + " una instancia de tipo " + idStructGenerador);
                return;
            }
            //Si los tipos de objeto coinciden
            Struct st = e.ObtenerStruct(idStructGenerador);
            //Lista auxiliar para la asignacion de valores
            ArrayList lista_atributos = new ArrayList();
            Entorno   atributos       = new Entorno();

            //Realizo la creacion de los atributos
            foreach (IInstruccion declaracion in st.declaraciones)
            {
                if (declaracion is DeclaracionStructComoAtributo)
                {
                    DeclaracionStructComoAtributo dec = (DeclaracionStructComoAtributo)declaracion;
                    dec.auxiliar = e;
                    dec.Ejecutar(atributos);
                    lista_atributos.Add(dec.id);
                }
                else
                {
                    declaracion.Ejecutar(atributos);
                    lista_atributos.Add(((Declaracion)declaracion).identificadores.First.Value);
                }
            }
            e.ActualizarObjeto(id, new Objeto(idStructGenerador, atributos));


            //Realizo la asignacion de valores si se tiene una inicializacion
            if (asignaciones != null)
            {
                string identificador = id;
                Objeto objeto        = (Objeto)e.Obtener(identificador);
                if (asignaciones.Count != objeto.GetNumeroDeAtributos())
                {
                    Console.WriteLine("El numero de parametros no coindice con la cantidad de atributos del objeto " + identificador);
                    return;
                }
                //Si la cantidad de atributos es la misma
                int pos = 0;
                foreach (IExpresion asig in asignaciones)
                {
                    /**********************************************
                     * NO ESTOY EFECTUANDO COMPROBACION DE TIPOS
                     ************************************************/
                    objeto.SetAtributo(lista_atributos[pos].ToString(), asig.GetValor(e));
                    pos++;
                }
            }
        }