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); }
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); }