public void separarLineas(String Lineas) { Lineas += "Ç"; String[] lines = Lineas.Split('\n'); foreach (var line in lines) { Leer(line); } if (listaErrores.Count != 0) { Console.WriteLine("LISTA DE ERRORES"); foreach (var Token in listaErrores) { Console.WriteLine(Token.GetValorToken() + "<------>" + Token.GetTipoToken()); } } if (listaTokens.Count != 0) { RecConjunto rec = new RecConjunto(); rec.ReconocerConjuntos(listaTokens); listaER = rec.GetExpresiones(); listaCadenas = rec.GetCadenasEvaluacion(); Console.WriteLine("LISTA DE EXPRESIONES REGULARES"); foreach (var elementoG in listaER) { Expresiones_Regulares elemento = elementoG.Value; Console.WriteLine("Nombre Expresion: " + elemento.GetNombre()); foreach (var item in elemento.GetTokens()) { Console.WriteLine("Token: " + item.GetValorToken()); } } listaConjuntos = rec.GetConjuntos(); Console.WriteLine("LISTA DE CONJUNTOS DECLARADOS"); foreach (var conjunto in listaConjuntos) { Conjunto conjunto1 = conjunto.Value; Console.WriteLine("Nombre Conjunto: " + conjunto1.GetNombre()); Console.WriteLine("Elementos: "); byte contador = 0; foreach (var item in conjunto1.GetElementos()) { Console.WriteLine(contador + ". " + item); contador++; } } foreach (var Token in listaTokens) { Console.WriteLine(Token.GetValorToken() + "<------>" + Token.GetTipoToken()); } } }
public string validarCadena(Expresiones_Regulares expresionEv) { int estadoActual = 0; bool valido = false; List <int> estadosFinales = new List <int>(); foreach (var item in mueves) { EstadoAFD estado = item.GetEstadoInicial(); if (!estadosFinales.Contains(estado.GetNombreEstadoAFD())) { if (estado.GetTipo() == EstadoAFD.Tipo.FINAL) { estadosFinales.Add(estado.GetNombreEstadoAFD()); } } estado = item.GetEstadoLlegada(); if (!estadosFinales.Contains(estado.GetNombreEstadoAFD())) { if (estado.GetTipo() == EstadoAFD.Tipo.FINAL) { estadosFinales.Add(estado.GetNombreEstadoAFD()); } } } string impresion = ""; // Mueve mueveActual = mueveSinVacio.First(); string evaluar = expresionEv.GetTokens().Last().GetValorToken();//como es una cadena solo tiene uno List <Mueve> listaTemp = new List <Mueve>(); if (evaluar.Length == 0 && estadosFinales.Contains(0)) { valido = true; } for (int i = 0; i < evaluar.Length; i++)//evaluando letra por letra { listaTemp.Clear(); char letra = evaluar[i]; valido = false; //reiniciando variable foreach (var mov in mueveSinVacio) { if (mov.GetEstadoInicial().GetNombreEstadoAFD() == estadoActual) { listaTemp.Add(mov); } } //obtenemos solo los mueves que tienen de estado inicial al estado actual List <Mueve> listOrdernada = listaTemp.OrderByDescending(o => o.GetSimbolo().Length).ToList(); Console.WriteLine("LISTA ORDENADA"); foreach (var item in listOrdernada) { Console.WriteLine("estadoInicial " + item.GetInicialString() + "simbolo: " + item.GetSimbolo() + " final: " + item.GetLlegadaString()); } //los mueves se orden de mayor a menor, segun la longitud de su transicion for (int j = 0; j < listOrdernada.Count; j++) { Mueve mueve = listOrdernada.ElementAt(j); string simboloTransicion = mueve.GetSimbolo(); //bool esConjunto = true; if (simboloTransicion.Length > 1) //cadenas mayores a uno { int longitud = simboloTransicion.Length + i; if (longitud <= evaluar.Length) { longitud -= i; string subCadena = evaluar.Substring(i, longitud); Console.WriteLine("subcadena " + subCadena + " simbolo " + simboloTransicion); if (subCadena.Equals(mueve.GetSimbolo())) { estadoActual = mueve.GetEstadoLlegada().GetNombreEstadoAFD(); i += subCadena.Length - 1; valido = true; break; } if (simboloTransicion.Equals("[:todo:]") && !subCadena.Equals("\\n")) { estadoActual = mueve.GetEstadoLlegada().GetNombreEstadoAFD(); i += subCadena.Length - 1; valido = true; break; } } } if (listaConjuntos.ContainsKey(simboloTransicion)) //comparando si es un conjunto { Conjunto conjunto = listaConjuntos[simboloTransicion]; if (conjunto.GetElementos().Contains(letra.ToString()))//iguala con algun elemento de un conjunto { estadoActual = mueve.GetEstadoLlegada().GetNombreEstadoAFD(); valido = true; break; } } else if (simboloTransicion == letra.ToString()) { estadoActual = mueve.GetEstadoLlegada().GetNombreEstadoAFD(); valido = true; break; } else if (simboloTransicion.Equals("[:todo:]")) { estadoActual = mueve.GetEstadoLlegada().GetNombreEstadoAFD(); valido = true; break; } // Console.WriteLine("valida: " + valido); } Console.WriteLine("valida: " + valido); //si sale del segundo for sin encontrar una coincidencia es que no se puede, y la cadena no es valida if (valido == false) { break; //No vale la pena seguir evaluando la expresion entonces para } } //Al salir la variable estadoActual debe ser un estado final para que la expresion sea valida if (valido == false) { impresion += expresionEv.GetNombre() + ": \"" + evaluar + "\" NO ES VALIDA, para la expresion regular evaluada\n"; } else { if (estadosFinales.Contains(estadoActual)) { impresion += expresionEv.GetNombre() + ": \"" + evaluar + "\" ES VALIDA, para la expresion regular evaluada\n"; } else { impresion += expresionEv.GetNombre() + ": \"" + evaluar + "\" NO ES VALIDA, para la expresion regular evaluada\n"; } } return(impresion); }
public void GenerarAFN(Expresiones_Regulares expresion) { this.expresion = expresion; bool suma = true; Token token1; List <Token> nuevaER = expresion.GetTokens().ToList(); List <Token> auxiliar = new List <Token>(); foreach (var item in nuevaER) { if (item.GetTipoToken() == Token.Tipo.LLAVE_APERTURA || item.GetTipoToken() == Token.Tipo.LLAVE_CIERRE) { } else { auxiliar.Add(item); } } nuevaER = auxiliar; while (suma) { for (int i = 0; i < nuevaER.Count; i++) { token1 = nuevaER.ElementAt(i); if (token1.GetTipoToken() == Token.Tipo.OP_SUMA) { suma = true; break; } else { suma = false; } } if (suma) { nuevaER = SustituirCerraduraPositiva(nuevaER); } } foreach (var item in nuevaER) { Console.WriteLine(item.GetValorToken()); } //AFN inicial = Operando("epsilon"); for (int i = nuevaER.Count - 1; i >= 0; i--) { GenerarThompson(nuevaER.ElementAt(i)); } //ORDENANDO LOS ESTADOS AFN final = stackAFN.Pop(); int contadorEst = 1; //final = Concatenacion(inicial, final); //stackAFN.Push(final); final.Inicial.SetNumeroEstado(0); foreach (var item in final.GetListaEstados()) { item.SetNumeroEstado(contadorEst); contadorEst++; } final.Final.SetNumeroEstado(contadorEst); stackAFN.Push(final); foreach (var token in nuevaER) { switch (token.GetTipoToken()) { case Token.Tipo.PUNTO: //CONCATENACION { break; } case Token.Tipo.PALITO_OR: //ALTERNANCIA { break; } case Token.Tipo.ASTERISCO: //CERRADURA DE KLEEN { break; } case Token.Tipo.OP_SUMA: //CERRADURA POSITIVA { break; } case Token.Tipo.PREGUNTA_CIERRE: //APARICION { break; } default: { //operando if (!final.listaTerminales.Contains(token.GetValorToken())) { final.listaTerminales.Add(token.GetValorToken()); } break; } } } }