public override Objeto ejecutar() { if (tablaDeSimbolos.ExisteLaDeclaracion(clase_Renamed)) { DeclaracionProcedure procedimiento = tablaDeSimbolos.Procedure(clase_Renamed); Objeto[] resultados = new Objeto[argumentos.Length]; bool cantidadDeArguemtosEsLaMisma = argumentos.Length == procedimiento.cantidadDeParametros(); if (!cantidadDeArguemtosEsLaMisma) { throw new LanguageException(string.Format("La cantidad de argumentos No coincide con la cantidad de parametros del procedimiento")); } int i = 0; foreach (Expresion argumento in argumentos) { Type tipoDelArgumento = argumento.calcularTipo(); Type tipoDelParametro = procedimiento.calcularTipoDelParametro(i); if (tipoDelParametro != tipoDelArgumento) { throw new LanguageException(string.Format("Se esperaba un argumento de tipo '" + tipoDelParametro.Name + "' pero se encontro '" + tipoDelArgumento.Name + "'")); } i++; } i = 0; tablaDeSimbolos.AbrirBloque(); foreach (Expresion argumento in argumentos) { resultados[i] = argumento.ejecutar(); tablaDeSimbolos.GuardarVariable(procedimiento.nombreDelParametro(i), resultados[i]); i++; } procedimiento.ejecutar(); tablaDeSimbolos.CerrarBloque(); } else { if (instancia == null) { instancia = InstanciarElObjeto(); } return(instancia); } return(instancia); }