public void Ejecutar(Entorno e) { Struct s = e.ObtenerStruct(idStructGenerador); if (s == null) { Console.WriteLine("No existe el struct " + idStructGenerador); return; } //Lista auxiliar para la asignacion de valores ArrayList lista_atributos = new ArrayList(); //Si se encontro el struct foreach (string identificador in identificadores) { //Si ya existe un identificador con el mismo nombre if (e.Existe(identificador)) { Console.WriteLine("Error ya existe un identificador con el nombre: " + identificador); continue; } //Si no existe el identificador Entorno atributos = new Entorno(); //Realizo la creacion de los atributos foreach (IInstruccion declaracion in s.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.InsertarObjeto(identificador, new Objeto(idStructGenerador, atributos)); } //Realizo la asignacion de valores si se tiene una inicializacion if (asignaciones != null) { string identificador = identificadores.Last.Value; Objeto objeto = (Objeto)e.Obtener(identificador); if (asignaciones.Count != objeto.GetNumeroDeAtributos()) { //Si solo viene una asignacion es posible que sea un objeto if (asignaciones.Count == 1) { //Si es un objeto if (asignaciones.First.Value.GetValor(e) is Entorno atributos && asignaciones.First.Value.GetTipo(e).Equals(Tipos.OBJETO)) { objeto.atributos = atributos; return; } } 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++; } } }
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++; } } }