private static void generarC3DThis(Clase clase, String puntero, String estructura) { Simbolo sclase = TablaSimbolos.getInstance.getClase(clase.nombre); if (sclase != null) { String t1 = getTemporal(); instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar apuntador del this")); instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, puntero, "+", "0")); instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar apuntador donde incia el this")); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, estructura, t1, "H")); instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Reservar espacio para globales de " + clase.nombre)); aumentarHeap(Convert.ToString(sclase.tam)); // Recorrer las variables globales y asignarles foreach (Atributo atr in clase.atributos) { if (atr.esArreglo) { Arreglo.guardarC3D(atr.nombre, atr.valor, Acceso.Tipo.ESTE); } else { if (atr.valor != null) { instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener valor del atributo " + atr.nombre)); Nodo exp = Expresion.expresionC3D(atr.valor); Acceso.actual = null; instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion del atributo " + atr.nombre)); Nodo nodo = Acceso.generarC3DID(atr.nombre, Acceso.Tipo.ESTE, "P", "Stack"); if (nodo != null) { // Asignar la expresion instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Asignar expresion al atributo " + atr.nombre)); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, nodo.estructura, nodo.referencia, exp.cadena)); } } } } } }
public static void evaluarSinoSi(ParseTreeNode expresion, ParseTreeNode sentencias, String eSalida) { // Sino Si (Expresion) { Sentencias } // Si (Expresion) { Sentencias } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Inicio de la sentencia Sino Si")); Nodo nsi = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, Expresion.expresionC3D(expresion), expresion.Span.Location.Line, expresion.Span.Location.Column); if (nsi != null) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// La condicion verdadera")); GeneradorC3D.generarEtiquetas((nsi.etqVerdadera)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sentencias de Sino Si")); C3DSentencias.generarC3D(sentencias); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eSalida)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// La condicion falsa")); GeneradorC3D.generarEtiquetas((nsi.etqFalsa)); } }
public static String generarParametrizacionC3D(ParseTreeNode indices, Simbolo sid) { int con = 1; String temp = null; foreach (ParseTreeNode hijo in indices.ChildNodes) { Nodo exp = Expresion.expresionC3D(hijo); if (exp == null) { break; } int tam = sid.getTamanio(con); String t1 = GeneradorC3D.getTemporal(); String t2 = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Restar uno a la posicion en la dimension " + con)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, exp.cadena, "-", "1")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Multiplicarla por el tamanio de la dimension")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t2, t1, "*", Convert.ToString(tam))); if (con > 1) { String t3 = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar las dos posiciones")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t3, temp, "+", t2)); temp = t3; } else { temp = t2; } con++; } return(temp); }
public static void evaluarMientrasC3D(ParseTreeNode exp, ParseTreeNode sentencias) { String eInicio = GeneradorC3D.getEtiqueta(); GeneradorC3D.generarEtiquetas((eInicio)); Nodo nmientras = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, Expresion.expresionC3D(exp), exp.Span.Location.Line, exp.Span.Location.Column); if (nmientras != null) { GeneradorC3D.generarEtiquetas((nmientras.etqVerdadera)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sentencias de while")); GeneradorC3D.display.agregarCiclo((int)Ciclo.TipoCiclo.WHILE, "", eInicio, nmientras.etqFalsa); //Sentencias de while C3DSentencias.generarC3D(sentencias); GeneradorC3D.display.removerCiclo(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio)); GeneradorC3D.generarEtiquetas((nmientras.etqFalsa)); } }
public static void evaluarXC3D(ParseTreeNode exp1, ParseTreeNode exp2, ParseTreeNode sentencias) { //WHILEX -> EXP EXP Sentencias String eInicio = GeneradorC3D.getEtiqueta(); String eSen = GeneradorC3D.getEtiqueta(); String eCond = GeneradorC3D.getEtiqueta(); String eSalida = GeneradorC3D.getEtiqueta(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Inicializar temporal auxiliar")); String taux = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, taux, "0", "", "")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Etiqueta de Inicio del ciclo X")); GeneradorC3D.generarEtiquetas((eInicio)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Evaluar condicion 1")); Nodo cond1 = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, Expresion.expresionC3D(exp1), exp1.Span.Location.Line, exp1.Span.Location.Column); if (cond1 != null) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Etiqueta verdadera primera condicion")); GeneradorC3D.generarEtiquetas(cond1.etqVerdadera); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Evaluar condicion por primera vez")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eSen, taux, "==", "0")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eCond)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Etiqueta falsa primera condicion")); GeneradorC3D.generarEtiquetas(cond1.etqFalsa); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eSalida, taux, "==", "1")); GeneradorC3D.generarEtiquetas(eCond); Nodo cond2 = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, Expresion.expresionC3D(exp2), exp2.Span.Location.Line, exp2.Span.Location.Column); if (cond2 != null) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Etiqueta verdadera segunda condicion")); GeneradorC3D.generarEtiquetas(cond2.etqVerdadera); GeneradorC3D.generarEtiquetas(eSen); GeneradorC3D.display.agregarCiclo((int)Ciclo.TipoCiclo.WHILEX, "", eInicio, eSalida); // Sentencias de X GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sentencia del ciclo X")); C3DSentencias.generarC3D(sentencias); GeneradorC3D.display.removerCiclo(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, taux, "1", "", "")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Salta al inicio")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Etiqueta falsa segunda condicion y salida")); GeneradorC3D.generarEtiquetas(cond2.etqFalsa); GeneradorC3D.generarEtiquetas(eSalida); } } }
private static void generarC3DSuper(Clase clase, String puntero, String estructura) { Simbolo sclase = TablaSimbolos.getInstance.getClase(clase.nombre); if (sclase != null) { String t1 = getTemporal(); instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar apuntador del super")); instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, puntero, "+", "1")); instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar posicion donde empieza super")); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, estructura, t1, "H")); // Buscar clase padre Clase padre; if (clase.padre != null) { padre = getClasePadre(clase.padre); if (padre == null) { return; } } else { return; } sclase = TablaSimbolos.getInstance.getClase(clase.padre); if (sclase == null) { return; } instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Reservar espacio para la clase padre" + sclase.nombre)); aumentarHeap(Convert.ToString(sclase.tam)); // Recorrer las variables globales y asignarles foreach (Atributo atr in padre.atributos) { if (atr.visibilidad == (int)Simbolo.Visibilidad.PUBLICO || atr.visibilidad == (int)Simbolo.Visibilidad.PROTEGIDO) { if (atr.esArreglo) { Arreglo.guardarC3D(atr.nombre, atr.valor, Acceso.Tipo.SUPER); } else { if (atr.valor != null) { instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener valor del atributo " + atr.nombre)); Nodo exp = Expresion.expresionC3D(atr.valor); Acceso.actual = null; instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion del atributo " + atr.nombre)); Nodo nodo = Acceso.generarC3DID(atr.nombre, Acceso.Tipo.SUPER, "P", "Stack"); if (nodo != null) { // Asignar la expresion instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar valor del atributo " + atr.nombre)); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, nodo.estructura, nodo.referencia, exp.cadena)); } } } } } } }
public static Nodo generarMultiplicarC3D(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 } nodo.cadena = GeneradorC3D.getTemporal(); nodo.tipo = (int)Simbolo.Tipo.NUMERO; 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, "// Multiplicar 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); } 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, "// Multiplicar 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); } break; case (int)Simbolo.Tipo.BOOLEAN: // bool - num 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, "// Multiplicar dos temporales, bool * 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.BOOLEAN) { return(Logica.generarC3D(izq, "&&", der)); } break; case (int)Simbolo.Tipo.CARACTER: // bool - num 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, "// Restar dos temporales, caracter * 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); } break; } //Error semantico! Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede multiplicar " + Simbolo.getValor(nizq.tipo) + " con " + Simbolo.getValor(nder.tipo) + ".", izq.Span.Location.Line, izq.Span.Location.Column)); return(null); }
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); }
public static void generarC3D(ParseTreeNode sentencias) { foreach (ParseTreeNode sentencia in sentencias.ChildNodes) { switch (sentencia.Term.Name) { case "DECLARACION": if (sentencia.ChildNodes.Count == 3) { declararAsignarC3D(sentencia); } break; case "ASIGNACION": asignarC3D(sentencia); break; case "SUPER": if (sentencia.ChildNodes[1].Term.Name.Equals("ASIGNACION")) { asignarC3D(sentencia); } else if (sentencia.ChildNodes[1].Term.Name.Equals("ACCESO")) { // super + ACCESO Acceso.generarC3DAcceso(sentencia.ChildNodes[1], Acceso.Tipo.SUPER, null); } else { // super + [ + EXPS + ] } break; case "ACCESO": Acceso.generarC3DAcceso(sentencia, Acceso.Tipo.NINGUNO, null); break; case "RETORNO": if (procedimientoActual != null) { if (procedimientoActual.rol == (int)Simbolo.Tipo.FUNCION) { // Evaluar expresion Nodo expRetorno = Expresion.expresionC3D(sentencia.ChildNodes[0]); if (expRetorno != null) { // Guardar en retorno la posicion del objeto creado String temp = C3DSentencias.retornarC3D(sentencia.Span.Location.Line, sentencia.Span.Location.Column); if (!temp.Equals("")) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno en la posicion")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", temp, expRetorno.cadena)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Salto al final de la funcion " + procedimientoActual.nombre)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eFinProcedimiento)); } } } else { if (procedimientoActual.rol == (int)Simbolo.Tipo.METODO) { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "Retornar vino dentro de un metodo!", sentencia.Span.Location.Line, sentencia.Span.Location.Column)); } else { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "Retornar vino dentro de un constructor!", sentencia.Span.Location.Line, sentencia.Span.Location.Column)); } } } break; case "IMPRIMIR": Nodo exp = Expresion.expresionC3D(sentencia.ChildNodes[1]); // Recorrer e imprimir segun el caso if (exp != null) { Imprimir.imprimirC3D(exp); } break; case "NATIVAS": Nodo expN = Expresion.expresionC3D(sentencia.ChildNodes[1]); if (expN != null) { Convertidor.generarC3D(sentencia.ChildNodes[0].Token.Text, expN); } break; case "CONTINUAR": // continue; String eInicio = GeneradorC3D.display.buscarInicio(); if (eInicio == null) { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "Continuar vino fuera de un ciclo.", sentencia.Span.Location.Line, sentencia.Span.Location.Column)); } else { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Continue")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio)); } break; case "INTERRUMPIR": // break; String eSalidaI = GeneradorC3D.display.buscarSalida(); if (eSalidaI == null) { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "Interrumpir vino fuera de un ciclo.", sentencia.Span.Location.Line, sentencia.Span.Location.Column)); } else { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Break")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eSalidaI)); } break; case "IF1": // IF1 -> EXP Sentencias String eSalida = GeneradorC3D.getEtiqueta(); Si.evaluarSi(sentencia.ChildNodes[0], sentencia.ChildNodes[1], eSalida); GeneradorC3D.generarEtiquetas(eSalida); break; case "IF2": // IF2 -> EXP Sentencias Sentencias String eSalida2 = GeneradorC3D.getEtiqueta(); Si.evaluarSi(sentencia.ChildNodes[0], sentencia.ChildNodes[1], eSalida2); Si.evaluarSino(sentencia.ChildNodes[2], eSalida2); GeneradorC3D.generarEtiquetas(eSalida2); break; case "IF3": // IF3 -> EXP Sentencias IF4 /* * IF4.Rule = IF4 EXP Sentencias | EXP Sentencias; * */ String eSalida3 = GeneradorC3D.getEtiqueta(); Si.evaluarSi(sentencia.ChildNodes[0], sentencia.ChildNodes[1], eSalida3); Si.evaluarIF4(sentencia.ChildNodes[2], eSalida3); GeneradorC3D.generarEtiquetas(eSalida3); break; case "IF5": // IF5 -> EXP Sentencias IF4 Sentencias String eSalida4 = GeneradorC3D.getEtiqueta(); Si.evaluarSi(sentencia.ChildNodes[0], sentencia.ChildNodes[1], eSalida4); Si.evaluarIF4(sentencia.ChildNodes[2], eSalida4); Si.evaluarSino(sentencia.ChildNodes[3], eSalida4); GeneradorC3D.generarEtiquetas(eSalida4); break; case "FOR": // FOR.Rule = Fasignar (D o A) EXP EXP Sentencias // Declarar o asignar! Para.evaluarParaC3D(sentencia.ChildNodes[0], sentencia.ChildNodes[1], sentencia.ChildNodes[2], sentencia.ChildNodes[3]); break; case "WHILE": //WHILE -> EXP Sentencias Mientras.evaluarMientrasC3D(sentencia.ChildNodes[0], sentencia.ChildNodes[1]); break; case "X": X.evaluarXC3D(sentencia.ChildNodes[0], sentencia.ChildNodes[1], sentencia.ChildNodes[2]); break; case "REPEAT": Repetir.evaluarRepetirC3D(sentencia.ChildNodes[0], sentencia.ChildNodes[1]); break; case "DO_WHILE": Hacer.evaluarHacerC3D(sentencia.ChildNodes[0], sentencia.ChildNodes[1]); break; case "SWITCH": Elegir.evaluarElegirC3D(sentencia.ChildNodes[0], sentencia.ChildNodes[1]); break; case "LOOP": Loop.evaluarLoopC3D(sentencia.ChildNodes[0].ChildNodes[0]); break; } } }
public static Nodo generarC3D(ParseTreeNode izq, String operador, ParseTreeNode der) { Nodo nodo = new Nodo(); nodo.cadena = GeneradorC3D.getEtiqueta(); nodo.tipo = (int)Simbolo.Tipo.BOOLEAN; GeneradorC3D.generarEtiquetas((nodo.cadena)); if (operador.Equals("||")) { // OR Nodo nizq = Expresion.expresionC3D(izq); if (nizq == null) { return(null); } if (nizq.tipo == (int)Simbolo.Tipo.BOOLEAN) { if (nizq.etqVerdadera == null && nizq.etqFalsa == null) { nizq.tipo = (int)Simbolo.Tipo.NUMERO; } } nizq = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, nizq, izq.Span.Location.Line, izq.Span.Location.Column); if (nizq != null) { GeneradorC3D.generarEtiquetas((nizq.etqFalsa)); Nodo nder = Expresion.expresionC3D(der); if (nder == null) { return(null); } if (nder.tipo == (int)Simbolo.Tipo.BOOLEAN) { if (nder.etqVerdadera == null && nder.etqFalsa == null) { nder.tipo = (int)Simbolo.Tipo.NUMERO; } } nder = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, nder, der.Span.Location.Line, der.Span.Location.Column); if (nder != null) { nodo.etqVerdadera = nizq.etqVerdadera + "," + nder.etqVerdadera; nodo.etqFalsa = nder.etqFalsa; } else { //Ocurrio Error! return(null); } } else { //Ocurrio Error! return(null); } } else if (operador.Equals("&&")) { // AND Nodo nizq = Expresion.expresionC3D(izq); if (nizq == null) { return(null); } if (nizq.tipo == (int)Simbolo.Tipo.BOOLEAN) { if (nizq.etqVerdadera == null && nizq.etqFalsa == null) { nizq.tipo = (int)Simbolo.Tipo.NUMERO; } } nizq = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, nizq, izq.Span.Location.Line, izq.Span.Location.Column); if (nizq != null) { GeneradorC3D.generarEtiquetas((nizq.etqVerdadera)); Nodo nder = Expresion.expresionC3D(der); if (nder == null) { return(null); } if (nder.tipo == (int)Simbolo.Tipo.BOOLEAN) { if (nder.etqVerdadera == null && nder.etqFalsa == null) { nder.tipo = (int)Simbolo.Tipo.NUMERO; } } nder = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, nder, der.Span.Location.Line, der.Span.Location.Column); if (nder != null) { nodo.etqVerdadera = nder.etqVerdadera; nodo.etqFalsa = nizq.etqFalsa + "," + nder.etqFalsa; } else { //Ocurrio un error! return(null); } } else { //Ocurrio un Error! return(null); } } else { //|? XOR Nodo nizq = Expresion.expresionC3D(izq); if (nizq == null) { return(null); } if (nizq.tipo == (int)Simbolo.Tipo.BOOLEAN) { if (nizq.etqVerdadera == null && nizq.etqFalsa == null) { nizq.tipo = (int)Simbolo.Tipo.NUMERO; } } nizq = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, nizq, izq.Span.Location.Line, izq.Span.Location.Column); if (nizq != null) { GeneradorC3D.generarEtiquetas((nizq.etqFalsa)); Nodo nder = Expresion.expresionC3D(der); if (nder == null) { return(null); } if (nder.tipo == (int)Simbolo.Tipo.BOOLEAN) { if (nder.etqVerdadera == null && nder.etqFalsa == null) { nder.tipo = (int)Simbolo.Tipo.NUMERO; } } nder = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, nder, der.Span.Location.Line, der.Span.Location.Column); if (nder != null) { nodo.etqVerdadera = nder.etqFalsa; nodo.etqFalsa = nizq.etqVerdadera + "," + nder.etqVerdadera; } else { //Ocurrio un error! return(null); } } else { //Ocurrio un error! return(null); } } return(nodo); }