public Nodo3D Generar3DHijoAsignacion(Simbolo padre, String temporal) { Nodo3D nodo = new Nodo3D(); String cadena = ""; Simbolo simulacion = Padre.BuscarMetodoPadre(); String tempsimulacion = TitusTools.GetTemp(); cadena += "\t\t" + tempsimulacion + " = P + " + (simulacion.Ambito.Tamaño).ToString() + ";//simulacion de cambio de ambito \n"; List <Nodo3D> resueltas = new List <Nodo3D>(); int i = 2; foreach (FNodoExpresion p in this.Parametros) { String temporalstack = TitusTools.GetTemp(); cadena += "\t\t" + temporalstack + " = " + tempsimulacion + " + " + i.ToString() + ";\n"; Nodo3D r = p.Generar3D(); if (r.Tipo.Equals(Constante.TBooleano))//conversion siviene de una relacional { if (r.V == "" && r.F == "") {//si trae etiquetas viene de una relacional si no es un bool nativo } else { var cad = ""; var auxtemp = TitusTools.GetTemp(); var salida = TitusTools.GetEtq(); cad += "\t" + r.V + ":\n"; cad += "\t\t" + auxtemp + " = 1;\n"; cad += "\t\t" + "goto " + salida + ";\n"; cad += "\t" + r.F + ":\n"; cad += "\t\t" + auxtemp + " = 0;\n"; cad += "\t" + salida + ":\n"; r.Valor = auxtemp; r.Codigo = r.Codigo + cad; } } cadena += r.Codigo; resueltas.Add(r); //ahora asignamos al stack el valor resuelto cadena += "\t\t" + "Stack[" + temporalstack + "] = " + r.Valor + ";//Asignacino del parametro\n"; i++; } if (!TitusTools.HayErrores()) { Simbolo sim = padre.BuscarMetodo(this.Nombre, resueltas); if (sim != null) { Encontrado = sim; FMetodo m = (FMetodo)sim.Valor; if (m.Parametros.Count == this.Parametros.Count) { String este = TitusTools.GetTemp(); cadena += "\t\t" + este + " = " + tempsimulacion + " + 0;//metiendo el this\n"; String here = TitusTools.GetTemp(); cadena += "\t\t" + here + " = " + temporal + " + " + (sim.este).ToString() + ";//calculo si hay herencia\n";//calculo de la herencia cadena += "\t\t" + "Stack[" + este + "] = " + here + ";\n"; //// cadena += "\t\t" + "P = P + " + (simulacion.Ambito.Tamaño).ToString() + ";//cambio de ambito para llamar al metodo\n"; cadena += "\t\t" + m.GetNombre3D() + "();\n"; cadena += "\t\t" + "P = P - " + (simulacion.Ambito.Tamaño).ToString() + ";//regresando al ambito actual\n"; if (!sim.Tipo.Equals(Constante.TVoid)) { String retorno = TitusTools.GetTemp(); nodo.Valor = TitusTools.GetTemp(); cadena += "\t\t" + retorno + " = " + tempsimulacion + " + 1;//Posicion del retorno\n"; cadena += "\t\t" + nodo.Valor + " = Stack[" + retorno + "];//obteniendo el valor del retorno\n"; if (m.Dimensiones > 0) { nodo.Tipo = "arreglo " + m.Tipo; } else { nodo.Tipo = m.Tipo; } } else { nodo.Tipo = Constante.TVoid; nodo.Valor = ""; } } else { TitusTools.InsertarError(Constante.TErrorSemantico, "No se encontro el metodo " + this.Nombre, TitusTools.GetRuta(), this.Fila, this.Columna); } } else { TitusTools.InsertarError(Constante.TErrorSemantico, "No se encontro el constructor para la clase " + this.Nombre, TitusTools.GetRuta(), this.Fila, this.Columna); } } nodo.Codigo = cadena; return(nodo); }