public static void asignarC3D(ParseTreeNode asignacion) { /* Tree * ASIGNACION.Rule = ACCESO + asignar + EXP; * OLC++ * ASIGNACION.Rule = self + punto + ACCESO + asignar + EXP | ACCESO + asignar + EXP; */ int indice = 0; Acceso.Tipo tipo = Acceso.Tipo.NINGUNO; if (asignacion.ChildNodes[0].Term.Name.Equals("self") || asignacion.ChildNodes[0].Term.Name.Equals("este")) { tipo = Acceso.Tipo.ESTE; indice++; } else if (asignacion.ChildNodes[0].Term.Name.Equals("super")) { tipo = Acceso.Tipo.SUPER; asignacion = asignacion.ChildNodes[1]; } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener valor de la asignacion")); Nodo exp = Expresion.expresionC3D(asignacion.ChildNodes[indice + 1]); if (exp != null) { if (asignacion.ChildNodes[indice].Term.Name.Equals("ACCESO")) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Empezar a Realizar el acceso")); Acceso.generarC3DAcceso(asignacion.ChildNodes[indice], tipo, exp); } } }
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 void recorrerDimensiones(ParseTreeNode arreglo, String pos) { if (arreglo.Term.Name.Equals("ARREGLO")) { foreach (ParseTreeNode arr in arreglo.ChildNodes) { recorrerDimensiones(arr, pos); } } else { Nodo exp = Expresion.expresionC3D(arreglo); if (exp != null) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar expresion en el arreglo")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", pos, exp.cadena)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Incrementar " + pos)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, pos, pos, "+", "1")); } } }
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 declararAsignarC3D(ParseTreeNode declaracion) { /* OLC++ * DECLARACION.Rule = TIPO + LISTA_IDS + asignarR *---* | TIPO + LISTA_IDS + DARREGLO -> INDICES (ARREGLO)? *---* | TIPO + LISTA_IDS; * Tree * DECLARACION.Rule = TIPO + LISTA_IDS + asignarR *---* | TIPO + LISTA_IDS | TIPO + NARREGLO; */ if (declaracion.ChildNodes.Count == 3) { int tipo = Simbolo.getTipo(declaracion.ChildNodes[0].Token.Text); ParseTreeNode ids = declaracion.ChildNodes[1]; foreach (ParseTreeNode id in ids.ChildNodes) { if (declaracion.ChildNodes[2].Term.Name.Equals("DARREGLO")) { ParseTreeNode darr = declaracion.ChildNodes[2]; // Guardar espacio if (darr.ChildNodes.Count == 2) { // DARREGLO -> INDICES ARREGLO Arreglo.guardarC3D(id.Token.Text, darr.ChildNodes[1], Acceso.Tipo.NINGUNO); } else { Arreglo.guardarC3D(id.Token.Text, null, Acceso.Tipo.NINGUNO); } } else { // EXP Acceso.actual = null; Nodo exp = Expresion.expresionC3D(declaracion.ChildNodes[2]); Nodo nodo = Acceso.generarC3DID(id.Token.Text, Acceso.Tipo.NINGUNO, "P", "Stack"); // Asignar la expresion GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, nodo.estructura, nodo.referencia, exp.cadena)); } } } else { // 2 hijos if (declaracion.ChildNodes[1].Term.Name.Equals("NARREGLO")) { ParseTreeNode id = declaracion.ChildNodes[1].ChildNodes[0]; Arreglo.guardarC3D(id.Token.Text, null, Acceso.Tipo.NINGUNO); } } }
public static Nodo generarMenorIgualC3D(ParseTreeNode izq, ParseTreeNode der) { Nodo nizq = Expresion.expresionC3D(izq); Nodo nder = Expresion.expresionC3D(der); if (nizq == null || nder == null) { return(null); } return(generarRelacional("<=", "menor o iguales", nizq, nder, izq, der)); }
public static Nodo generarMayorC3D(ParseTreeNode izq, ParseTreeNode der) { Nodo nizq = Expresion.expresionC3D(izq); Nodo nder = Expresion.expresionC3D(der); if (nizq == null || nder == null) { return(null); } return(generarRelacional(">", "mayor", nizq, nder, izq, der)); }
public static Nodo generarNoIgualC3D(ParseTreeNode izq, ParseTreeNode der) { Nodo nizq = Expresion.expresionC3D(izq); Nodo nder = Expresion.expresionC3D(der); if (nizq == null || nder == null) { return(null); } return(generarRelacional("!=", "diferentes", nizq, nder, izq, der)); }
public static void evaluarCasoC3D(ParseTreeNode exp, Nodo pivote, String eCaso) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Evaluar expresion del caso")); Nodo ncaso = Expresion.expresionC3D(exp); if (ncaso != null) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Evaluar condicion del caso")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eCaso, ncaso.cadena, "==", pivote.cadena)); } }
/* * SWITCH.Rule = selector + caso + EXP + dosp + Eos + BCASO; * * BCASO.Rule = Indent + CASOS + DEFECTO + Dedent | Indent + CASOS + Dedent; | | CASOS.Rule = MakeStarRule(CASOS, CASO); | | CASO.Rule = EXP + dosp + Eos + BLOQUE; | | DEFECTO.Rule = defecto + dosp + Eos + BLOQUE; */ public static void evaluarElegirC3D(ParseTreeNode expresion, ParseTreeNode bcaso) { //SWITCH -> EXP BCASO List <string> etiquetasCaso = new List <string>(); String eTest = GeneradorC3D.getEtiqueta(); String eSal = GeneradorC3D.getEtiqueta(); //Recorrer EXP GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ETIQUETA, eTest)); Nodo nexp = Expresion.expresionC3D(expresion); if (nexp != null) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eTest)); //Recorrer cada caso foreach (ParseTreeNode caso in bcaso.ChildNodes[0].ChildNodes) { //Caso -> ECASO Sentencias String eCaso = GeneradorC3D.getEtiqueta(); etiquetasCaso.Add(eCaso); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Inicio de caso ")); GeneradorC3D.generarEtiquetas((eCaso)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sentencias de caso ")); GeneradorC3D.display.agregarCiclo((int)Ciclo.TipoCiclo.SWITCH, "", "", eSal); // Sentencias de Switch C3DSentencias.generarC3D(caso.ChildNodes[1].ChildNodes[0]); GeneradorC3D.display.removerCiclo(); } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eSal)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ETIQUETA, eTest)); int contar = 0; foreach (ParseTreeNode caso in bcaso.ChildNodes[0].ChildNodes) { evaluarCasoC3D(caso.ChildNodes[0], nexp, etiquetasCaso[contar]); contar++; } //Defecto? if (bcaso.ChildNodes.Count == 2) { //Sentencias de Defecto GeneradorC3D.display.agregarCiclo((int)Ciclo.TipoCiclo.SWITCH, "", "", eSal); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sentencias de defecto")); GeneradorC3D.display.removerCiclo(); C3DSentencias.generarC3D(bcaso.ChildNodes[0].ChildNodes[0]); } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Etiqueta de salida del switch")); GeneradorC3D.generarEtiquetas((eSal)); } }
public static Nodo generarDividirC3D(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.DECIMAL; if (nizq.tipo == (int)Simbolo.Tipo.NUMERO || nizq.tipo == (int)Simbolo.Tipo.CARACTER || nizq.tipo == (int)Simbolo.Tipo.BOOLEAN || nizq.tipo == (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 eError = GeneradorC3D.getEtiqueta(); String eSalida = GeneradorC3D.getEtiqueta(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Dividir num / num")); // Verificar si num en nder no es 0 GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, nder.cadena, "==", "0")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, nizq.cadena, "/", nder.cadena)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eSalida)); GeneradorC3D.generarEtiquetas((eError)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Error: No se puede dividir entre 0")); GeneradorC3D.generarEtiquetas((eSalida)); return(nodo); } } //Error semantico! Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede dividir " + Simbolo.getValor(nizq.tipo) + " con " + Simbolo.getValor(nder.tipo) + ".", izq.Span.Location.Line, izq.Span.Location.Column)); return(null); }
private static String getExpresiones(ParseTreeNode expresiones, ref List <Nodo> exps) { String cadena = ""; foreach (ParseTreeNode nexp in expresiones.ChildNodes) { Nodo exp = Expresion.expresionC3D(nexp); if (exp == null) { return(null); } exps.Add(exp); cadena += "_" + Simbolo.getValor(exp.tipo); } return(cadena); }
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 Nodo generarCrecimientoC3D(ParseTreeNode crecer) { // Es incremento o decremento y tiene que ser de tipo entero // CRECER -> EXP (++ | --) Nodo nodo = Expresion.expresionC3D(crecer.ChildNodes[0]); if (nodo == null) { return(null); } ParseTreeNode varC = crecer.ChildNodes[1]; String ope; if (varC.Term.Name.Equals("++")) { ope = "+"; } else { ope = "-"; } if (nodo.tipo == (int)Simbolo.Tipo.NUMERO || nodo.tipo == (int)Simbolo.Tipo.DECIMAL || nodo.tipo == (int)Simbolo.Tipo.CARACTER) { String temp = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// expresion " + ope + " expresion")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nodo.cadena, ope, "1")); if (!nodo.referencia.Equals("")) { // Guardar en la variable GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "//guardar valor en id")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, nodo.estructura, nodo.referencia, temp)); } nodo.cadena = temp; nodo.tipo = (int)Simbolo.Tipo.DECIMAL; } else { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede incrementar o decrementar el tipo " + Simbolo.getValor(nodo.tipo) + ".", crecer.Token.Location.Line, crecer.Token.Location.Column)); } return(nodo); }
internal static Nodo unarioC3D(ParseTreeNode n2) { Nodo nodo = Expresion.expresionC3D(n2); if (nodo.tipo == (int)Simbolo.Tipo.NUMERO || nodo.tipo == (int)Simbolo.Tipo.DECIMAL) { String temp = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Multiplicar -1 * " + Simbolo.getValor(nodo.tipo))); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, "-1", "*", nodo.cadena)); nodo.cadena = temp; } else { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede cambiar signo a " + Simbolo.getValor(nodo.tipo) + ".", n2.Span.Location.Line, n2.Span.Location.Column)); } return(nodo); }
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)); } }
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 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); } } }
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; } } }
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 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); }
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); }