예제 #1
0
 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);
 }
예제 #2
0
 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));
         }
     }
 }