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 void evaluarSino(ParseTreeNode sentencias, String eSalida) { // Sino { Sentencias } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sentencias de Sino")); C3DSentencias.generarC3D(sentencias); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eSalida)); }
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)); } }
/* * 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 void evaluarSi(ParseTreeNode expresion, ParseTreeNode sentencias, String eSalida) { // Si (Expresion) { Sentencias } GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Inicio de la sentencia Si")); Nodo nsi = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, Expresion.expresionC3D(expresion), expresion.Span.Location.Line, expresion.Span.Location.Column); if (nsi != null) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// La condicion verdadera")); GeneradorC3D.generarEtiquetas((nsi.etqVerdadera)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sentencias de Si")); C3DSentencias.generarC3D(sentencias); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eSalida)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// La condicion falsa")); GeneradorC3D.generarEtiquetas((nsi.etqFalsa)); } }
public static void evaluarMientrasC3D(ParseTreeNode exp, ParseTreeNode sentencias) { String eInicio = GeneradorC3D.getEtiqueta(); GeneradorC3D.generarEtiquetas((eInicio)); Nodo nmientras = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, Expresion.expresionC3D(exp), exp.Span.Location.Line, exp.Span.Location.Column); if (nmientras != null) { GeneradorC3D.generarEtiquetas((nmientras.etqVerdadera)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sentencias de while")); GeneradorC3D.display.agregarCiclo((int)Ciclo.TipoCiclo.WHILE, "", eInicio, nmientras.etqFalsa); //Sentencias de while C3DSentencias.generarC3D(sentencias); GeneradorC3D.display.removerCiclo(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio)); GeneradorC3D.generarEtiquetas((nmientras.etqFalsa)); } }
public static void evaluarXC3D(ParseTreeNode exp1, ParseTreeNode exp2, ParseTreeNode sentencias) { //WHILEX -> EXP EXP Sentencias String eInicio = GeneradorC3D.getEtiqueta(); String eSen = GeneradorC3D.getEtiqueta(); String eCond = GeneradorC3D.getEtiqueta(); String eSalida = GeneradorC3D.getEtiqueta(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Inicializar temporal auxiliar")); String taux = GeneradorC3D.getTemporal(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, taux, "0", "", "")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Etiqueta de Inicio del ciclo X")); GeneradorC3D.generarEtiquetas((eInicio)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Evaluar condicion 1")); Nodo cond1 = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, Expresion.expresionC3D(exp1), exp1.Span.Location.Line, exp1.Span.Location.Column); if (cond1 != null) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Etiqueta verdadera primera condicion")); GeneradorC3D.generarEtiquetas(cond1.etqVerdadera); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Evaluar condicion por primera vez")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eSen, taux, "==", "0")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eCond)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Etiqueta falsa primera condicion")); GeneradorC3D.generarEtiquetas(cond1.etqFalsa); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eSalida, taux, "==", "1")); GeneradorC3D.generarEtiquetas(eCond); Nodo cond2 = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, Expresion.expresionC3D(exp2), exp2.Span.Location.Line, exp2.Span.Location.Column); if (cond2 != null) { GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Etiqueta verdadera segunda condicion")); GeneradorC3D.generarEtiquetas(cond2.etqVerdadera); GeneradorC3D.generarEtiquetas(eSen); GeneradorC3D.display.agregarCiclo((int)Ciclo.TipoCiclo.WHILEX, "", eInicio, eSalida); // Sentencias de X GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sentencia del ciclo X")); C3DSentencias.generarC3D(sentencias); GeneradorC3D.display.removerCiclo(); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, taux, "1", "", "")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Salta al inicio")); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio)); GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Etiqueta falsa segunda condicion y salida")); GeneradorC3D.generarEtiquetas(cond2.etqFalsa); GeneradorC3D.generarEtiquetas(eSalida); } } }
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; } } }