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); }