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()); } } }
private void EXPRESION() { Expresiones_Regulares expresion = new Expresiones_Regulares(tokenActual.GetValorToken()); emparejar(Token.Tipo.IDENTIFICADOR); if (tokenActual.GetTipoToken() == Token.Tipo.GUION) { emparejar(Token.Tipo.GUION); emparejar(Token.Tipo.MAYOR); while (tokenActual.GetTipoToken() != Token.Tipo.PUNTO_COMA && dentroExpresion == true) { expresion.AñadirElemento(tokenActual); controlToken++; tokenActual = listaTokens.ElementAt(controlToken); } emparejar(Token.Tipo.PUNTO_COMA); if (!listaER.ContainsKey(expresion.GetNombre())) { listaER.Add(expresion.GetNombre(), expresion); } } else if (tokenActual.GetTipoToken() == Token.Tipo.DOS_PUNTOS) { emparejar(Token.Tipo.DOS_PUNTOS); while (tokenActual.GetTipoToken() != Token.Tipo.PUNTO_COMA) { expresion.AñadirElemento(tokenActual); controlToken++; tokenActual = listaTokens.ElementAt(controlToken); } emparejar(Token.Tipo.PUNTO_COMA); if (listaER.ContainsKey(expresion.GetNombre())) { listaCadenasEv.Add(expresion); } } }
public string[] CrearAFD() { string[] hola = new string[2]; AFN automataAF = stackAFN.Peek(); AFD automata = new AFD(automataAF, automataAF.GetListaTerminales(), listaConjuntos); automata.CrearAFD(); hola[0] = automata.GenerarGraphvizAFD(); hola[1] = automata.GenerarGraphivizAFDTabla(); foreach (var item in cadenas) { if (item.GetNombre().Equals(expresion.GetNombre())) { Form1.textConsola += automata.validarCadena(item); } } return(hola); }
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); }