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 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 generarNativaC3D(Nodo expresion, String nombre, int tipo) { // Parametros // cadena valor : P + 1 // retorno entero : P + 0 String tam = Convert.ToString(C3DSentencias.procedimientoActual.tam); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar la cadena")); String t1 = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, "P", "+", tam)); String t2 = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t2, t1, "+", "1")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", t1, expresion.cadena)); // Aumentar ambito GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tam)); // Llamar a la funcion nativa GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, nombre)); // Recuperar el retorno GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Recuperar el retorno")); String t3 = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t3, "P", "+", "0")); Nodo nodo = new Nodo(); nodo.cadena = GeneradorC3D.getTemporal(); nodo.tipo = tipo; GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", nodo.cadena, t3)); // Disminuir ambito GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tam)); return(nodo); }
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 List <C3D> compilar(String texto, RichTextBox consola, int lenguaje, String clase) { // *************** FASE 1 Analisis Lexico y Sintactico **************// if (lenguaje == (int)Pagina.Lenguaje.OLC) { // OLC++ InterpreteOLC interprete = new InterpreteOLC(); clases = interprete.analizarOLC(texto); clase = clase.Replace(".olc", ""); } else { // Tree InterpreteTree interprete = new InterpreteTree(); clases = interprete.analizarTree(texto); clase = clase.Replace(".tree", ""); } // **************** FASE 2 Llenar Tabla de Simbolos *****************// llenarTablaSimbolos(); // **************** FASE 3 Analisis Semantico y Codigo Intermedio ***// if (clases.Count > 0) { Clase main = buscarMain(clases[0]); if (main == null) { // Error! No hay procedimiento main en la clase de inicio! return(null); } GeneradorC3D.clases = clases; return(GeneradorC3D.generarC3D(main)); } return(null); }
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 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); }
public static void guardarC3D(string id, ParseTreeNode arreglo, Acceso.Tipo tipo) { Acceso.actual = null; Nodo nodo = Acceso.generarC3DID(id, tipo, "P", "Stack"); if (nodo == null) { return; } Simbolo sid; if (C3DSentencias.procedimientoActual == null) { sid = TablaSimbolos.getInstance.buscarVariable(id, C3DSentencias.claseActual.nombre, null, tipo); } else { sid = TablaSimbolos.getInstance.buscarVariable(id, C3DSentencias.claseActual.nombre, C3DSentencias.procedimientoActual.nombre, tipo); } // Recorrer los valores del arreglo y guardarlos en la posicion empezando en 0 if (arreglo != null && sid.dimensiones != null) { List <int> dimensiones = new List <int>(); dimensionesArreglo(arreglo, ref dimensiones); for (int i = 0; i < sid.dimensiones.Count; i++) { if (dimensiones[i] != sid.dimensiones[i]) { // Error semantico! No es de las dimensiones que solicita! return; } } // Todo bien! /* String t1 = GeneradorC3D.getTemporal(); * GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, * "// Obtener puntero al heap del arreglo " + id)); * GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, nodo.estructura, t1, nodo.referencia)); */ int tamH = sid.getTamanioTotal(); String t1 = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar H disponible en " + id)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, nodo.estructura, nodo.referencia, "H")); recorrerDimensiones(arreglo, "H"); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Incrementar H para reservar tam del arreglo " + id)); GeneradorC3D.aumentarHeap(Convert.ToString(tamH)); } }
/* * 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 void parametrosC3D(String temp, List <Simbolo> parametros, List <Nodo> expresiones) { for (int i = 0; i < parametros.Count; i++) { // Generar C3D de parametro String t1 = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion del parametro")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, temp, "+", Convert.ToString(parametros[i].pos))); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar expresion como parametro en la posicion " + i)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", t1, expresiones[i].cadena)); } }
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 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); }
//GENERAR CADENAS! public static Nodo guardarCadenaC3D(String cadena) { //CADENA -> tchar | tstring Nodo nuevo = new Nodo(); nuevo.tipo = (int)Simbolo.Tipo.CADENA; nuevo.cadena = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nuevo.cadena, "H", "+", "0")); foreach (char c in cadena) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar " + c)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", Convert.ToString((int)c))); GeneradorC3D.aumentarHeap("1"); } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0")); GeneradorC3D.aumentarHeap("1"); return(nuevo); }
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)); } }
public static String retornarC3D(int f, int c) { if (procedimientoActual.rol != (int)Simbolo.Tipo.CONSTRUCTOR) { if (procedimientoActual.rol == (int)Simbolo.Tipo.METODO) { // Error! Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "El metodo " + procedimientoActual.nombre + "no tiene retorno!", f, c)); return(""); } } String temp = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion del retorno en el ambito actual ")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, "P", "+", "2")); return(temp); }
public static Nodo generarAsignacionC3D(string id, ParseTreeNode indices, Acceso.Tipo tipo) { Simbolo sid; if (C3DSentencias.procedimientoActual == null) { sid = TablaSimbolos.getInstance.buscarVariable(id, C3DSentencias.claseActual.nombre, null, tipo); } else { sid = TablaSimbolos.getInstance.buscarVariable(id, C3DSentencias.claseActual.nombre, C3DSentencias.procedimientoActual.nombre, tipo); } if (sid == null) { // Error Semantico! return(null); } if (sid.dimensiones == null) { // Error Semantico! No es un arreglo! return(null); } Nodo nodo = Acceso.generarC3DID(id, tipo, "P", "Stack"); String tpos = generarParametrizacionC3D(indices, sid); if (nodo != null && tpos != null) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar la posicion del Heap del arreglo y la posicion del arreglo")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.referencia, nodo.cadena, "+", tpos)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener el valor en la posicion del arreglo " + id)); nodo.cadena = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Heap", nodo.cadena, nodo.referencia)); } return(nodo); }
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); }
private static void generarC3DMain(Clase clase) { C3DSentencias.claseActual = clase; Simbolo smain = TablaSimbolos.getInstance.getProcedimiento(clase.nombre, "main"); // Guardar this de la clase main instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Reservar espacio para this y super de " + clase.nombre)); String t1 = getTemporal(); instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar inicio -> pos 0")); instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, "H", "+", "0")); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", "0", "0")); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", "1", "1")); GeneradorC3D.aumentarHeap("2"); // Generar this y super generarC3DThis(clase, t1, "Heap"); // Guardar super de la clase main generarC3DSuper(clase, t1, "Heap"); instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Llamada al main")); instrucciones.Add(new C3D((int)C3D.TipoC3D.LLAMADA, clase.nombre + "_main")); instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Terminar la ejecucion")); instrucciones.Add(new C3D((int)C3D.TipoC3D.EXIT, "")); }
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 Nodo generarSumaC3D(ParseTreeNode izq, ParseTreeNode der) { Nodo nodo = new Nodo(); Nodo nizq = Expresion.expresionC3D(izq); Nodo nder = Expresion.expresionC3D(der); if (nizq == null || nder == null) { return(null); } if (nizq.tipo == (int)Simbolo.Tipo.VACIO) { //Error: NullPointerException } if (nder.tipo == (int)Simbolo.Tipo.VACIO) { //Error: NullPointerException } switch (nizq.tipo) { case (int)Simbolo.Tipo.NUMERO: if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.CARACTER || nder.tipo == (int)Simbolo.Tipo.BOOLEAN || nder.tipo == (int)Simbolo.Tipo.DECIMAL) { String temp = GeneradorC3D.getTemporal(); // temp = nizq.cad operador nder.der GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar dos temporales, num + num")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "+", nder.cadena)); nodo.cadena = temp; nodo.tipo = nizq.tipo; if (nder.tipo == (int)Simbolo.Tipo.DECIMAL) { nodo.tipo = nder.tipo; } return(nodo); } else if (nder.tipo == (int)Simbolo.Tipo.CADENA) { nodo.cadena = GeneradorC3D.getTemporal(); nodo.tipo = nder.tipo; GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , num + str")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "H", "+", "0")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Reservar espacio para nueva cadena")); concatenar(nizq.tipo, nizq.cadena); concatenar(nder.tipo, nder.cadena); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0")); GeneradorC3D.aumentarHeap("1"); return(nodo); } break; case (int)Simbolo.Tipo.DECIMAL: if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.CARACTER || nder.tipo == (int)Simbolo.Tipo.BOOLEAN || nder.tipo == (int)Simbolo.Tipo.DECIMAL) { String temp = GeneradorC3D.getTemporal(); // temp = nizq.cad operador nder.der GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar dos temporales, decimal + num")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "+", nder.cadena)); nodo.cadena = temp; nodo.tipo = nizq.tipo; return(nodo); } else if (nder.tipo == (int)Simbolo.Tipo.CADENA) { nodo.cadena = GeneradorC3D.getTemporal(); nodo.tipo = nder.tipo; GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , decimal + str")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "H", "+", "0")); concatenar(nizq.tipo, nizq.cadena); concatenar(nder.tipo, nder.cadena); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0")); GeneradorC3D.aumentarHeap("1"); return(nodo); } break; case (int)Simbolo.Tipo.CARACTER: if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.DECIMAL) { String temp = GeneradorC3D.getTemporal(); // temp = nizq.cad operador nder.der GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar dos temporales, caracter + num")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "+", nder.cadena)); nodo.cadena = temp; nodo.tipo = nder.tipo; return(nodo); } else if (nder.tipo == (int)Simbolo.Tipo.CADENA) { nodo.cadena = GeneradorC3D.getTemporal(); nodo.tipo = nder.tipo; GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , caracter + str")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "H", "+", "0")); concatenar(nizq.tipo, nizq.cadena); concatenar(nder.tipo, nder.cadena); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0")); GeneradorC3D.aumentarHeap("1"); return(nodo); } break; case (int)Simbolo.Tipo.BOOLEAN: if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.DECIMAL) { String temp = GeneradorC3D.getTemporal(); if (nder.tipo == (int)Simbolo.Tipo.NUMERO) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar , bool + num")); } else { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar , bool + decimal")); } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "+", nder.cadena)); nodo.cadena = temp; nodo.tipo = nder.tipo; return(nodo); } else if (nder.tipo == (int)Simbolo.Tipo.BOOLEAN) { return(Logica.generarC3D(izq, "||", der)); } break; case (int)Simbolo.Tipo.CADENA: if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.DECIMAL || nder.tipo == (int)Simbolo.Tipo.CARACTER) { nodo.cadena = GeneradorC3D.getTemporal(); nodo.tipo = nizq.tipo; if (nder.tipo == (int)Simbolo.Tipo.NUMERO) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , str + num")); } else if (nder.tipo == (int)Simbolo.Tipo.DECIMAL) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , str + decimal")); } else { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , str + caracter")); } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "H", "+", "0")); concatenar(nizq.tipo, nizq.cadena); concatenar(nder.tipo, nder.cadena); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0")); GeneradorC3D.aumentarHeap("1"); return(nodo); } else if (nder.tipo == (int)Simbolo.Tipo.CADENA) { nodo.cadena = GeneradorC3D.getTemporal(); nodo.tipo = nizq.tipo; GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , str + str")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "H", "+", "0")); concatenar(nizq.tipo, nizq.cadena); concatenar(nder.tipo, nder.cadena); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0")); GeneradorC3D.aumentarHeap("1"); return(nodo); } break; } // Error semantico! Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "No se puede sumar " + Simbolo.getValor(nizq.tipo) + " con " + Simbolo.getValor(nder.tipo) + ".", izq.Span.Location.Line, izq.Span.Location.Column)); return(null); }
public static Nodo generarC3DID(String id, Tipo tipo, String puntero, String estructura) { // id Simbolo sid; Nodo nodo = new Nodo(); nodo.estructura = estructura; if (C3DSentencias.procedimientoActual == null || actual != null) { if (actual != null) { if (actual.tipo != (int)Simbolo.Tipo.CLASE) { // Error! No es una clase, no se puede acceder! return(null); } estructura = "Heap"; sid = TablaSimbolos.getInstance.buscarVariable(id, actual.clase, null, tipo); } else { sid = TablaSimbolos.getInstance.buscarVariable(id, C3DSentencias.claseActual.nombre, null, tipo); } } else { sid = TablaSimbolos.getInstance.buscarVariable(id, C3DSentencias.claseActual.nombre, C3DSentencias.procedimientoActual.nombre, tipo); } if (sid != null) { String pos = "1"; if (sid.ambito == (int)Simbolo.Tipo.GLOBAL) { // Global if ((actual == null && C3DSentencias.claseActual.nombre.Equals(sid.padre)) || (actual != null && sid.padre.Equals(actual.clase))) { pos = "0"; } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// El " + id + "es global!")); String t1 = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion de este o super")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, puntero, "+", pos)); String t2 = t1; if (estructura.Equals("Stack")) { t2 = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion del ambito self o super en el Heap")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, estructura, t2, t1)); } estructura = "Heap"; String t9 = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion del ambito self o super")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, estructura, t9, t2)); puntero = t9; } // Generar C3D para buscar la posicion de ID y luego el valor String t3 = GeneradorC3D.getTemporal(); String t4 = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion del " + id)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t3, puntero, "+", Convert.ToString(sid.pos))); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener valor del " + id)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, estructura, t4, t3)); actual = sid; nodo.tipo = sid.tipo; nodo.referencia = t3; nodo.cadena = t4; nodo.estructura = estructura; return(nodo); } else { // Error: La variable id no existe! return(null); } }
public static void evaluarXC3D(ParseTreeNode exp1, ParseTreeNode exp2, ParseTreeNode sentencias) { //WHILEX -> EXP EXP Sentencias String eInicio = GeneradorC3D.getEtiqueta(); String eSen = GeneradorC3D.getEtiqueta(); String eCond = GeneradorC3D.getEtiqueta(); String eSalida = GeneradorC3D.getEtiqueta(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Inicializar temporal auxiliar")); String taux = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, taux, "0", "", "")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Etiqueta de Inicio del ciclo X")); GeneradorC3D.generarEtiquetas((eInicio)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Evaluar condicion 1")); Nodo cond1 = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, Expresion.expresionC3D(exp1), exp1.Span.Location.Line, exp1.Span.Location.Column); if (cond1 != null) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Etiqueta verdadera primera condicion")); GeneradorC3D.generarEtiquetas(cond1.etqVerdadera); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Evaluar condicion por primera vez")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eSen, taux, "==", "0")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eCond)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Etiqueta falsa primera condicion")); GeneradorC3D.generarEtiquetas(cond1.etqFalsa); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eSalida, taux, "==", "1")); GeneradorC3D.generarEtiquetas(eCond); Nodo cond2 = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, Expresion.expresionC3D(exp2), exp2.Span.Location.Line, exp2.Span.Location.Column); if (cond2 != null) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Etiqueta verdadera segunda condicion")); GeneradorC3D.generarEtiquetas(cond2.etqVerdadera); GeneradorC3D.generarEtiquetas(eSen); GeneradorC3D.display.agregarCiclo((int)Ciclo.TipoCiclo.WHILEX, "", eInicio, eSalida); // Sentencias de X GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sentencia del ciclo X")); C3DSentencias.generarC3D(sentencias); GeneradorC3D.display.removerCiclo(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, taux, "1", "", "")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Salta al inicio")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Etiqueta falsa segunda condicion y salida")); GeneradorC3D.generarEtiquetas(cond2.etqFalsa); GeneradorC3D.generarEtiquetas(eSalida); } } }
private static void generarC3DClases() { // Recorrer cada una de las clases foreach (Clase clase in clases) { C3DSentencias.claseActual = clase; // Recorrer cada uno de los constructores foreach (Procedimiento constructor in clase.constructores) { C3DSentencias.procedimientoActual = TablaSimbolos.getInstance.getProcedimiento(clase.nombre, constructor.completo); //C3DSentencias.procedimientoActual = constructor.completo; instrucciones.Add(new C3D((int)C3D.TipoC3D.INICIO_METODO, clase.nombre + "_" + constructor.completo)); // Guardar H en t1 String t1 = GeneradorC3D.getTemporal(); instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar apuntador de la instancia")); instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, "H", "+", "0")); GeneradorC3D.aumentarHeap("2"); // Generar this y super String t2 = getTemporal(); instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t2, "P", "+", "0")); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", t2, t1)); generarC3DThis(clase, t1, "Heap"); t2 = getTemporal(); instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t2, "P", "+", "1")); String t5 = getTemporal(); instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t5, t1, "+", "1")); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", t2, t5)); generarC3DSuper(clase, t1, "Heap"); String t3 = getTemporal(); String t4 = getTemporal(); instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t3, t1, "+", "1")); instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t4, "P", "+", "1")); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", t4, t3)); // Sentencias del constructor C3DSentencias.generarC3D(constructor.sentencias); // Guardar en retorno la posicion del objeto creado String temp = C3DSentencias.retornarC3D(constructor.linea, constructor.columna); if (!temp.Equals("")) { instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno en la posicion")); instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", temp, t1)); } instrucciones.Add(new C3D((int)C3D.TipoC3D.FIN_METODO, "}")); } // Recorrer cada uno de los procedimientos foreach (Procedimiento procedimiento in clase.procedimientos) { C3DSentencias.eFinProcedimiento = getEtiqueta(); //C3DSentencias.procedimientoActual = procedimiento.completo; C3DSentencias.procedimientoActual = TablaSimbolos.getInstance.getProcedimiento(clase.nombre, procedimiento.completo); instrucciones.Add(new C3D((int)C3D.TipoC3D.INICIO_METODO, clase.nombre + "_" + procedimiento.completo)); // Sentencias del procedimiento C3DSentencias.generarC3D(procedimiento.sentencias); generarEtiquetas(C3DSentencias.eFinProcedimiento); C3DSentencias.eFinProcedimiento = null; instrucciones.Add(new C3D((int)C3D.TipoC3D.FIN_METODO, "}")); } } }
public static void generarC3D(ParseTreeNode sentencias) { foreach (ParseTreeNode sentencia in sentencias.ChildNodes) { switch (sentencia.Term.Name) { case "DECLARACION": if (sentencia.ChildNodes.Count == 3) { declararAsignarC3D(sentencia); } break; case "ASIGNACION": asignarC3D(sentencia); break; case "SUPER": if (sentencia.ChildNodes[1].Term.Name.Equals("ASIGNACION")) { asignarC3D(sentencia); } else if (sentencia.ChildNodes[1].Term.Name.Equals("ACCESO")) { // super + ACCESO Acceso.generarC3DAcceso(sentencia.ChildNodes[1], Acceso.Tipo.SUPER, null); } else { // super + [ + EXPS + ] } break; case "ACCESO": Acceso.generarC3DAcceso(sentencia, Acceso.Tipo.NINGUNO, null); break; case "RETORNO": if (procedimientoActual != null) { if (procedimientoActual.rol == (int)Simbolo.Tipo.FUNCION) { // Evaluar expresion Nodo expRetorno = Expresion.expresionC3D(sentencia.ChildNodes[0]); if (expRetorno != null) { // Guardar en retorno la posicion del objeto creado String temp = C3DSentencias.retornarC3D(sentencia.Span.Location.Line, sentencia.Span.Location.Column); if (!temp.Equals("")) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno en la posicion")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", temp, expRetorno.cadena)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Salto al final de la funcion " + procedimientoActual.nombre)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eFinProcedimiento)); } } } else { if (procedimientoActual.rol == (int)Simbolo.Tipo.METODO) { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "Retornar vino dentro de un metodo!", sentencia.Span.Location.Line, sentencia.Span.Location.Column)); } else { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "Retornar vino dentro de un constructor!", sentencia.Span.Location.Line, sentencia.Span.Location.Column)); } } } break; case "IMPRIMIR": Nodo exp = Expresion.expresionC3D(sentencia.ChildNodes[1]); // Recorrer e imprimir segun el caso if (exp != null) { Imprimir.imprimirC3D(exp); } break; case "NATIVAS": Nodo expN = Expresion.expresionC3D(sentencia.ChildNodes[1]); if (expN != null) { Convertidor.generarC3D(sentencia.ChildNodes[0].Token.Text, expN); } break; case "CONTINUAR": // continue; String eInicio = GeneradorC3D.display.buscarInicio(); if (eInicio == null) { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "Continuar vino fuera de un ciclo.", sentencia.Span.Location.Line, sentencia.Span.Location.Column)); } else { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Continue")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio)); } break; case "INTERRUMPIR": // break; String eSalidaI = GeneradorC3D.display.buscarSalida(); if (eSalidaI == null) { Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO, "Interrumpir vino fuera de un ciclo.", sentencia.Span.Location.Line, sentencia.Span.Location.Column)); } else { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Break")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eSalidaI)); } break; case "IF1": // IF1 -> EXP Sentencias String eSalida = GeneradorC3D.getEtiqueta(); Si.evaluarSi(sentencia.ChildNodes[0], sentencia.ChildNodes[1], eSalida); GeneradorC3D.generarEtiquetas(eSalida); break; case "IF2": // IF2 -> EXP Sentencias Sentencias String eSalida2 = GeneradorC3D.getEtiqueta(); Si.evaluarSi(sentencia.ChildNodes[0], sentencia.ChildNodes[1], eSalida2); Si.evaluarSino(sentencia.ChildNodes[2], eSalida2); GeneradorC3D.generarEtiquetas(eSalida2); break; case "IF3": // IF3 -> EXP Sentencias IF4 /* * IF4.Rule = IF4 EXP Sentencias | EXP Sentencias; * */ String eSalida3 = GeneradorC3D.getEtiqueta(); Si.evaluarSi(sentencia.ChildNodes[0], sentencia.ChildNodes[1], eSalida3); Si.evaluarIF4(sentencia.ChildNodes[2], eSalida3); GeneradorC3D.generarEtiquetas(eSalida3); break; case "IF5": // IF5 -> EXP Sentencias IF4 Sentencias String eSalida4 = GeneradorC3D.getEtiqueta(); Si.evaluarSi(sentencia.ChildNodes[0], sentencia.ChildNodes[1], eSalida4); Si.evaluarIF4(sentencia.ChildNodes[2], eSalida4); Si.evaluarSino(sentencia.ChildNodes[3], eSalida4); GeneradorC3D.generarEtiquetas(eSalida4); break; case "FOR": // FOR.Rule = Fasignar (D o A) EXP EXP Sentencias // Declarar o asignar! Para.evaluarParaC3D(sentencia.ChildNodes[0], sentencia.ChildNodes[1], sentencia.ChildNodes[2], sentencia.ChildNodes[3]); break; case "WHILE": //WHILE -> EXP Sentencias Mientras.evaluarMientrasC3D(sentencia.ChildNodes[0], sentencia.ChildNodes[1]); break; case "X": X.evaluarXC3D(sentencia.ChildNodes[0], sentencia.ChildNodes[1], sentencia.ChildNodes[2]); break; case "REPEAT": Repetir.evaluarRepetirC3D(sentencia.ChildNodes[0], sentencia.ChildNodes[1]); break; case "DO_WHILE": Hacer.evaluarHacerC3D(sentencia.ChildNodes[0], sentencia.ChildNodes[1]); break; case "SWITCH": Elegir.evaluarElegirC3D(sentencia.ChildNodes[0], sentencia.ChildNodes[1]); break; case "LOOP": Loop.evaluarLoopC3D(sentencia.ChildNodes[0].ChildNodes[0]); break; } } }
public static Nodo llamadaC3D(ParseTreeNode llamada, Acceso.Tipo tipo) { // LLAMADA.Rule = id + apar + EXPS + CPAR Nodo nodo = new Nodo(); String id = llamada.ChildNodes[0].Token.Text; // Evaluar las expresiones List <Nodo> expresiones = new List <Nodo>(); String llave = getExpresiones(llamada.ChildNodes[1], ref expresiones); if (llave != null) { llave = id + llave; Simbolo procedimiento; // Buscar en la clase que se necesita List <Simbolo> sparametros; if (tipo == Acceso.Tipo.SUPER) { // Buscar en el padre if (C3DSentencias.claseActual.padre == null) { return(null); } procedimiento = TablaSimbolos.getInstance.getProcedimiento( C3DSentencias.claseActual.padre, llave); if (procedimiento == null) { // Error! No existe el procedimiento en la clase padre return(null); } else { if (procedimiento.visibilidad == (int)Simbolo.Visibilidad.PRIVADO) { // Error! No se puede acceder a un procedimiento privado! return(null); } } sparametros = TablaSimbolos.getInstance.getParametros( C3DSentencias.claseActual.padre, procedimiento); } else { // Buscar en la clase actual procedimiento = TablaSimbolos.getInstance.getProcedimiento( C3DSentencias.claseActual.nombre, llave); if (procedimiento == null) { // Error! No existe el procedimiento en la clase } sparametros = TablaSimbolos.getInstance.getParametros( C3DSentencias.claseActual.nombre, procedimiento); } if (expresiones.Count == sparametros.Count) { int tam = GeneradorC3D.tamMain; if (C3DSentencias.procedimientoActual != null) { // Esta en el main! tam = C3DSentencias.procedimientoActual.tam; } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Pasar los parametros")); String taux = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Crear un temporal auxiliar para el incremento del ambito")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, taux, "P", "+", Convert.ToString(tam))); parametrosC3D(taux, sparametros, expresiones); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Incrementar el ambito")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", Convert.ToString(tam))); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Llamar al procedimiento " + llave)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.LLAMADA, procedimiento.padre + "_" + llave)); // Ver si hay retorno Y guardarlo if (procedimiento.rol == (int)Simbolo.Tipo.FUNCION) { String temp = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion del retorno en el ambito actual ")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, "P", "+", "2")); nodo.cadena = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener valor del retorno de la funcion " + llave)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", nodo.cadena, temp)); nodo.tipo = procedimiento.tipo; } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir el ambito ")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", Convert.ToString(tam))); } else { // Error! Faltan parametros! return(null); } } return(nodo); }
public static Nodo instanciaC3D(ParseTreeNode nuevo, Acceso.Tipo tipo) { // NUEVO -> new id EXPS // SUPER -> super [ EXPS ] Nodo nodo = new Nodo(); // NUEVO String idC = nuevo.ChildNodes[1].Token.Text; // Buscar que la clase exista Clase instancia = GeneradorC3D.getClasePadre(idC); if (instancia != null) { List <Nodo> expresiones = new List <Nodo>(); String llave = getExpresiones(nuevo.ChildNodes[2], ref expresiones); if (llave != null) { llave = "constructor" + llave; Simbolo procedimiento = TablaSimbolos.getInstance.getProcedimiento( instancia.nombre, llave); if (procedimiento == null || procedimiento.visibilidad == (int)Simbolo.Visibilidad.PRIVADO) { // Error Semantico! No se puede hacer instancia por ser privado return(null); } // Get parametros List <Simbolo> sparametros = TablaSimbolos.getInstance.getParametros( instancia.nombre, procedimiento); if (expresiones.Count == sparametros.Count) { int tam = GeneradorC3D.tamMain; if (C3DSentencias.procedimientoActual != null) { // Esta en el main! tam = C3DSentencias.procedimientoActual.tam; } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Pasar los parametros")); String taux = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Crear un temporal auxiliar para el incremento del ambito")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, taux, "P", "+", Convert.ToString(tam))); parametrosC3D(taux, sparametros, expresiones); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Incrementar el ambito")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", Convert.ToString(tam))); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Llamar al procedimiento " + llave)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.LLAMADA, instancia.nombre + "_" + llave)); // Ver si hay retorno Y guardarlo String temp = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion del retorno en el ambito actual ")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, "P", "+", "2")); nodo.cadena = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener valor del retorno de la funcion " + llave)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", nodo.cadena, temp)); nodo.tipo = (int)Simbolo.Tipo.CLASE; GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir el ambito ")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", Convert.ToString(tam))); } } } return(nodo); }
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 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); }