public override string ToString() { string valor = Linea > 0 ? Linea.ToString() : ""; if (!string.IsNullOrEmpty(Ramal)) { valor += " (" + Ramal + ")"; } return(valor); }
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); }
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); }