コード例 #1
0
ファイル: Optimizador.cs プロジェクト: Oshhcar/Colette
        private string TerceraPasada(string entrada)
        {
            string codigo = "";
            Regex  num    = new Regex("^[0-9]+$");

            string[] lineas = entrada.Split('\n');
            int      i      = 0;
            int      j      = 1;

            bool   delSalto = false;
            string lineaAnt = "";
            bool   antSalto = false;

            foreach (string l in lineas)
            {
                string linea = l;

                if (l.Contains("ifFalse"))
                {
                    delSalto = false;
                    antSalto = false;

                    string cond  = l.Replace("ifFalse", "");
                    string salto = l.Substring(l.LastIndexOf("goto"));
                    salto = salto.Replace(";", "");
                    salto = salto.Trim();

                    cond = cond.Split(')')[0].Replace("(", "");
                    cond = cond.Replace(";", "");
                    cond = cond.Trim();

                    string op1;
                    string op2;

                    if (cond.Contains("=="))
                    {
                        op1 = cond.Remove(cond.IndexOf("=="));
                        op1 = op1.Trim();

                        op2 = cond.Substring(cond.IndexOf("=="));
                        op2 = op2.Replace("==", "");
                        op2 = op2.Trim();

                        if (num.IsMatch(op1) && num.IsMatch(op2))
                        {
                            if (Convert.ToInt32(op1) == Convert.ToInt32(op2))
                            {
                                linea = "";
                                Optimizado.AddLast(new Optimizado(j, j - i, 5));
                                i++;
                            }
                            else
                            {
                                linea    = salto + ";";
                                delSalto = true;
                                Optimizado.AddLast(new Optimizado(j, j - i, 4));
                            }
                        }
                    }
                    else if (cond.Contains("!="))
                    {
                        op1 = cond.Remove(cond.IndexOf("!="));
                        op1 = op1.Trim();

                        op2 = cond.Substring(cond.IndexOf("!="));
                        op2 = op2.Replace("!=", "");
                        op2 = op2.Trim();

                        if (num.IsMatch(op1) && num.IsMatch(op2))
                        {
                            if (Convert.ToInt32(op1) != Convert.ToInt32(op2))
                            {
                                linea = "";
                                Optimizado.AddLast(new Optimizado(j, j - i, 5));
                                i++;
                            }
                            else
                            {
                                linea    = salto + ";";
                                delSalto = true;
                                Optimizado.AddLast(new Optimizado(j, j - i, 4));
                            }
                        }
                    }
                    else if (cond.Contains(">"))
                    {
                        op1 = cond.Remove(cond.IndexOf(">"));
                        op1 = op1.Trim();

                        op2 = cond.Substring(cond.IndexOf(">"));
                        op2 = op2.Replace(">", "");
                        op2 = op2.Trim();

                        if (num.IsMatch(op1) && num.IsMatch(op2))
                        {
                            if (Convert.ToInt32(op1) > Convert.ToInt32(op2))
                            {
                                linea = "";
                                Optimizado.AddLast(new Optimizado(j, j - i, 5));
                                i++;
                            }
                            else
                            {
                                linea    = salto + ";";
                                delSalto = true;
                                Optimizado.AddLast(new Optimizado(j, j - i, 4));
                            }
                        }
                    }
                    else if (cond.Contains("<"))
                    {
                        op1 = cond.Remove(cond.IndexOf("<"));
                        op1 = op1.Trim();

                        op2 = cond.Substring(cond.IndexOf("<"));
                        op2 = op2.Replace("<", "");
                        op2 = op2.Trim();

                        if (num.IsMatch(op1) && num.IsMatch(op2))
                        {
                            if (Convert.ToInt32(op1) < Convert.ToInt32(op2))
                            {
                                linea = "";
                                Optimizado.AddLast(new Optimizado(j, j - i, 5));
                                i++;
                            }
                            else
                            {
                                linea    = salto + ";";
                                delSalto = true;
                                Optimizado.AddLast(new Optimizado(j, j - i, 4));
                            }
                        }
                    }
                    else if (cond.Contains(">="))
                    {
                        op1 = cond.Remove(cond.IndexOf(">="));
                        op1 = op1.Trim();

                        op2 = cond.Substring(cond.IndexOf(">="));
                        op2 = op2.Replace(">=", "");
                        op2 = op2.Trim();

                        if (num.IsMatch(op1) && num.IsMatch(op2))
                        {
                            if (Convert.ToInt32(op1) >= Convert.ToInt32(op2))
                            {
                                linea = "";
                                Optimizado.AddLast(new Optimizado(j, j - i, 5));
                                i++;
                            }
                            else
                            {
                                linea    = salto + ";";
                                delSalto = true;
                                Optimizado.AddLast(new Optimizado(j, j - i, 4));
                            }
                        }
                    }
                    else if (cond.Contains("<="))
                    {
                        op1 = cond.Remove(cond.IndexOf("<="));
                        op1 = op1.Trim();

                        op2 = cond.Substring(cond.IndexOf("<="));
                        op2 = op2.Replace("<=", "");
                        op2 = op2.Trim();

                        if (num.IsMatch(op1) && num.IsMatch(op2))
                        {
                            if (Convert.ToInt32(op1) <= Convert.ToInt32(op2))
                            {
                                linea = "";
                                Optimizado.AddLast(new Optimizado(j, j - i, 5));
                                i++;
                            }
                            else
                            {
                                linea    = salto + ";";
                                delSalto = true;
                                Optimizado.AddLast(new Optimizado(j, j - i, 4));
                            }
                        }
                    }
                }
                else if (l.Contains("if"))
                {
                    delSalto = false;
                    antSalto = false;

                    string cond  = l.Replace("if", "");
                    string salto = l.Substring(l.LastIndexOf("goto"));
                    salto = salto.Replace(";", "");
                    salto = salto.Trim();

                    cond = cond.Split(')')[0].Replace("(", "");
                    cond = cond.Replace(";", "");
                    cond = cond.Trim();

                    string op1;
                    string op2;

                    if (cond.Contains("=="))
                    {
                        op1 = cond.Remove(cond.IndexOf("=="));
                        op1 = op1.Trim();

                        op2 = cond.Substring(cond.IndexOf("=="));
                        op2 = op2.Replace("==", "");
                        op2 = op2.Trim();

                        if (num.IsMatch(op1) && num.IsMatch(op2))
                        {
                            if (Convert.ToInt32(op1) == Convert.ToInt32(op2))
                            {
                                linea    = salto + ";";
                                delSalto = true;
                                Optimizado.AddLast(new Optimizado(j, j - i, 4));
                            }
                            else
                            {
                                linea = "";
                                Optimizado.AddLast(new Optimizado(j, j - i, 5));
                                i++;
                            }
                        }
                    }
                    else if (cond.Contains("!="))
                    {
                        op1 = cond.Remove(cond.IndexOf("!="));
                        op1 = op1.Trim();

                        op2 = cond.Substring(cond.IndexOf("!="));
                        op2 = op2.Replace("!=", "");
                        op2 = op2.Trim();

                        if (num.IsMatch(op1) && num.IsMatch(op2))
                        {
                            if (Convert.ToInt32(op1) != Convert.ToInt32(op2))
                            {
                                linea    = salto + ";";
                                delSalto = true;
                                Optimizado.AddLast(new Optimizado(j, j - i, 4));
                            }
                            else
                            {
                                linea = "";
                                Optimizado.AddLast(new Optimizado(j, j - i, 5));
                                i++;
                            }
                        }
                    }
                    else if (cond.Contains(">"))
                    {
                        op1 = cond.Remove(cond.IndexOf(">"));
                        op1 = op1.Trim();

                        op2 = cond.Substring(cond.IndexOf(">"));
                        op2 = op2.Replace(">", "");
                        op2 = op2.Trim();

                        if (num.IsMatch(op1) && num.IsMatch(op2))
                        {
                            if (Convert.ToInt32(op1) > Convert.ToInt32(op2))
                            {
                                linea    = salto + ";";
                                delSalto = true;
                                Optimizado.AddLast(new Optimizado(j, j - i, 4));
                            }
                            else
                            {
                                linea = "";
                                Optimizado.AddLast(new Optimizado(j, j - i, 5));
                                i++;
                            }
                        }
                    }
                    else if (cond.Contains("<"))
                    {
                        op1 = cond.Remove(cond.IndexOf("<"));
                        op1 = op1.Trim();

                        op2 = cond.Substring(cond.IndexOf("<"));
                        op2 = op2.Replace("<", "");
                        op2 = op2.Trim();

                        if (num.IsMatch(op1) && num.IsMatch(op2))
                        {
                            if (Convert.ToInt32(op1) < Convert.ToInt32(op2))
                            {
                                linea    = salto + ";";
                                delSalto = true;
                                Optimizado.AddLast(new Optimizado(j, j - i, 4));
                            }
                            else
                            {
                                linea = "";
                                Optimizado.AddLast(new Optimizado(j, j - i, 5));
                                i++;
                            }
                        }
                    }
                    else if (cond.Contains(">="))
                    {
                        op1 = cond.Remove(cond.IndexOf(">="));
                        op1 = op1.Trim();

                        op2 = cond.Substring(cond.IndexOf(">="));
                        op2 = op2.Replace(">=", "");
                        op2 = op2.Trim();

                        if (num.IsMatch(op1) && num.IsMatch(op2))
                        {
                            if (Convert.ToInt32(op1) >= Convert.ToInt32(op2))
                            {
                                linea    = salto + ";";
                                delSalto = true;
                                Optimizado.AddLast(new Optimizado(j, j - i, 4));
                            }
                            else
                            {
                                linea = "";
                                Optimizado.AddLast(new Optimizado(j, j - i, 5));
                                i++;
                            }
                        }
                    }
                    else if (cond.Contains("<="))
                    {
                        op1 = cond.Remove(cond.IndexOf("<="));
                        op1 = op1.Trim();

                        op2 = cond.Substring(cond.IndexOf("<="));
                        op2 = op2.Replace("<=", "");
                        op2 = op2.Trim();

                        if (num.IsMatch(op1) && num.IsMatch(op2))
                        {
                            if (Convert.ToInt32(op1) <= Convert.ToInt32(op2))
                            {
                                linea    = salto + ";";
                                delSalto = true;
                                Optimizado.AddLast(new Optimizado(j, j - i, 4));
                            }
                            else
                            {
                                linea = "";
                                Optimizado.AddLast(new Optimizado(j, j - i, 5));
                                i++;
                            }
                        }
                    }
                }
                else if (l.Contains("goto"))
                {
                    if (delSalto)
                    {
                        i++;
                        linea    = "";
                        antSalto = false;
                    }
                    else //Eliminar saltos innecesarios
                    {
                        if (antSalto)
                        {
                            Optimizado.AddLast(new Optimizado(j, j - i, 6));
                            i++;
                            linea    = "";
                            antSalto = false;
                        }
                        else
                        {
                            antSalto = true;
                        }
                    }
                }
                else if (l.Contains(":"))
                {
                    delSalto = false;
                    antSalto = false;
                }
                else
                {
                    delSalto = false;
                    antSalto = false;
                }

                if (lineaAnt != "")
                {
                    codigo += lineaAnt + "\n";
                }
                j++;
                lineaAnt = linea;
            }

            if (lineaAnt != "")
            {
                codigo += lineaAnt + "\n";
            }

            return(codigo);
        }
