private string traducirCodigo(ReporteOptimizacion reporte, AST ast, LinkedList <Instruccion> instrucciones, bool aplicaBloque) { int contador = 0; string codigoOptimizado = ""; Instruccion instruccionAnterior = null; Asignacion asignacionPrevia = null; string codigoAnterior = ""; foreach (Instruccion ins in instrucciones) { if (ins is Asignacion) { Asignacion asig = (Asignacion)ins; asig.instruccionPrevia = asignacionPrevia; asignacionPrevia = (Asignacion)ins; } else if (ins is GOTO) { GOTO insgoto = (GOTO)ins; insgoto.ast = ast; } else if (ins is If) { If insif = (If)ins; for (int i = contador + 1; i < this.instrucciones.Count; i++) { insif.instrucciones.AddLast(this.instrucciones.ElementAt(i)); } } string optimizado = ""; if (ins is If) { If insif = (If)ins; insif.ast = ast; //necesario antes de optimizar cada if optimizado = insif.optimizarCodigo(reporte).codigo; } else { if (instruccionAnterior is If && ins is GOTO) { If antif = (If)instruccionAnterior; if (!antif.seAplicoRegla3) { optimizado = ins.optimizarCodigo(reporte).codigo; } } else { optimizado = ins.optimizarCodigo(reporte).codigo; } } //Regla 2 Mirilla if (ins is GOTO) { if (codigoAnterior.StartsWith("goto")) { if (instruccionAnterior is If) { codigoAnterior = ""; continue; } } GOTO insgoto = (GOTO)ins; if (ast.existeEtiqueta(insgoto.id)) { if (!optimizado.Equals("")) { codigoOptimizado += " " + optimizado; codigoAnterior = optimizado; } if ((contador + 1) == this.instrucciones.Count) { continue; //si no existen mas instrucciones no hay optimizacion } OPtimizacion optimizacion = new OPtimizacion(); //si hay optimizacion optimizacion.linea = "" + (insgoto.linea + 1); string codigoOptimizar = ""; for (int i = contador + 1; i < this.instrucciones.Count; i++) { Instruccion instruccion = this.instrucciones.ElementAt(i); if (instruccion is GOTO) { GOTO mygoto = (GOTO)instruccion; mygoto.ast = ast; } else if (instruccion is If) { continue; } codigoOptimizar += instruccion.optimizarCodigo(reporte).codigo; } optimizacion.antes = codigoOptimizar; optimizacion.despues = insgoto.id + ":\n"; optimizacion.regla = "Regla 1"; optimizacion.tipo = "Mirilla - Eliminación de Código Inalcanzable"; reporte.agregarOpt(optimizacion); codigoAnterior = ""; break; } else { if (!optimizado.Equals("")) { codigoOptimizado += " " + optimizado; codigoAnterior = optimizado; } } } else { if (!optimizado.Equals("")) { codigoOptimizado += " " + optimizado; codigoAnterior = optimizado; } } instruccionAnterior = ins; contador++; } return(codigoOptimizado); }
public string generarAugus(ReporteOptimizacion reporte) { string codigoAugus = this.id + " = " + this.valor.generarAugus() + ";\n"; OPtimizacion optimizacion = new OPtimizacion(); optimizacion.linea = "" + (linea + 1); optimizacion.antes = codigoAugus; optimizacion.tipo = "Mirilla - Simplificación algebraica y por fuerza"; if (this.valor.tipo == Operacion.TIPO_OPERACION.SUMA) { if (this.valor.validarRegla8(this.id)) { optimizacion.regla = "Regla 6"; optimizacion.despues = ""; reporte.agregarOpt(optimizacion); return(""); } else if (!this.valor.validarRegla12().Equals("")) { codigoAugus = this.id + " = " + this.valor.validarRegla12() + ";\n"; optimizacion.regla = "Regla 10"; optimizacion.despues = codigoAugus; reporte.agregarOpt(optimizacion); } } else if (this.valor.tipo == Operacion.TIPO_OPERACION.RESTA) { if (this.valor.validarRegla9(this.id)) { optimizacion.regla = "Regla 7"; optimizacion.despues = ""; reporte.agregarOpt(optimizacion); return(""); } else if (!this.valor.validarRegla13().Equals("")) { codigoAugus = this.id + " = " + this.valor.validarRegla13() + ";\n"; optimizacion.regla = "Regla 11"; optimizacion.despues = codigoAugus; reporte.agregarOpt(optimizacion); } } else if (this.valor.tipo == Operacion.TIPO_OPERACION.MULTIPLICACION) { if (this.valor.validarRegla10(this.id)) { optimizacion.regla = "Regla 8"; optimizacion.despues = ""; reporte.agregarOpt(optimizacion); return(""); } else if (!this.valor.validarRegla14().Equals("")) { codigoAugus = this.id + " = " + this.valor.validarRegla14() + ";\n"; optimizacion.regla = "Regla 12"; optimizacion.despues = codigoAugus; reporte.agregarOpt(optimizacion); } else if (!this.valor.validarRegla16().Equals("")) { codigoAugus = this.id + " = " + this.valor.validarRegla16() + ";\n"; optimizacion.regla = "Regla 14"; optimizacion.despues = codigoAugus; reporte.agregarOpt(optimizacion); } else if (!this.valor.validarRegla17().Equals("")) { codigoAugus = this.id + " = " + this.valor.validarRegla17() + ";\n"; optimizacion.regla = "Regla 15"; optimizacion.despues = codigoAugus; reporte.agregarOpt(optimizacion); } } else if (this.valor.tipo == Operacion.TIPO_OPERACION.DIVISION) { if (this.valor.validarRegla11(this.id)) { optimizacion.regla = "Regla 9"; optimizacion.despues = ""; reporte.agregarOpt(optimizacion); return(""); } else if (!this.valor.validarRegla15().Equals("")) { codigoAugus = this.id + " = " + this.valor.validarRegla15() + ";\n"; optimizacion.regla = "Regla 13"; optimizacion.despues = codigoAugus; reporte.agregarOpt(optimizacion); } else if (!this.valor.validarRegla18().Equals("")) { codigoAugus = this.id + " = " + this.valor.validarRegla18() + ";\n"; optimizacion.regla = "Regla 16"; optimizacion.despues = codigoAugus; reporte.agregarOpt(optimizacion); } } else if (valor.tipo == Operacion.TIPO_OPERACION.ID) { codigoAugus = this.id + " = " + this.valor.generarAugus() + ";\n"; if (this.instruccionPrevia != null) { if (this.instruccionPrevia.valor.tipo == Operacion.TIPO_OPERACION.ID) { //MI REGLA 5 if (this.valor.validarRegla1(this.id, this.valor.valor, this.instruccionPrevia.id, this.instruccionPrevia.valor.valor)) { optimizacion.tipo = "Mirilla - Eliminación de Instrucciones Redundantes y de Almacenamiento"; optimizacion.regla = "Regla 5"; optimizacion.despues = ""; reporte.agregarOpt(optimizacion); return(""); } } } } else { codigoAugus = this.id + " = " + this.valor.generarAugus() + ";\n"; } return(codigoAugus); }
public string generarAugus(ReporteOptimizacion reporte) { string codigoAugus = "if(" + this.condicion.generarAugus() + ") goto " + this.etiqueta + ";\n"; OPtimizacion optimizacion = new OPtimizacion(); optimizacion.linea = "" + (this.linea + 1); optimizacion.antes = codigoAugus; optimizacion.tipo = "Mirilla - Eliminación de Codigo Inalcanzable"; if (this.condicion.tipo == Operacion.TIPO_OPERACION.IGUAL_IGUAL) { if (this.condicion.validarRegla4()) { optimizacion.regla = "Regla 3"; optimizacion.despues = "goto " + this.etiqueta + ";"; reporte.agregarOpt(optimizacion); codigoAugus = "goto " + this.etiqueta + ";\n"; } else if (this.condicion.validarRegla5()) { optimizacion.regla = "Regla 4"; optimizacion.despues = ""; reporte.agregarOpt(optimizacion); return(""); } } try { if (codigoAugus.StartsWith("if")) { if (this.instrucciones.Count > 0) { if (this.instrucciones.ElementAt(0) is GOTO) //validamos que la siguiente instruccion sea un goto { string condicionNueva = this.condicion.invertirCondicion(); if (!condicionNueva.Equals(this.condicion.generarAugus())) //si la condicion si cambio se hace la optimizacion { GOTO etiquetaFalse = (GOTO)this.instrucciones.ElementAt(0); Etiqueta etiquetaTrue = this.ast.obtenerEtiqueta(this.etiqueta); string codigoOptimizar = codigoAugus; codigoOptimizar += "goto " + etiquetaFalse.id + ";\n"; codigoOptimizar += etiquetaTrue.id + ":\n"; codigoOptimizar += "[instrucciones_" + etiquetaTrue.id + "]\n"; codigoOptimizar += etiquetaFalse.id + ":\n"; codigoOptimizar += "[instrucciones_" + etiquetaFalse.id + "]\n"; codigoAugus = "if(" + condicionNueva + ") goto " + etiquetaFalse.id + ";\n"; string codigoOptimizado = codigoAugus; codigoOptimizado += "[instrucciones_" + etiquetaTrue.id + "]\n"; codigoOptimizado += etiquetaFalse.id + ":\n"; codigoOptimizado += "[instrucciones_" + etiquetaFalse.id + "]\n"; optimizacion.antes = codigoOptimizar; optimizacion.despues = codigoOptimizado; optimizacion.regla = "Regla 2"; optimizacion.tipo = "Mirilla - Eliminación de Código Inalcanzable"; reporte.agregarOpt(optimizacion); this.seAplicoRegla3 = true; etiquetaTrue.imprimirEtiqueta = false; //etiquetaTrue.ast = ast; codigoAugus += etiquetaTrue.optimizarCodigo(reporte, ast); ast.etiquetasBetadas.AddLast(etiquetaTrue.id); } } } } } catch (Exception) { return(null); } return(codigoAugus); }