Ejemplo n.º 1
0
        public Linea ReducirTokens(Linea lineaEntrada)
        {
            Linea linea         = lineaEntrada.Clone();
            bool  encontrado    = false;
            int   total         = linea.instrucciones.Count();
            int   tomar         = total;
            int   posibilidades = 1;


            while (!encontrado && posibilidades <= total)
            {
                //Buscar cada una de las posibilidades
                for (int x = 1; x <= posibilidades; x++)
                {
                    if (!encontrado)
                    {
                        string             cadenaDeTokens = "";
                        string             contenido      = "";
                        int                inicio         = x - 1;
                        int                fin            = tomar;
                        List <Instruccion> temp           = linea.instrucciones.GetRange(inicio, fin).ToList();
                        foreach (Instruccion i in temp)
                        {
                            if (i.token != null)
                            {
                                cadenaDeTokens += i.token.Substring(0, 4) + " ";
                            }
                            if (!String.IsNullOrEmpty(i.contenido))
                            {
                                contenido += i.contenido + " ";
                            }
                        }
                        if (cadenaDeTokens.Count() > 0)
                        {
                            string query = $"SELECT TOP 1 titulo FROM producciones WHERE contenido = '{cadenaDeTokens.Substring(0, cadenaDeTokens.Count() - 1)}'";

                            SqlCommand cmd = new SqlCommand(query);

                            conexion.Abrir();
                            cmd.Connection  = conexion.SQLServerConexion;
                            cmd.CommandText = query;
                            SqlDataReader rdr = cmd.ExecuteReader();
                            if (rdr.HasRows)
                            {
                                List <Instruccion> primeros = new List <Instruccion>();
                                List <Instruccion> ultimos  = new List <Instruccion>();
                                try
                                {
                                    primeros = linea.instrucciones.GetRange(0, x - 1);
                                }
                                catch { }
                                try
                                {
                                    int k = linea.instrucciones.Count - ((x - 1) + tomar);
                                    int p = ((x - 1) + tomar);
                                    ultimos = linea.instrucciones.GetRange(p, k);
                                }
                                catch { }

                                Instruccion n = new Instruccion("xd", "error");
                                encontrado = true;
                                while (rdr.Read())
                                {
                                    n = new Instruccion(rdr[0].ToString(), rdr[0].ToString());
                                    linea.logsReducido += "│ \n";
                                    linea.logsReducido += $"├──> Produccion encontrada: [{cadenaDeTokens.Substring(0, cadenaDeTokens.Count() - 1)}] \n";
                                    linea.logsReducido += "│ \n";
                                    linea.logsReducido += $"├─> Valor: [{rdr[0].ToString()}] \n";
                                    linea.logsReducido += "│ \n";
                                }



                                linea.instrucciones.Clear();
                                linea.instrucciones.AddRange(primeros);
                                linea.instrucciones.Add(n);
                                linea.instrucciones.AddRange(ultimos);
                                linea.logsReducido += $"├─> Analisis actual: [{linea.ToString()}] \n";
                                linea.logsReducido += "│ \n";
                            }
                            conexion.Cerrar();
                        }
                    }
                }
                tomar--;
                posibilidades++;
            }


            //En caso de ser una asignacion de variable/
            if (linea.instrucciones.Count > 0)
            {
                if (linea.instrucciones[0].token == "MO04")
                {
                    Lenguaje mateo = Lenguaje.ObtenerInstancia();

                    string keyVar        = "";
                    Linea  valorConjunto = new Linea();
                    valorConjunto.instrucciones = new List <Instruccion>();
                    bool asignacion = false;
                    foreach (Instruccion i in lineaEntrada.instrucciones)
                    {
                        if (asignacion)
                        {
                            if (i.token != "ES08")
                            {
                                valorConjunto.instrucciones.Add((Instruccion)i.Clone());
                            }
                        }
                        if (i.token == "OP10")
                        {
                            asignacion = true;
                        }
                        else if (i.token == "ID00" && keyVar == "")
                        {
                            keyVar = i.contenido;
                        }
                    }
                    valorConjunto.BuscarMinimaExpresion();

                    if (valorConjunto.instruccionesReducidas.Count == 1)
                    {
                        mateo.CodigoEntrada.EstablecerTipo(keyVar, valorConjunto.instruccionesReducidas[0].token);
                    }
                }
            }
            return(linea);
        }