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); }
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(""); } }
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; } }
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); }
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++; } } }