public static Nodo instanciaC3D(ParseTreeNode nuevo, Acceso.Tipo tipo) { // NUEVO -> new id EXPS // SUPER -> super [ EXPS ] Nodo nodo = new Nodo(); // NUEVO String idC = nuevo.ChildNodes[1].Token.Text; // Buscar que la clase exista Clase instancia = GeneradorC3D.getClasePadre(idC); if (instancia != null) { List <Nodo> expresiones = new List <Nodo>(); String llave = getExpresiones(nuevo.ChildNodes[2], ref expresiones); if (llave != null) { llave = "constructor" + llave; Simbolo procedimiento = TablaSimbolos.getInstance.getProcedimiento( instancia.nombre, llave); if (procedimiento == null || procedimiento.visibilidad == (int)Simbolo.Visibilidad.PRIVADO) { // Error Semantico! No se puede hacer instancia por ser privado return(null); } // Get parametros List <Simbolo> sparametros = TablaSimbolos.getInstance.getParametros( instancia.nombre, procedimiento); if (expresiones.Count == sparametros.Count) { int tam = GeneradorC3D.tamMain; if (C3DSentencias.procedimientoActual != null) { // Esta en el main! tam = C3DSentencias.procedimientoActual.tam; } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Pasar los parametros")); String taux = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Crear un temporal auxiliar para el incremento del ambito")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, taux, "P", "+", Convert.ToString(tam))); parametrosC3D(taux, sparametros, expresiones); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Incrementar el ambito")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", Convert.ToString(tam))); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Llamar al procedimiento " + llave)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.LLAMADA, instancia.nombre + "_" + llave)); // Ver si hay retorno Y guardarlo String temp = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion del retorno en el ambito actual ")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, "P", "+", "2")); nodo.cadena = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener valor del retorno de la funcion " + llave)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", nodo.cadena, temp)); nodo.tipo = (int)Simbolo.Tipo.CLASE; GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir el ambito ")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", Convert.ToString(tam))); } } } return(nodo); }