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); }
public override void ValidarEstaticamente() { if (expresion is NuevaInstancia) { string nombreProcedimiento = ((NuevaInstancia)expresion).Clase(); if (!tablaDeSimbolos.ExisteLaDeclaracion(nombreProcedimiento)) { throw new LanguageException(string.Format("No se encontró declarado el procedimiento {0}, debe declararlo primero.", nombreProcedimiento)); } } else { Type tipoExpresion = expresion.calcularTipo(); expresion.validarEstaticamente(); if (!tipoExpresion.Equals(typeof(EventSourcing.Libraries.Void))) { throw new LanguageException(string.Format("Sólo es posible ejecutar procedimientos pero se está intentando ejecutar erróneamente un valor de tipo {0}", tipoExpresion.FullName)); } } }