public static void evaluarLoopC3D(ParseTreeNode sentencias) { //LOOP -> Sentencias String eInicio = GeneradorC3D.getEtiqueta(); String eSal = GeneradorC3D.getEtiqueta(); GeneradorC3D.generarEtiquetas((eInicio)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sentencias de loop")); GeneradorC3D.display.agregarCiclo((int)Ciclo.TipoCiclo.LOOP, "", eInicio, eSal); // Sentencias de Loop C3DSentencias.generarC3D(sentencias); Ciclo loop = GeneradorC3D.display.getCiclo(); if (loop.interrupciones == 0) { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "El loop no contiene sentencia de escape!", sentencias.Span.Location.Line, sentencias.Span.Location.Column)); } GeneradorC3D.display.removerCiclo(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio)); GeneradorC3D.generarEtiquetas((eSal)); }
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 Nodo sumarCaracteres(String tcadena) { Nodo nodo = new Nodo(); // temporales y etiquetas nodo.tipo = (int)Simbolo.Tipo.NUMERO; nodo.cadena = GeneradorC3D.getTemporal(); String t2 = GeneradorC3D.getTemporal(); String eInicio = GeneradorC3D.getEtiqueta(); String eFin = GeneradorC3D.getEtiqueta(); // Codigo 3D GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Variable de control de suma de caracteres")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "0", "", "")); GeneradorC3D.generarEtiquetas(eInicio); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Acceder a la posicion de la cadena en " + tcadena)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Heap", t2, tcadena)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Diferente de fin de cadena")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eFin, t2, "==", "0")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar el caracter con la var de control")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, nodo.cadena, "+", t2)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Incrementar " + tcadena)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tcadena, tcadena, "+", "1")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio)); GeneradorC3D.generarEtiquetas(eFin); return(nodo); }
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 generarRelacional(String ope, String texto, Nodo nizq, Nodo nder, ParseTreeNode izq, ParseTreeNode der) { Nodo nodo = new Nodo(); nodo.tipo = (int)Simbolo.Tipo.BOOLEAN; nodo.etqVerdadera = GeneradorC3D.getEtiqueta(); nodo.etqFalsa = GeneradorC3D.getEtiqueta(); if (nizq.tipo == (int)Simbolo.Tipo.NUMERO || nizq.tipo == (int)Simbolo.Tipo.DECIMAL) { if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.DECIMAL || nder.tipo == (int)Simbolo.Tipo.CARACTER) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si los dos valores son " + ope)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, nodo.etqVerdadera, nizq.cadena, ope, nder.cadena)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, nodo.etqFalsa)); return(nodo); } } else if (nizq.tipo == (int)Simbolo.Tipo.CARACTER) { if (nder.tipo == (int)Simbolo.Tipo.CADENA) { nder = sumarCaracteres(nder.cadena); } if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.DECIMAL || nder.tipo == (int)Simbolo.Tipo.CARACTER || nder.tipo == (int)Simbolo.Tipo.CADENA) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si los dos valores son " + ope)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, nodo.etqVerdadera, nizq.cadena, ope, nder.cadena)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, nodo.etqFalsa)); return(nodo); } } else if (nizq.tipo == (int)Simbolo.Tipo.CADENA) { nizq = sumarCaracteres(nizq.cadena); if (nder.tipo == (int)Simbolo.Tipo.CADENA) { nder = sumarCaracteres(nder.cadena); } if (nder.tipo == (int)Simbolo.Tipo.CARACTER || nder.tipo == (int)Simbolo.Tipo.CADENA) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si los dos valores son " + ope)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, nodo.etqVerdadera, nizq.cadena, ope, nder.cadena)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, nodo.etqFalsa)); return(nodo); } } Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede comparar si son " + texto + " el tipo " + Simbolo.getValor(nizq.tipo) + " con " + Simbolo.getValor(nder.tipo) + ".", izq.Span.Location.Line, izq.Span.Location.Column)); return(null); }
/* * 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); }
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; } }
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 imprimirC3D(Nodo texp) { if (texp.tipo == (int)Simbolo.Tipo.NUMERO) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR, "%d", texp.cadena)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR, "%c", "13")); } else if (texp.tipo == (int)Simbolo.Tipo.DECIMAL) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR, "%f", texp.cadena)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR, "%c", "13")); } else if (texp.tipo == (int)Simbolo.Tipo.CARACTER) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR, "%c", texp.cadena)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR, "%c", "13")); } else if (texp.tipo == (int)Simbolo.Tipo.CADENA) { // Ciclo para recorrer la cadena String eInicio = GeneradorC3D.getEtiqueta(); String eAux = GeneradorC3D.getEtiqueta(); String eFin = GeneradorC3D.getEtiqueta(); String t2 = GeneradorC3D.getTemporal(); GeneradorC3D.generarEtiquetas(eInicio); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Heap", t2, texp.cadena)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eFin, t2, "==", "0")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eAux, t2, "!=", "-241094.22")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, texp.cadena, texp.cadena, "+", "1")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Heap", t2, texp.cadena)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR, "%f", t2)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, texp.cadena, texp.cadena, "+", "1")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio)); GeneradorC3D.generarEtiquetas(eAux); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR, "%c", t2)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, texp.cadena, texp.cadena, "+", "1")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio)); GeneradorC3D.generarEtiquetas(eFin); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR, "%c", "13")); } else { // Error semantico! } }
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; } } }
/* //ARREGLOS! * public Nodo guardarArregloC3D(Simbolo arr, ParseTreeNode indices, String eError) * { * // INDICES -> INDICES INDICE * // | INDICE * Nodo nuevo = new Nodo(); * if (indices.ChildNodes.Count == 2) * { * Nodo indiceE = guardarArregloC3D(arr, indices.ChildNodes.ElementAt(0), eError); * Nodo dimInterna = getInternasC3D(arr, indices.ChildNodes.ElementAt(1), eError, indiceE.externa); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// " + indiceE.externa.ToString() + " dimension externa!")); * String tam = tablaSimbolos.getTamanio(arr, indiceE.externa, dimInterna.interna).ToString(); * String temp1 = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp1, dimInterna.cadena, "*", tam)); * nuevo.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nuevo.cadena, indiceE.cadena, "+", temp1)); * nuevo.externa = indiceE.externa + 1; * } * else * { * Nodo dimInterna = getInternasC3D(arr, indices.ChildNodes.ElementAt(0), eError, 1); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// 1 dimension externa!")); * nuevo.cadena = getTemporal(); * String tam = tablaSimbolos.getTamanio(arr, 1, dimInterna.interna).ToString(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nuevo.cadena, dimInterna.cadena, "*", tam)); * nuevo.externa = 2; * } * return nuevo; * } * * public Nodo getInternasC3D(Simbolo arr, ParseTreeNode indice, String eError, int externa) * { * // INDICE -> INDICE EXP * // | EXP * Nodo nuevo = new Nodo(); * if (indice.ChildNodes.Count == 2) * { * Nodo indice1 = getInternasC3D(arr, indice.ChildNodes.ElementAt(0), eError, externa); * Nodo exp = expresionC3D(indice.ChildNodes.ElementAt(1)); * String inf = tablaSimbolos.getIndiceInferior(arr, externa, indice1.interna).ToString(); * String sup = tablaSimbolos.getIndiceSuperior(arr, externa, indice1.interna).ToString(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si es menor que el indice inferior")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, exp.cadena, "<", inf)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si es menor que el superior")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, exp.cadena, ">=", sup)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// El indice esta correcto, se procede")); * String temp1 = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp1, exp.cadena, "-", inf)); * String tam = tablaSimbolos.getTamanio(arr, externa, indice1.interna).ToString(); * String temp2 = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp2, temp1, "*", tam)); * nuevo.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nuevo.cadena, indice1.cadena, "+", temp2)); * nuevo.interna = indice1.interna + 1; * } * else * { * //ext -> 1, int -> 1 * Nodo exp = expresionC3D(indice.ChildNodes.ElementAt(0)); * String inf = tablaSimbolos.getIndiceInferior(arr, externa, 1).ToString(); * String sup = tablaSimbolos.getIndiceSuperior(arr, externa, 1).ToString(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si es menor que el indice inferior")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, exp.cadena, "<", inf)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si es menor que el superior")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, exp.cadena, ">=", sup)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// El indice esta correcto, se procede")); * nuevo.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nuevo.cadena, exp.cadena, "-", inf)); * nuevo.interna = 2; * } * return nuevo; * } * * //ID! * public Nodo getIDC3D(ParseTreeNode nodo) * { * Nodo nuevo = new Nodo(); * nuevo.pila = "Stack"; * Simbolo objeto = tablaSimbolos.buscarVariable(nodo.ChildNodes.ElementAt(0). * Token.Value.ToString(), nombreMetodo); * if (objeto == null) * { * objeto = tablaSimbolos.buscarGlobal(nodo.ChildNodes.ElementAt(0).Token.Value.ToString()); * if (objeto == null) * { * Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, * "La variable " + nodo.ChildNodes.ElementAt(0).Token.Value.ToString() + * " no ha sido declarada!", nodo.ChildNodes.ElementAt(0).Token.Location.Line, * nodo.ChildNodes.ElementAt(0).Token.Location.Column)); * return null; * } * } * nuevo.tipo = objeto.tipo; * * String eError = getEtiqueta(); * String eSalida = getEtiqueta(); * ParseTreeNode acceso = nodo.ChildNodes.ElementAt(1); * // Generacion de codigo de referencia y valor... * String temp1 = getTemporal(); * nuevo.posicion = temp1; * if (objeto.ambito == (int)Simbolo.Tipo.GLOBAL) * { * nuevo.referencia = "error"; * } * else * { * if (objeto.dimensiones != null) * { * //ES ARREGLO! * } * else * { * if (objeto.tipo == (int)Simbolo.Tipo.CADENA || objeto.tipo == (int)Simbolo.Tipo.ESTRUCTURA) * { * nuevo.referencia = temp1; * } * else * { * nuevo.referencia = "error"; * } * } * } * String val = "P"; * if (objeto.ambito == (int)Simbolo.Tipo.GLOBAL) * { * val = "0"; * } * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Buscar posicion en pila o heap (global) de " + objeto.nombre)); * C3D ins1 = new C3D((int)C3D.TipoC3D.ASIGNACION, temp1, val, "+", objeto.pos.ToString()); * instrucciones.Add(ins1); * Simbolo ter1 = new Simbolo(); * ter1.tipo = (int)Simbolo.Tipo.ETIQUETA; * ter1.nombre = temp1; * ter1.padre = nombreMetodo; * ter1.instruccion = ins1; * nuevo.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Buscar valor de " + objeto.nombre)); * C3D ins2 = new C3D((int)C3D.TipoC3D.ACCESO, nuevo.pila, nuevo.cadena, temp1); * instrucciones.Add(ins2); * Simbolo ter2 = new Simbolo(); * ter2.tipo = (int)Simbolo.Tipo.ETIQUETA; * ter2.nombre = nuevo.cadena; * ter2.padre = nombreMetodo; * ter2.instruccion = ins2; * if (enRetorno && !esParametro) * { * tablaSimbolos.Add(ter1); * tablaSimbolos.Add(ter2); * } * if (acceso.ChildNodes.Count > 0) * { * // SE HACE EL ACCESO! * if (objeto.tipo == (int)Simbolo.Tipo.ESTRUCTURA) * { * nuevo.padre = objeto.estructura; * nuevo = getAccesoC3D(nuevo, acceso, eError); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Salto a salida")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eSalida)); * generarEtiquetas((eError)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// NullPointerException")); * String taux = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Apuntar al proximo ambito")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, taux, "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del primer parametro, referencia")); * String tpar1 = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar1, taux, "+", "102")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar1, "0")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de exit")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.EXIT, "exit")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de exit")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString())); * generarEtiquetas((eSalida)); * } * else * { * //Error! * Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, * "El objeto " + objeto.nombre + " no es una estructura, no se puede acceder!", * nodo.ChildNodes.ElementAt(0).Token.Location.Line, * nodo.ChildNodes.ElementAt(0).Token.Location.Column)); * return null; * } * } * return nuevo; * } * * //ACCESO! * public Nodo getAccesoC3D(Nodo objeto, ParseTreeNode accesos, String eError) * { * // ID (ACCESO -> .ID.ID.ID...) * // En objeto trae el valor en cadena y en padre trae el nombre del objeto a accesar * * foreach (ParseTreeNode acceso in accesos.ChildNodes) * { * int tipo = objeto.tipo; * String padre = objeto.padre; * if (tipo == (int)Simbolo.Tipo.ESTRUCTURA) * { * Simbolo atributo = tablaSimbolos.buscarAtributo(acceso.Token.Value.ToString(), padre); * if (atributo == null) * { * Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, * "El atributo " + acceso.Token.Value.ToString() + * " no existe en " + objeto.padre + "!", acceso.Token.Location.Line, * acceso.Token.Location.Column)); * return null; * } * objeto.tipo = atributo.tipo; * objeto.padre = atributo.estructura; * // Realizar C3D * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Verificar que no sea NULL")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, objeto.cadena, "==", "-201314863.102494")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion de " + atributo.nombre)); * objeto.referencia = getTemporal(); * objeto.posicion = objeto.referencia; * objeto.pila = "Heap"; * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, objeto.referencia, objeto.cadena, "+", atributo.pos.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener valor de " + atributo.nombre)); * objeto.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Heap", objeto.cadena, objeto.referencia)); * if (!(objeto.tipo == (int)Simbolo.Tipo.CADENA || objeto.tipo == (int)Simbolo.Tipo.ESTRUCTURA)) * { * objeto.referencia = "error"; * } * } * else * { * //Error! No se puede acceder algo que no sea una estructura! * Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, * "El atributo " + padre + " no es una estructura, no se puede acceder!", * acceso.Token.Location.Line, * acceso.Token.Location.Column)); * return null; * } * * } * return objeto; * } * * // NATIVAS * public Nodo generarC3DNativas(ParseTreeNode nodo) * { * Nodo retorno = new Nodo(); * switch (nodo.ChildNodes.ElementAt(0).Term.Name) * { * case "inNum": * Nodo expN1 = expresionC3D(nodo.ChildNodes.ElementAt(1)); * Nodo expN2 = expresionC3D(nodo.ChildNodes.ElementAt(2)); * if (expN1 == null || expN2 == null) * { * return null; * } * String taux = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Apuntar al proximo ambito")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, taux, "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del primer parametro, referencia")); * String tpar1 = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar1, taux, "+", "1")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar1, expN1.cadena)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del segundo parametro, num")); * String tpar2 = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar2, taux, "+", "2")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar2, expN2.cadena)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de inNum")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "$$_inNum")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno")); * retorno.referencia = "error"; * retorno.tipo = (int)Simbolo.Tipo.NUMERO; * String tpos = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpos, "P", "+", "0")); * retorno.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", retorno.cadena, tpos)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de inNum")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString())); * break; * case "getBool": * Nodo expB1 = expresionC3D(nodo.ChildNodes.ElementAt(1)); * if (expB1 == null) * { * return null; * } * String tauxB = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Apuntar al proximo ambito")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tauxB, "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del primer parametro, referencia")); * String tpar1B = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar1B, tauxB, "+", "1")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar1B, expB1.cadena)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de getBool")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "$$_getBool")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno")); * retorno.referencia = "error"; * retorno.tipo = (int)Simbolo.Tipo.BOOLEAN; * String tposB = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tposB, "P", "+", "0")); * retorno.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", retorno.cadena, tposB)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de getBool")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString())); * break; * case "getNum": * Nodo expgN1 = expresionC3D(nodo.ChildNodes.ElementAt(1)); * Nodo expgN2 = expresionC3D(nodo.ChildNodes.ElementAt(2)); * Nodo expgN3 = expresionC3D(nodo.ChildNodes.ElementAt(3)); * if (expgN1 == null || expgN2 == null || expgN3 == null) * { * return null; * } * String tauxg = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Apuntar al proximo ambito")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tauxg, "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del primer parametro, referencia")); * String tpar1g = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar1g, tauxg, "+", "1")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar1g, expgN1.cadena)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del segundo parametro, referencia")); * String tpar2g = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar2g, tauxg, "+", "2")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar2g, expgN2.cadena)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del tercer parametro, num")); * String tpar3g = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar3g, tauxg, "+", "3")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar3g, expgN3.cadena)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de getNum")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "$$_getNum")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno")); * retorno.referencia = "error"; * retorno.tipo = (int)Simbolo.Tipo.NUMERO; * String tposg = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tposg, "P", "+", "0")); * retorno.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", retorno.cadena, tposg)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de getNum")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString())); * break; * case "getLength": * if (nodo.ChildNodes.Count == 2) * { * //getLength * Nodo expLN1 = expresionC3D(nodo.ChildNodes.ElementAt(1)); * if (expLN1 == null) * { * return null; * } * String tauxl = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Apuntar al proximo ambito")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tauxl, "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del primer parametro, referencia")); * String tpar1l = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar1l, tauxl, "+", "1")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar1l, expLN1.cadena)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de getStrLength")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "$$_getStrLength")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno")); * retorno.referencia = "error"; * retorno.tipo = (int)Simbolo.Tipo.NUMERO; * String tposl = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tposl, "P", "+", "0")); * retorno.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", retorno.cadena, tposl)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de getStrLength")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString())); * * } * else * { * //getLengthArreglo -> id num * String id = nodo.ChildNodes.ElementAt(1).Token.Value.ToString(); * Simbolo arreglo = tablaSimbolos.buscarVariable(id, nombreMetodo); * if (arreglo == null) * { * arreglo = tablaSimbolos.buscarGlobal(id); * if (arreglo == null) * { * Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, * "El arreglo " + nodo.ChildNodes.ElementAt(0).Token.Value.ToString() + * " no ha sido declarado!", nodo.ChildNodes.ElementAt(0).Token.Location.Line, * nodo.ChildNodes.ElementAt(0).Token.Location.Column)); * return null; * } * } * if (arreglo.dims == -1) * { * Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, * "La variable " + nodo.ChildNodes.ElementAt(0).Token.Value.ToString() + * " no es de tipo areglo!", nodo.ChildNodes.ElementAt(0).Token.Location.Line, * nodo.ChildNodes.ElementAt(0).Token.Location.Column)); * return null; * } * int dimension = Convert.ToInt32(nodo.ChildNodes.ElementAt(2).Token.Value.ToString()); * int tam = tablaSimbolos.getTamanio(arreglo, dimension); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de getArrLength")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "getArrLength")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno")); * retorno.referencia = "error"; * retorno.tipo = (int)Simbolo.Tipo.NUMERO; * retorno.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, retorno.cadena, tam.ToString(), "", "")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de getArrLength")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString())); * } * break; * default: * // getRandom * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de getRandom")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString())); * instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "$$_getRandom")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno")); * retorno.referencia = "error"; * retorno.tipo = (int)Simbolo.Tipo.NUMERO; * String tposr = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tposr, "P", "+", "0")); * retorno.cadena = getTemporal(); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", retorno.cadena, tposr)); * instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de getRandom")); * instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString())); * break; * } * * return retorno; * } */ //CASTEO DE EXPRESIONES! public static Nodo castearC3D(int tipo, Nodo nodo, int f, int c) { if (nodo == null) { return(null); } if (nodo.tipo == (int)Simbolo.Tipo.BOOLEAN) { if (nodo.etqFalsa == null && nodo.etqVerdadera == null) { nodo.tipo = (int)Simbolo.Tipo.NUMERO; } } if (nodo.tipo == tipo) { return(nodo); } else { Nodo nuevo = new Nodo(); switch (tipo) { case (int)Simbolo.Tipo.NUMERO: if (nodo.tipo == (int)Simbolo.Tipo.CARACTER || nodo.tipo == (int)Simbolo.Tipo.DECIMAL) { nodo.tipo = tipo; return(nodo); } else { // CADENA o BOOLEAN if (nodo.tipo == (int)Simbolo.Tipo.CADENA) { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede castear implicitamente cadena a entero", f, c)); } else { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede castear implicitamente booleano a entero", f, c)); } return(null); } case (int)Simbolo.Tipo.CARACTER: if (nodo.tipo == (int)Simbolo.Tipo.NUMERO || nodo.tipo == (int)Simbolo.Tipo.DECIMAL) { nodo.tipo = tipo; return(nodo); } else { // CADENA o BOOLEAN if (nodo.tipo == (int)Simbolo.Tipo.CADENA) { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede castear implicitamente cadena a caracter", f, c)); } else { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede castear implicitamente booleano a caracter", f, c)); } return(null); } case (int)Simbolo.Tipo.DECIMAL: if (nodo.tipo == (int)Simbolo.Tipo.CARACTER || nodo.tipo == (int)Simbolo.Tipo.NUMERO) { nodo.tipo = tipo; return(nodo); } else { // CADENA o BOOLEAN if (nodo.tipo == (int)Simbolo.Tipo.CADENA) { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede castear implicitamente cadena a decimal", f, c)); } else { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede castear implicitamente booleano a decimal", f, c)); } return(null); } case (int)Simbolo.Tipo.BOOLEAN: // BOOLEAN if (nodo.tipo == (int)Simbolo.Tipo.NUMERO) { nuevo.tipo = tipo; nuevo.etqVerdadera = GeneradorC3D.getEtiqueta(); nuevo.etqFalsa = GeneradorC3D.getEtiqueta(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Castear num a bool")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, nuevo.etqFalsa, nodo.cadena, "==", "0")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, nuevo.etqVerdadera)); return(nuevo); } else { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede castear implicitamente " + Simbolo.getValor(nodo.tipo) + " a bool", f, c)); return(null); } default: // CADENA Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede castear implicitamente " + Simbolo.getValor(nodo.tipo) + " a cadena", f, c)); return(null); } } }
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); }