コード例 #1
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);
        }