Пример #1
0
 public void inicializar()
 {
     reporte          = new ReporteOptimizacion();
     codigoOptimizado = "";
     codigoAnterior   = "";
     instrucciones    = new LinkedList <Etiqueta>();
 }
Пример #2
0
 public Optimizador()
 {
     codigoOptimizado = "";
     codigoAnterior   = "";
     instrucciones    = null;
     reporte          = null;
 }
Пример #3
0
        public OptimizacionResultado optimizarCodigo(ReporteOptimizacion reporte)
        {
            string antes = this.generarAugus(reporte);
            OptimizacionResultado resultado = new OptimizacionResultado();

            resultado.codigo = antes;
            return(resultado);
        }
Пример #4
0
        public string optimizarCodigo(ReporteOptimizacion reporte, AST ast, bool aplicaBloque = false)
        {
            this.codigoOptimizado = "";
            if (this.imprimirEtiqueta)
            {
                this.codigoOptimizado += this.id + ":\n";
            }
            string strResultado = this.traducirCodigo(reporte, ast, this.instrucciones, aplicaBloque);

            this.codigoOptimizado += strResultado;
            return(this.codigoOptimizado);
        }
Пример #5
0
        public string generarAugus(ReporteOptimizacion reporte)
        {
            string codigoAugus = "printf(" + this.cadena + "," + this.cad.generarAugus() + ");\n";

            return(codigoAugus);
        }
Пример #6
0
        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);
        }
Пример #7
0
        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);
        }
Пример #8
0
 public string generarAugus(ReporteOptimizacion reporte)
 {
     return("");
 }
Пример #9
0
 public OptimizacionResultado optimizarCodigo(ReporteOptimizacion reporte)
 {
     return(null);
 }
Пример #10
0
        public string generarAugus(ReporteOptimizacion reporte)
        {
            string codigoAugus = "return;\n";

            return(codigoAugus);
        }
Пример #11
0
        public string generarAugus(ReporteOptimizacion reporte)
        {
            string codigoAugus = "goto " + this.id + ";\n";

            return(codigoAugus);
        }
Пример #12
0
        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);
        }