コード例 #2
0
ファイル: Optimizador.cs プロジェクト: Oshhcar/Colette
        private string PrimeraPasada(string entrada)
        {
            string codigo = "";
            Regex  num    = new Regex("^[0-9]+$");

            string[] lineas = entrada.Split('\n');
            int      i      = 2;
            int      j      = 1;

            string anterior = "";
            int    tipAnt   = 0;

            foreach (string l in lineas)
            {
                string linea = l;

                if (l.Contains("var"))
                {
                    /*Declaracion*/
                    tipAnt = 1;
                }
                else if (l.Contains("=")) //Asignación
                {
                    if (l.Contains("+"))
                    {
                        string[] op   = l.Split('=');
                        string   opIz = op[0].Replace(" ", "");

                        string[] opDer = op[1].Split('+');
                        string   op1   = opDer[0].Replace(" ", "");
                        string   op2   = opDer[1].Split(';')[0].Replace(" ", "");

                        if (op1.Equals("0"))
                        {
                            if (opIz.Equals(op2))
                            {
                                linea = "";
                                Optimizado.AddLast(new Optimizado(j, i, 8));
                            }
                            else
                            {
                                linea = opIz + " = " + op2 + ";";
                                Optimizado.AddLast(new Optimizado(j, i, 12));
                            }
                        }
                        else if (op2.Equals("0"))
                        {
                            if (opIz.Equals(op1))
                            {
                                linea = "";
                                Optimizado.AddLast(new Optimizado(j, i, 8));
                            }
                            else
                            {
                                linea = opIz + " = " + op1 + ";";
                                Optimizado.AddLast(new Optimizado(j, i, 12));
                            }
                        }

                        tipAnt = 2;
                    }
                    else if (l.Contains("-"))
                    {
                        string[] op   = l.Split('=');
                        string   opIz = op[0].Replace(" ", "");

                        string[] opDer = op[1].Split('-');
                        string   op1   = opDer[0].Replace(" ", "");
                        string   op2   = opDer[1].Split(';')[0].Replace(" ", "");

                        /*if (op1.Equals("0"))
                         * {
                         *  if (opIz.Equals(op2))
                         *  {
                         *      linea = "";
                         *      Optimizado.AddLast(new Optimizado(j, i, 9));
                         *  }
                         *  else
                         *  {
                         *      linea = opIz + " = " + op2 + ";";
                         *      Optimizado.AddLast(new Optimizado(j, i, 13));
                         *  }
                         * }
                         * else */
                        if (op2.Equals("0"))
                        {
                            if (opIz.Equals(op1))
                            {
                                linea = "";
                                Optimizado.AddLast(new Optimizado(j, i, 9));
                            }
                            else
                            {
                                linea = opIz + " = " + op1 + ";";
                                Optimizado.AddLast(new Optimizado(j, i, 13));
                            }
                        }
                        tipAnt = 2;
                    }
                    else if (l.Contains("*"))
                    {
                        string[] op   = l.Split('=');
                        string   opIz = op[0].Replace(" ", "");

                        string[] opDer = op[1].Split('*');
                        string   op1   = opDer[0].Replace(" ", "");
                        string   op2   = opDer[1].Split(';')[0].Replace(" ", "");

                        if (op1.Equals("1"))
                        {
                            if (opIz.Equals(op2))
                            {
                                linea = "";
                                Optimizado.AddLast(new Optimizado(j, i, 10));
                            }
                            else
                            {
                                linea = opIz + " = " + op2 + ";";
                                Optimizado.AddLast(new Optimizado(j, i, 14));
                            }
                        }
                        else if (op2.Equals("1"))
                        {
                            if (opIz.Equals(op1))
                            {
                                linea = "";
                                Optimizado.AddLast(new Optimizado(j, i, 10));
                            }
                            else
                            {
                                linea = opIz + " = " + op1 + ";";
                                Optimizado.AddLast(new Optimizado(j, i, 14));
                            }
                        }
                        else if (op1.Equals("2"))
                        {
                            linea = opIz + " = " + op2 + " + " + op2 + ";";
                            Optimizado.AddLast(new Optimizado(j, i, 16));
                        }
                        else if (op2.Equals("2"))
                        {
                            linea = opIz + " = " + op1 + " + " + op1 + ";";
                            Optimizado.AddLast(new Optimizado(j, i, 16));
                        }
                        else if (op1.Equals("0"))
                        {
                            linea = opIz + " = 0;";
                            Optimizado.AddLast(new Optimizado(j, i, 17));
                        }
                        else if (op2.Equals("0"))
                        {
                            linea = opIz + " = 0;";
                            Optimizado.AddLast(new Optimizado(j, i, 17));
                        }

                        tipAnt = 2;
                    }
                    else if (l.Contains("/"))
                    {
                        string[] op   = l.Split('=');
                        string   opIz = op[0].Replace(" ", "");

                        string[] opDer = op[1].Split('/');
                        string   op1   = opDer[0].Replace(" ", "");
                        string   op2   = opDer[1].Split(';')[0].Replace(" ", "");

                        /*
                         * if (op1.Equals("1"))
                         * {
                         *  if (opIz.Equals(op2))
                         *  {
                         *      linea = "";
                         *      Optimizado.AddLast(new Optimizado(j, i, 11));
                         *  }
                         *  else
                         *  {
                         *      linea = opIz + " = " + op2 + ";";
                         *      Optimizado.AddLast(new Optimizado(j, i, 15));
                         *  }
                         * }
                         * else */
                        if (op2.Equals("1"))
                        {
                            if (opIz.Equals(op1))
                            {
                                linea = "";
                                Optimizado.AddLast(new Optimizado(j, i, 11));
                            }
                            else
                            {
                                linea = opIz + " = " + op1 + ";";
                                Optimizado.AddLast(new Optimizado(j, i, 15));
                            }
                        }
                        else if (op1.Equals("0"))
                        {
                            linea = opIz + " = 0;";
                            Optimizado.AddLast(new Optimizado(j, i, 18));
                        }

                        tipAnt = 2;
                    }
                    else if (l.Contains("%"))
                    {
                        tipAnt = 2;
                    }
                    else
                    {
                        if (!anterior.Equals(""))
                        {
                            if (tipAnt == 3)
                            {
                                string[] op  = l.Split('=');
                                string   op1 = op[0].Replace(" ", "");
                                string   op2 = op[1].Split(';')[0].Replace(" ", "");

                                string[] opAnt  = anterior.Split('=');
                                string   op1Ant = opAnt[0].Replace(" ", "");
                                string   op2Ant = opAnt[1].Split(';')[0].Replace(" ", "");

                                if (op1.Equals(op2Ant))
                                {
                                    if (op2.Equals(op1Ant))
                                    {
                                        if (!num.IsMatch(op1) && !num.IsMatch(op2))
                                        {
                                            anterior = l;
                                            linea    = "";
                                            Optimizado.AddLast(new Optimizado(j, i, 1));
                                        }
                                    }
                                }
                            }
                        }
                        tipAnt = 3;
                    }
                }
                else
                {
                    //Otar sentencia;
                    tipAnt = 4;
                }

                if (anterior != "")
                {
                    codigo += anterior + "\n";
                    i++;
                }
                j++;
                anterior = linea;
            }

            if (anterior != "")
            {
                codigo += anterior + "\n";
            }

            return(codigo);
        }
