public static void guardarC3D(string id, ParseTreeNode arreglo, Acceso.Tipo tipo) { Acceso.actual = null; Nodo nodo = Acceso.generarC3DID(id, tipo, "P", "Stack"); if (nodo == null) { return; } Simbolo sid; if (C3DSentencias.procedimientoActual == null) { sid = TablaSimbolos.getInstance.buscarVariable(id, C3DSentencias.claseActual.nombre, null, tipo); } else { sid = TablaSimbolos.getInstance.buscarVariable(id, C3DSentencias.claseActual.nombre, C3DSentencias.procedimientoActual.nombre, tipo); } // Recorrer los valores del arreglo y guardarlos en la posicion empezando en 0 if (arreglo != null && sid.dimensiones != null) { List <int> dimensiones = new List <int>(); dimensionesArreglo(arreglo, ref dimensiones); for (int i = 0; i < sid.dimensiones.Count; i++) { if (dimensiones[i] != sid.dimensiones[i]) { // Error semantico! No es de las dimensiones que solicita! return; } } // Todo bien! /* String t1 = GeneradorC3D.getTemporal(); * GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, * "// Obtener puntero al heap del arreglo " + id)); * GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, nodo.estructura, t1, nodo.referencia)); */ int tamH = sid.getTamanioTotal(); String t1 = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar H disponible en " + id)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, nodo.estructura, nodo.referencia, "H")); recorrerDimensiones(arreglo, "H"); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Incrementar H para reservar tam del arreglo " + id)); GeneradorC3D.aumentarHeap(Convert.ToString(tamH)); } }
public static void concatenar(int tipo, String cadena) { switch (tipo) { case (int)Simbolo.Tipo.NUMERO: GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "-241094.22")); GeneradorC3D.aumentarHeap("1"); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar numero")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", cadena)); GeneradorC3D.aumentarHeap("1"); break; case (int)Simbolo.Tipo.DECIMAL: GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "-241094.22")); GeneradorC3D.aumentarHeap("1"); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar decimal")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", cadena)); GeneradorC3D.aumentarHeap("1"); break; case (int)Simbolo.Tipo.CARACTER: GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar caracter")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", cadena)); GeneradorC3D.aumentarHeap("1"); break; case (int)Simbolo.Tipo.CADENA: GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "//Guardar cadena de " + cadena)); String taux = GeneradorC3D.getTemporal(); String eFin = GeneradorC3D.getEtiqueta(); String eInicio = GeneradorC3D.getEtiqueta(); GeneradorC3D.generarEtiquetas((eInicio)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Heap", taux, cadena)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "//Si no es fin de cadena guarda el valor")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eFin, taux, "==", "0")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", taux)); GeneradorC3D.aumentarHeap("1"); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar el contador que lleva la posicion del Heap")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, cadena, cadena, "+", "1")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio)); GeneradorC3D.generarEtiquetas((eFin)); break; } }
//GENERAR CADENAS! public static Nodo guardarCadenaC3D(String cadena) { //CADENA -> tchar | tstring Nodo nuevo = new Nodo(); nuevo.tipo = (int)Simbolo.Tipo.CADENA; nuevo.cadena = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nuevo.cadena, "H", "+", "0")); foreach (char c in cadena) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar " + c)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", Convert.ToString((int)c))); GeneradorC3D.aumentarHeap("1"); } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0")); GeneradorC3D.aumentarHeap("1"); return(nuevo); }
private static void generarC3DMain(Clase clase) { C3DSentencias.claseActual = clase; Simbolo smain = TablaSimbolos.getInstance.getProcedimiento(clase.nombre, "main"); // Guardar this de la clase main instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Reservar espacio para this y super de " + clase.nombre)); String t1 = getTemporal(); instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar inicio -> pos 0")); instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, "H", "+", "0")); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", "0", "0")); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", "1", "1")); GeneradorC3D.aumentarHeap("2"); // Generar this y super generarC3DThis(clase, t1, "Heap"); // Guardar super de la clase main generarC3DSuper(clase, t1, "Heap"); instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Llamada al main")); instrucciones.Add(new C3D((int)C3D.TipoC3D.LLAMADA, clase.nombre + "_main")); instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Terminar la ejecucion")); instrucciones.Add(new C3D((int)C3D.TipoC3D.EXIT, "")); }
private static void generarC3DClases() { // Recorrer cada una de las clases foreach (Clase clase in clases) { C3DSentencias.claseActual = clase; // Recorrer cada uno de los constructores foreach (Procedimiento constructor in clase.constructores) { C3DSentencias.procedimientoActual = TablaSimbolos.getInstance.getProcedimiento(clase.nombre, constructor.completo); //C3DSentencias.procedimientoActual = constructor.completo; instrucciones.Add(new C3D((int)C3D.TipoC3D.INICIO_METODO, clase.nombre + "_" + constructor.completo)); // Guardar H en t1 String t1 = GeneradorC3D.getTemporal(); instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar apuntador de la instancia")); instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, "H", "+", "0")); GeneradorC3D.aumentarHeap("2"); // Generar this y super String t2 = getTemporal(); instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t2, "P", "+", "0")); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", t2, t1)); generarC3DThis(clase, t1, "Heap"); t2 = getTemporal(); instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t2, "P", "+", "1")); String t5 = getTemporal(); instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t5, t1, "+", "1")); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", t2, t5)); generarC3DSuper(clase, t1, "Heap"); String t3 = getTemporal(); String t4 = getTemporal(); instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t3, t1, "+", "1")); instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t4, "P", "+", "1")); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", t4, t3)); // Sentencias del constructor C3DSentencias.generarC3D(constructor.sentencias); // Guardar en retorno la posicion del objeto creado String temp = C3DSentencias.retornarC3D(constructor.linea, constructor.columna); if (!temp.Equals("")) { instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno en la posicion")); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", temp, t1)); } instrucciones.Add(new C3D((int)C3D.TipoC3D.FIN_METODO, "}")); } // Recorrer cada uno de los procedimientos foreach (Procedimiento procedimiento in clase.procedimientos) { C3DSentencias.eFinProcedimiento = getEtiqueta(); //C3DSentencias.procedimientoActual = procedimiento.completo; C3DSentencias.procedimientoActual = TablaSimbolos.getInstance.getProcedimiento(clase.nombre, procedimiento.completo); instrucciones.Add(new C3D((int)C3D.TipoC3D.INICIO_METODO, clase.nombre + "_" + procedimiento.completo)); // Sentencias del procedimiento C3DSentencias.generarC3D(procedimiento.sentencias); generarEtiquetas(C3DSentencias.eFinProcedimiento); C3DSentencias.eFinProcedimiento = null; instrucciones.Add(new C3D((int)C3D.TipoC3D.FIN_METODO, "}")); } } }
public static Nodo generarSumaC3D(ParseTreeNode izq, ParseTreeNode der) { Nodo nodo = new Nodo(); Nodo nizq = Expresion.expresionC3D(izq); Nodo nder = Expresion.expresionC3D(der); if (nizq == null || nder == null) { return(null); } if (nizq.tipo == (int)Simbolo.Tipo.VACIO) { //Error: NullPointerException } if (nder.tipo == (int)Simbolo.Tipo.VACIO) { //Error: NullPointerException } switch (nizq.tipo) { case (int)Simbolo.Tipo.NUMERO: if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.CARACTER || nder.tipo == (int)Simbolo.Tipo.BOOLEAN || nder.tipo == (int)Simbolo.Tipo.DECIMAL) { String temp = GeneradorC3D.getTemporal(); // temp = nizq.cad operador nder.der GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar dos temporales, num + num")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "+", nder.cadena)); nodo.cadena = temp; nodo.tipo = nizq.tipo; if (nder.tipo == (int)Simbolo.Tipo.DECIMAL) { nodo.tipo = nder.tipo; } return(nodo); } else if (nder.tipo == (int)Simbolo.Tipo.CADENA) { nodo.cadena = GeneradorC3D.getTemporal(); nodo.tipo = nder.tipo; GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , num + str")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "H", "+", "0")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Reservar espacio para nueva cadena")); concatenar(nizq.tipo, nizq.cadena); concatenar(nder.tipo, nder.cadena); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0")); GeneradorC3D.aumentarHeap("1"); return(nodo); } break; case (int)Simbolo.Tipo.DECIMAL: if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.CARACTER || nder.tipo == (int)Simbolo.Tipo.BOOLEAN || nder.tipo == (int)Simbolo.Tipo.DECIMAL) { String temp = GeneradorC3D.getTemporal(); // temp = nizq.cad operador nder.der GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar dos temporales, decimal + num")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "+", nder.cadena)); nodo.cadena = temp; nodo.tipo = nizq.tipo; return(nodo); } else if (nder.tipo == (int)Simbolo.Tipo.CADENA) { nodo.cadena = GeneradorC3D.getTemporal(); nodo.tipo = nder.tipo; GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , decimal + str")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "H", "+", "0")); concatenar(nizq.tipo, nizq.cadena); concatenar(nder.tipo, nder.cadena); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0")); GeneradorC3D.aumentarHeap("1"); return(nodo); } break; case (int)Simbolo.Tipo.CARACTER: if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.DECIMAL) { String temp = GeneradorC3D.getTemporal(); // temp = nizq.cad operador nder.der GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar dos temporales, caracter + num")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "+", nder.cadena)); nodo.cadena = temp; nodo.tipo = nder.tipo; return(nodo); } else if (nder.tipo == (int)Simbolo.Tipo.CADENA) { nodo.cadena = GeneradorC3D.getTemporal(); nodo.tipo = nder.tipo; GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , caracter + str")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "H", "+", "0")); concatenar(nizq.tipo, nizq.cadena); concatenar(nder.tipo, nder.cadena); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0")); GeneradorC3D.aumentarHeap("1"); return(nodo); } break; case (int)Simbolo.Tipo.BOOLEAN: if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.DECIMAL) { String temp = GeneradorC3D.getTemporal(); if (nder.tipo == (int)Simbolo.Tipo.NUMERO) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar , bool + num")); } else { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar , bool + decimal")); } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "+", nder.cadena)); nodo.cadena = temp; nodo.tipo = nder.tipo; return(nodo); } else if (nder.tipo == (int)Simbolo.Tipo.BOOLEAN) { return(Logica.generarC3D(izq, "||", der)); } break; case (int)Simbolo.Tipo.CADENA: if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.DECIMAL || nder.tipo == (int)Simbolo.Tipo.CARACTER) { nodo.cadena = GeneradorC3D.getTemporal(); nodo.tipo = nizq.tipo; if (nder.tipo == (int)Simbolo.Tipo.NUMERO) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , str + num")); } else if (nder.tipo == (int)Simbolo.Tipo.DECIMAL) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , str + decimal")); } else { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , str + caracter")); } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "H", "+", "0")); concatenar(nizq.tipo, nizq.cadena); concatenar(nder.tipo, nder.cadena); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0")); GeneradorC3D.aumentarHeap("1"); return(nodo); } else if (nder.tipo == (int)Simbolo.Tipo.CADENA) { nodo.cadena = GeneradorC3D.getTemporal(); nodo.tipo = nizq.tipo; GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , str + str")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "H", "+", "0")); concatenar(nizq.tipo, nizq.cadena); concatenar(nder.tipo, nder.cadena); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0")); GeneradorC3D.aumentarHeap("1"); return(nodo); } break; } // Error semantico! Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede sumar " + Simbolo.getValor(nizq.tipo) + " con " + Simbolo.getValor(nder.tipo) + ".", izq.Span.Location.Line, izq.Span.Location.Column)); return(null); }