public static void evaluarRepetirC3D(ParseTreeNode sentencias, ParseTreeNode cond) { //REPEAT -> Sentencias EXP String eAux = GeneradorC3D.getEtiqueta(); String eInicio = GeneradorC3D.getEtiqueta(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eAux)); GeneradorC3D.generarEtiquetas((eInicio)); Nodo nhacer = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, Expresion.expresionC3D(cond), cond.Span.Location.Line, cond.Span.Location.Column); if (nhacer != null) { GeneradorC3D.generarEtiquetas((eAux)); GeneradorC3D.generarEtiquetas((nhacer.etqFalsa)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sentencias de repeat-until")); GeneradorC3D.display.agregarCiclo((int)Ciclo.TipoCiclo.REPEAT, "", eInicio, nhacer.etqFalsa); // Sentencias de Repeat C3DSentencias.generarC3D(sentencias); GeneradorC3D.display.removerCiclo(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio)); GeneradorC3D.generarEtiquetas((nhacer.etqVerdadera)); } }
public static void evaluarParaC3D(ParseTreeNode tipo, ParseTreeNode cond, ParseTreeNode control, ParseTreeNode sentencias) { //FOR -> DECLARACION/ASIGNACION EXP ASIGNACION Sentencias C3DSentencias.generarC3D(tipo); String eInicio = GeneradorC3D.getEtiqueta(); String eAux = GeneradorC3D.getEtiqueta(); GeneradorC3D.generarEtiquetas((eInicio)); Nodo npara = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, Expresion.expresionC3D(cond), cond.Span.Location.Line, cond.Span.Location.Column); if (npara != null) { GeneradorC3D.generarEtiquetas((npara.etqVerdadera)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sentencias de for")); GeneradorC3D.display.agregarCiclo((int)Ciclo.TipoCiclo.FOR, "", eAux, npara.etqFalsa); // Sentencias de Para C3DSentencias.generarC3D(sentencias); GeneradorC3D.display.removerCiclo(); GeneradorC3D.generarEtiquetas(eAux); Expresion.expresionC3D(control); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio)); GeneradorC3D.generarEtiquetas((npara.etqFalsa)); } }
public static Nodo negacionC3D(ParseTreeNode exp) { Nodo cond = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, Expresion.expresionC3D(exp), exp.Span.Location.Line, exp.Span.Location.Column); if (cond != null) { if (cond.tipo == (int)Simbolo.Tipo.BOOLEAN) { String eTemp = cond.etqVerdadera; cond.etqVerdadera = cond.etqFalsa; cond.etqFalsa = eTemp; } } return(cond); }
public static void evaluarSi(ParseTreeNode expresion, ParseTreeNode sentencias, String eSalida) { // Si (Expresion) { Sentencias } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Inicio de la sentencia 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 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 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); } } }
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); }