コード例 #3
0
ファイル: Optimizador.cs プロジェクト: Oshhcar/Colette
        private string SegundaPasada(string entrada)
        {
            string codigo = "";

            string[] lineas      = entrada.Split('\n');
            int      i           = 1;
            int      j           = 1;
            int      lineasMenos = 0;
            int      contador    = 0;

            string etqSalto    = "";
            string codEntreEtq = "";

            foreach (string l in lineas)
            {
                if (l.Contains("if"))
                {
                    /*If*/
                }
                else if (l.Contains("ifFalse"))
                {
                }
                else if (l.Contains("goto"))
                {
                    string etq = l.Replace("goto", "");
                    etq = etq.Replace(";", "");
                    etq = etq.Trim();

                    if (etqSalto == "")
                    {
                        contador = 0;
                        etqSalto = etq;
                        i        = j;
                    }
                }
                else if (l.Contains(":"))
                {
                    string etq = l.Replace(":", "");
                    etq = etq.Trim();

                    if (etqSalto != "")
                    {
                        if (etq.Equals(etqSalto))
                        {
                            etqSalto    = "";
                            codEntreEtq = "";
                            Optimizado.AddLast(new Optimizado(j, i - lineasMenos, 2));
                            lineasMenos += contador;
                            contador     = 0;
                        }
                        else
                        {
                            etqSalto    = "";
                            codigo     += codEntreEtq;
                            codEntreEtq = "";
                            contador    = 0;
                        }
                    }
                }
                else
                {
                    /*Otra cosa*/
                }

                if (etqSalto == "")
                {
                    codigo += l + "\n";
                }
                else
                {
                    codEntreEtq += l + "\n";
                    contador++;
                }

                j++;
            }

            return(codigo);
        }