public String Generar3DConstructor() { String cadena = ""; Simbolo clase = Padre.BuscarClasePadre(); cadena += "void " + clase.Nombre + "_constructor"; foreach (Simbolo s in Parametros) { FParametro d = (FParametro)s.Valor; cadena += "_" + s.Tipo + d.Dimensiones.ToString(); } cadena += "(){\n"; foreach (Simbolo simbolo in Ambito.TablaSimbolo) { cadena += simbolo.Generar3D(); } cadena += "}\n\n"; return(cadena); }
public String GetNombre3D() { String cadena = ""; cadena += this.Padre.Padre.Nombre + "_" + this.Nombre + this.Dimensiones.ToString() + "_" + this.Tipo; foreach (Simbolo s in Parametros) { FParametro d = (FParametro)s.Valor; cadena += "_" + s.Tipo + d.Dimensiones.ToString(); } return(cadena); }
public String Generar3D() { String cadena = ""; Simbolo simclasepadre = Padre.BuscarClasePadre(); FClase clasepadre = (FClase)simclasepadre.Valor; if (!clasepadre.Herencia.Equals("")) { Simbolo simclasehere = simclasepadre.BuscarClase(clasepadre.Herencia, clasepadre.ArchivoPadre); if (simclasehere != null) { Simbolo simulacion = Padre.BuscarMetodoPadre(); String tempsimulacion = TitusTools.GetTemp(); cadena += "\t\t" + tempsimulacion + " = P + " + (simulacion.Ambito.Tamaño).ToString() + ";//simulacion de cambio de ambito \n"; String posstack = TitusTools.GetTemp(); cadena += "\t\t" + posstack + " = Stack[P];\n"; String nuevapos = TitusTools.GetTemp(); cadena += "\t\t" + nuevapos + " = " + posstack + " + " + clasepadre.Ambito.Tamaño.ToString() + ";//posicion en el this de la herencia\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; cad += "\t\t" + r.Valor + " = - " + auxtemp + ";\n"; 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++; } String este = TitusTools.GetTemp(); cadena += "\t\t" + este + " = " + tempsimulacion + " + 0;//metiendo el this\n"; cadena += "\t\t" + "Stack[" + este + "] = " + nuevapos + ";\n"; if (!TitusTools.HayErrores()) { Simbolo constructor = simclasehere.BuscarConstructor(simclasehere.Nombre, resueltas); cadena += "\t\t" + "P = P + " + (simulacion.Ambito.Tamaño).ToString() + ";//cambio de ambito para llamar al constructor\n"; if (constructor != null) { FMetodo m = (FMetodo)constructor.Valor; if (m.Parametros.Count == this.Parametros.Count) { cadena += "\t\t" + simclasehere.Nombre + "_constructor"; foreach (Simbolo p in m.Parametros) { FParametro parametro = (FParametro)p.Valor; cadena += "_" + parametro.Tipo + parametro.Dimensiones.ToString(); } cadena += "();\n"; } else { TitusTools.InsertarError(Constante.TErrorSemantico, "No se encontro el constructor para la clase " + constructor.Nombre, TitusTools.GetRuta(), Padre.Fila, Padre.Columna); } } else { TitusTools.InsertarError(Constante.TErrorSemantico, "No se encontro el constructor para la clase " + simclasehere.Nombre, TitusTools.GetRuta(), Padre.Fila, Padre.Columna); } cadena += "\t\t" + "P = P - " + (simulacion.Ambito.Tamaño).ToString() + ";//cambio de ambito para llamar al constructor\n"; } } else { TitusTools.InsertarError(Constante.TErrorSemantico, "No existe ninguna clase " + clasepadre.Herencia, TitusTools.GetRuta(), Padre.Fila, Padre.Columna); } } else { TitusTools.InsertarError(Constante.TErrorSemantico, "No se puede llamar la instruccion super porque no existe una herencia", TitusTools.GetRuta(), Padre.Fila, Padre.Columna); } return(cadena); }
//acceso a arreglos public Nodo3D Generar3D() { Nodo3D nodo = new Nodo3D(); Simbolo sim = Padre.BuscarVariable(this.Nombre); if (sim != null) { if (sim.Rol.Equals(Constante.DECLARACION)) { FDeclaracion decla = (FDeclaracion)sim.Valor; if (decla.Dimensiones.Count == this.Dimensiones.Count) { nodo.Tipo = sim.Tipo; if (sim.Ambito.Nombre.Equals("§global§")) { String pos = TitusTools.GetTemp(); String heap = TitusTools.GetTemp(); nodo.Valor = TitusTools.GetTemp(); nodo.Codigo += "\t\t" + pos + " = Stack[P];\n"; nodo.Codigo += "\t\t" + heap + " = " + pos + " + " + sim.Posicion.ToString() + ";//posicion de la variable " + sim.Nombre + "\n"; nodo.Codigo += "\t\t" + nodo.Valor + " = Heap[" + heap + "];\n"; } else { String pos = TitusTools.GetTemp(); nodo.Valor = TitusTools.GetTemp(); nodo.Codigo += "\t\t" + pos + " = P + " + (sim.Posicion + 2).ToString() + ";//posicion de la variable " + sim.Nombre + "\n"; nodo.Codigo += "\t\t" + nodo.Valor + " = Stack[" + pos + "];\n"; } String tempAcceso = TitusTools.GetTemp(); String cadenaArreglo = ""; String etqError = TitusTools.GetEtq(); String etqSalida = TitusTools.GetEtq(); cadenaArreglo += "\t\t" + tempAcceso + " = Heap[" + nodo.Valor + "];//acceso a las dimensiones\n"; cadenaArreglo += "\t\t" + "ifFalse " + tempAcceso + " == " + this.Dimensiones.Count.ToString() + " goto " + etqError + ";\n"; cadenaArreglo += "\t\t" + nodo.Valor + " = " + nodo.Valor + " + 1;\n"; String mapeo = TitusTools.GetTemp(); String dsize = TitusTools.GetTemp(); String indice = TitusTools.GetTemp(); cadenaArreglo += "\t\t" + mapeo + " = 0;\n"; int i = 0; foreach (FNodoExpresion d in Dimensiones) { Nodo3D dtemp = d.Generar3D(); if (dtemp.Tipo.Equals(Constante.TEntero) && !TitusTools.HayErrores()) { cadenaArreglo += dtemp.Codigo; cadenaArreglo += "\t\t" + dsize + " = Heap[" + nodo.Valor + "];\n"; cadenaArreglo += "\t\t" + indice + " = " + dsize + " - 1;\n"; cadenaArreglo += "\t\t" + nodo.Valor + " = " + nodo.Valor + " + 1;\n"; cadenaArreglo += "\t\t" + "ifFalse " + dtemp.Valor + " >= 0 goto " + etqError + ";\n"; cadenaArreglo += "\t\t" + "ifFalse " + dtemp.Valor + " <= " + indice + " goto " + etqError + ";\n"; if (i > 0) { cadenaArreglo += "\t\t" + mapeo + " = " + mapeo + " * " + dsize + ";\n"; } cadenaArreglo += "\t\t" + mapeo + " = " + mapeo + " + " + dtemp.Valor + ";\n"; } else { TitusTools.InsertarError(Constante.TErrorSemantico, "Solo se puede acceder al arreglo " + this.Nombre + " con un tipo entero no un tipo " + dtemp.Tipo, TitusTools.GetRuta(), this.Fila, this.Columna); } i++; } cadenaArreglo += "\t\t" + "goto " + etqSalida + ";\n"; cadenaArreglo += "\t" + etqError + ":\n"; cadenaArreglo += "\t\t" + "Error(1);\n"; cadenaArreglo += "\t" + etqSalida + ":\n"; cadenaArreglo += "\t\t" + nodo.Valor + " = " + nodo.Valor + " + " + mapeo + ";//posicion lexicografica\n"; String val = TitusTools.GetTemp(); cadenaArreglo += "\t\t" + val + " = Heap[" + nodo.Valor + "];\n"; nodo.Valor = val; nodo.Codigo += cadenaArreglo; } else { TitusTools.InsertarError(Constante.TErrorSemantico, "El arreglo " + this.Nombre + ", tiene " + decla.Dimensiones.Count.ToString() + " dimensiones no " + this.Dimensiones.Count.ToString(), TitusTools.GetRuta(), this.Fila, this.Columna); } } else//si es parametro no trae tamaño en sus dimensiones solo dimensiones { FParametro decla = (FParametro)sim.Valor; if (decla.Dimensiones == this.Dimensiones.Count) { nodo.Tipo = sim.Tipo; String pos = TitusTools.GetTemp(); nodo.Valor = TitusTools.GetTemp(); nodo.Codigo += "\t\t" + pos + " = P + " + (sim.Posicion + 2).ToString() + ";//posicion de la variable " + sim.Nombre + "\n"; nodo.Codigo += "\t\t" + nodo.Valor + " = Stack[" + pos + "];\n"; String tempAcceso = TitusTools.GetTemp(); String cadenaArreglo = ""; String etqError = TitusTools.GetEtq(); String etqSalida = TitusTools.GetEtq(); cadenaArreglo += "\t\t" + tempAcceso + " = Heap[" + nodo.Valor + "];//acceso a las dimensiones\n"; cadenaArreglo += "\t\t" + "ifFalse " + tempAcceso + " == " + this.Dimensiones.Count.ToString() + " goto " + etqError + ";\n"; cadenaArreglo += "\t\t" + nodo.Valor + " = " + nodo.Valor + " + 1;\n"; String mapeo = TitusTools.GetTemp(); String dsize = TitusTools.GetTemp(); String indice = TitusTools.GetTemp(); cadenaArreglo += "\t\t" + mapeo + " = 0;\n"; int i = 0; foreach (FNodoExpresion d in Dimensiones) { Nodo3D dtemp = d.Generar3D(); if (dtemp.Tipo.Equals(Constante.TEntero) && !TitusTools.HayErrores()) { cadenaArreglo += dtemp.Codigo; cadenaArreglo += "\t\t" + dsize + " = Heap[" + nodo.Valor + "];\n"; cadenaArreglo += "\t\t" + indice + " = " + dsize + " - 1;\n"; cadenaArreglo += "\t\t" + nodo.Valor + " = " + nodo.Valor + " + 1;\n"; cadenaArreglo += "\t\t" + "ifFalse " + dtemp.Valor + " >= 0 goto " + etqError + ";\n"; cadenaArreglo += "\t\t" + "ifFalse " + dtemp.Valor + " <= " + indice + " goto " + etqError + ";\n"; if (i > 0) { cadenaArreglo += "\t\t" + mapeo + " = " + mapeo + " * " + dsize + ";\n"; } cadenaArreglo += "\t\t" + mapeo + " = " + mapeo + " + " + dtemp.Valor + ";\n"; } else { TitusTools.InsertarError(Constante.TErrorSemantico, "Solo se puede acceder al arreglo " + this.Nombre + " con un tipo entero no un tipo " + dtemp.Tipo, TitusTools.GetRuta(), this.Fila, this.Columna); } i++; } cadenaArreglo += "\t\t" + "goto " + etqSalida + ";\n"; cadenaArreglo += "\t" + etqError + ":\n"; cadenaArreglo += "\t\t" + "Error(1);\n"; cadenaArreglo += "\t" + etqSalida + ":\n"; cadenaArreglo += "\t\t" + nodo.Valor + " = " + nodo.Valor + " + " + mapeo + ";//posicion lexicografica\n"; String val = TitusTools.GetTemp(); cadenaArreglo += "\t\t" + val + " = Heap[" + nodo.Valor + "];\n"; nodo.Valor = val; nodo.Codigo += cadenaArreglo; } else { TitusTools.InsertarError(Constante.TErrorSemantico, "El arreglo " + this.Nombre + ", tiene " + decla.Dimensiones.ToString() + " dimensiones no " + this.Dimensiones.Count.ToString(), TitusTools.GetRuta(), this.Fila, this.Columna); } } } else { TitusTools.InsertarError(Constante.TErrorSemantico, "No se encontro la variable " + this.Nombre, TitusTools.GetRuta(), this.Fila, this.Columna); } return(nodo); }
public Nodo3D Generar3D() { 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"; nodo.Valor = TitusTools.GetTemp(); nodo.Tipo = this.Nombre; String este = TitusTools.GetTemp(); cadena += "\t\t" + nodo.Valor + " = H;//posicion del objeto\n"; cadena += "\t\t" + este + " = " + tempsimulacion + " + 0;//metiendo el this\n"; cadena += "\t\t" + "Stack[" + este + "] = " + nodo.Valor + ";\n"; cadena += "\t\t" + "P = P + " + (simulacion.Ambito.Tamaño).ToString() + ";//cambio de ambito para llamar al constructor\n"; cadena += "\t\t" + "init_" + this.Nombre + "();\n"; cadena += "\t\t" + "P = P - " + (simulacion.Ambito.Tamaño).ToString() + ";//cambio de ambito para llamar al constructor\n"; cadena += "\t\t" + "Stack[" + este + "] = " + nodo.Valor + ";\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; cad += "\t\t" + r.Valor + " = - " + auxtemp + ";\n"; 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.BuscarConstructor(this.Nombre, resueltas); cadena += "\t\t" + "P = P + " + (simulacion.Ambito.Tamaño).ToString() + ";//cambio de ambito para llamar al constructor\n"; if (sim != null) { FMetodo m = (FMetodo)sim.Valor; if (m.Parametros.Count == this.Parametros.Count) { cadena += "\t\t" + this.Nombre + "_constructor"; foreach (Simbolo p in m.Parametros) { FParametro parametro = (FParametro)p.Valor; cadena += "_" + parametro.Tipo + parametro.Dimensiones.ToString(); } cadena += "();\n"; } else { TitusTools.InsertarError(Constante.TErrorSemantico, "No se encontro el constructor para la clase " + 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); } cadena += "\t\t" + "P = P - " + (simulacion.Ambito.Tamaño).ToString() + ";//cambio de ambito para llamar al constructor\n"; } nodo.Codigo = cadena; return(nodo); }