public object Ejecutar(TablaDeSimbolos ts) { TablaDeSimbolos tabla_local = new TablaDeSimbolos(); tabla_local.addPadre(ts); if (variable.Asignacion) { Tipo type = ts.getType(variable.Id); Operacion val = (Operacion)variable.Valor; object valor = val.Ejecutar(ts); salida.AddRange(val.getSalida()); if (valor != null) { if (Program.casteos.comprobarCasteo(type, valor)) { ts.setValor(variable.Id, valor); } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "No se puede convertir a" + ts.tipoAsignado(variable.Id))); } } } else { Simbolo new_simbol = new Simbolo(Program.getTipo(variable.Tipo.ToLower()), variable.Id); new_simbol.Sub_tipo = Tipo.VARIABLE; Operacion valor = (Operacion)variable.Valor; try { new_simbol.Valor = valor.Ejecutar(ts); if (new_simbol.Valor == null) { new_simbol.Valor = variable.Valor; } } catch (Exception) { new_simbol.Valor = valor; } tabla_local.AddLast(new_simbol); } while ((bool)expresion.Ejecutar(tabla_local)) { foreach (Instruccion item in instruccions) { if (item.getType() == Tipo.BREAK) { return(null); } if (item.getType() == Tipo.USER_TYPES || item.getType() == Tipo.FUNCION || item.getType() == Tipo.METODO || item.getType() == Tipo.PROCEDURE) { salida.Add(Program.buildError(item.getLine(), item.getColumn(), "Semantico", "No puede venir instruccion del tipo: " + item.getType() + " en un ambito local.")); } else { item.Ejecutar(tabla_local); salida.AddRange(item.getSalida()); item.clearSalida(); } } actualizacion.Ejecutar(tabla_local); } return(null); }
public object Ejecutar(TablaDeSimbolos ts) { if (ts.existID(new_var.Id)) { bool is_ok = true; foreach (string item in new_var.Lst_variables) { if (!ts.existID(item.ToString())) { is_ok = false; salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", item + " no esta declarada en este ambito.")); } } if (is_ok) { if (new_var.Real_type == Tipo.VARIABLE) { string name = new_var.Valor.GetType().Name; if (name.Equals("Map")) { Map new_map = (Map)new_var.Valor; Map maux = (Map)ts.getValor(new_var.Id); new_map.Clave = maux.Clave; if (new_map.comprobarTipo()) { ts.setValor(new_var.Id, new_map.Mapita); } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "No todos los atributos coinciden.")); } } if (name.Equals("Lista")) { Lista new_lista = (Lista)new_var.Valor; ts.setValor(new_var.Id, new_lista.Lista_valores); } else if (name.Equals("Variable")) { Variable aux_var = (Variable)new_var.Valor; if (ts.existID(aux_var.Id)) { object valor = ts.getValorByAttr(aux_var.Id, aux_var.Atributos); if (valor == null) { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "NO EXISTE ATRIBUTO")); } else { ts.setValor(new_var.Id, valor); } } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "Variable " + aux_var.Valor + " no se ha declarado.")); } } else if (name.Equals("Operacion")) { Tipo type = ts.getType(new_var.Id); Operacion val = (Operacion)new_var.Valor; object valor = val.Ejecutar(ts); salida.AddRange(val.getSalida()); if (valor != null) { if (Program.casteos.comprobarCasteo(type, valor)) { ts.setValor(new_var.Id, valor); } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "No se puede convertir a" + ts.tipoAsignado(new_var.Id))); } } } } else if (new_var.Real_type == Tipo.VARIABLE_ATRIBUTOS) { if (new_var.Instanciada) { try { Operacion val = (Operacion)new_var.Valor; object valor = val.Ejecutar(ts); if (!ts.setValorByAttr(new_var.Id, valor, new_var.Atributos)) { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "NO EXISTE ATRIBUTO")); } } catch { if (!ts.setValorByAttr(new_var.Id, new_var.Valor, new_var.Atributos)) { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "NO EXISTE ATRIBUTO")); } } } } } } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", new_var.Id + " no esta declarada en este ambito.")); } return(null); }