Ejemplo n.º 1
0
        public Linea  BuscarMinimaExpresion(Linea _linea, string _contexto)
        {
            _linea.logs = "";
            Linea linea = _linea.Clone();

            linea.logs = "";

            if (!String.IsNullOrEmpty(linea.ToString()))
            {
                _linea.logs += $"┌──────> ANALIZA: [{linea.ToString()}] \n";
            }
            bool  iterar = true;
            Linea actual = _linea.Clone();

            while (iterar)
            {
                linea        = generalFacade.Reducir(linea, _contexto);
                _linea.logs += linea.logs;
                if (actual.Equals(linea))
                {
                    iterar = false;
                }
                else
                {
                    actual = linea.Clone();
                }
            }
            if (!String.IsNullOrEmpty(linea.ToString()))
            {
                _linea.logs += $"└>No hay más coinsidencias, termina el analisis. \n\n";
            }

            linea.instrucciones.Clear();
            linea.logs = _linea.logs;
            foreach (Instruccion i in actual.instrucciones)
            {
                linea.instrucciones.Add((Instruccion)i.Clone());
            }

            return(linea);
        }
Ejemplo n.º 2
0
        public Linea Reducir(Linea _lineaEntrada, string _contexto)
        {
            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 {_contexto} 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.logs += "│ \n";
                                    linea.logs += $"├──> Produccion encontrada: [{cadenaDeTokens.Substring(0, cadenaDeTokens.Count() - 1)}] \n";
                                    linea.logs += "│ \n";
                                    linea.logs += $"├─> Valor: [{rdr[0].ToString()}] \n";
                                    linea.logs += "│ \n";
                                }



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


            if (_contexto == "producciones")
            {
                //Se trata de una asignacion de variables
                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 (i.token == "ID00" && keyVar == "")
                            {
                                keyVar = i.contenido;
                            }
                            if (asignacion)
                            {
                                if (i.token != "ES08")
                                {
                                    if (i.token == "ID00")
                                    {
                                        Instruccion nueva = (Instruccion)i.Clone();
                                        nueva.token = mateo.CodigoEntrada.BuscarTipoDeDato(i.tokenIncrementable);
                                        valorConjunto.instrucciones.Add(nueva);
                                    }
                                    else
                                    {
                                        valorConjunto.instrucciones.Add((Instruccion)i.Clone());
                                    }
                                }
                                else
                                {
                                    break;
                                }
                            }
                            if (i.token == "OP10")
                            {
                                asignacion = true;
                            }
                        }

                        Linea abs = mateo.CodigoEntrada.BuscarMinimaExpresion(valorConjunto, "definicionesTipoDeDato");

                        if (abs.instrucciones.Count == 1)
                        {
                            mateo.CodigoEntrada.EstablecerTipo(keyVar, abs.instrucciones[0].token);
                        }
                    }
                }
            }



            return(linea);
        }