/** * Me permite saber cual es la palabra correcta por equivocarse una letra * * return : me retorna la cadena correcta o incorrecta */ public string lexemaProbable(int posicion_columna, string palabraLeer, int estado, string cadenaPalabra, TablaCompacta tc) { int newestado = -1; string simbolo = ""; int aux = estado; string newCadenaPalabra = cadenaPalabra; char lee = ' '; foreach (string s in tc.listSimbolosSiguientes(estado)) // recorro la lista de los simbolos que pueden seguir { newestado = tc.movimiento(estado, char.Parse(s)); aux = newestado; // aux sera nuestro nuevo estado newCadenaPalabra += s; // agrego la letra para completar la palabra correcta for (int i = posicion_columna + 1; i < palabraLeer.Length; i++) // recorro el texto de la fila, le aumento +1 para no ler la letra equivocada { lee = palabraLeer.ElementAt(i); if (" ".Equals(lee.ToString())) // si encuentro un espacio salgo de la funcion x q puede ser que ya reconoci la palabr o no { return(newCadenaPalabra); } newestado = tc.movimiento(aux, lee); // busco el nuevo movimiento y si hay coincidencias, ya estoy encontrando la´palabra if (newestado > -1) // entro si nos da un nuemero positivo { aux = newestado; // igualo en estado newCadenaPalabra += lee.ToString(); // completo la palabra } else // si nos da un -1 no hay coincidencias { newCadenaPalabra = lexemaProbable(i, palabraLeer, aux, newCadenaPalabra, tc); //imprin("lenea: " + i); // si el lexema encontrado tiene la misma longitud de la palabra que estoy buscando // y si esa palabra encontrada se encuentra en el alfabeto entro if (newCadenaPalabra.Length == palabraLeer.Length && this.listAlfabeto.FindIndex(x => (x.lexema).Equals(newCadenaPalabra)) > -1) { return(newCadenaPalabra); // retorno la palabra probable } else // cuando no es reconocida la palabra probable { newCadenaPalabra = cadenaPalabra; // reseteo a la palabra que estaba bien hasta una sierta parte break; // salgo del for } } } } //return ""; // si no reconosco ninguna palabra envio vacio return(newCadenaPalabra); }
/** * Realizo la transicion de cada caracter de la cadena ingresada * y lo agrego a una lista * * @param listAlfabeto : ingresa la lista de alfabeto cargada * @param tc: ingresa las listas de la tabla compacta */ public List <Automata> listSimbolosReconocidos(List <Token> listAlfabeto, TablaCompacta tc) { //string[] txt_lines = abriArchivo(this.ruta); string[] txt_lines = this.lineas_codigo; string lexemaProbable = ""; string lexemaIncorrecto = ""; List <Automata> listaReconocida = new List <Automata>(); int estado = 0; char leyendo = ' '; int newestado = 0; string cadenaReconocida = ""; Object[] obj_lexemaIncorrecto = null; //foreach (string line in txt_lines) // recorro por cada linea del archivo for (int lin = 0; lin < txt_lines.Length; lin++) // recorro por cada linea del archivo { for (int i = 0; i < txt_lines[lin].Length; i++) { leyendo = txt_lines[lin].ElementAt(i); if ((leyendo.ToString()).Equals(" ") || (leyendo.ToString()).Equals("\t")) // si encuentra un espacio lo remplazo por un $ { leyendo = '$'; } newestado = tc.movimiento(estado, leyendo); // obtengo la nueva posicion para leer //imprin("Leyendo: " + leyendo + " i = " + i + " len: " + txt_lines[lin].Length+" estado "+estado+ " newestado "+newestado); if (newestado >= 0) // los simbolos son reconocidos desde el 0 + { listaReconocida.Add(new Automata(estado, leyendo, newestado)); estado = newestado; if ((leyendo.ToString()).Equals("$") && newestado != 80) // 80 porque esta en el nodo de comentario del AFD { agregarTokenReconocido(cadenaReconocida, newestado, lin); cadenaReconocida = ""; estado = 0; // por este momento cuando un lexema sea reconocido le envio al estado inicial 0 } else { cadenaReconocida += leyendo.ToString(); } } else // no se reconoce el simbolo { // este objeto[] contirne { numero de columans recoridas de cada fiala, palabra que solo se necesita leer} obj_lexemaIncorrecto = palabraSoloReconocer(txt_lines[lin], cadenaReconocida, i); lexemaIncorrecto = obj_lexemaIncorrecto[1].ToString(); //[1] se encuentra la palabra que solo se necesita leer sin ningun espacio lexemaProbable = this.lexemaProbable(i, txt_lines[lin], estado, cadenaReconocida, tc); // me retorna el lexema corregido // lexema que porbablemente quiso decir if (lexemaIncorrecto.Length == lexemaProbable.Length) { this.erroresR.insertarMesajeSurencia(-104, lexemaIncorrecto, lexemaProbable, lin + 1); // error 104 -> lexema probable this.banderaDeclare = false; // si se produce un error no permito que sigua ingresando datos al TDS } else // se produjo un error -999 { this.erroresR.insertarErroresReconocidos(-999, lexemaIncorrecto, lin + 1); this.banderaDeclare = false; // si se produce un error no permito que sigua ingresando datos al TDS } i += int.Parse(obj_lexemaIncorrecto[0].ToString()) - 1; // le resto -1 porque la letra error ya fue leida cadenaReconocida = ""; // reinicio la cadena porque ya terminados el lexema porbablemente que quiso decir estado = 0; // por este momento cuando un lexema sea reconocido le envio al estado inicial 0 } } leyendo = '$'; // cuando la linea fue reconocia y el lexema continua con $ newestado = tc.movimiento(estado, leyendo); // genero el movimiento que sigue con $ para saber en que estado termina estado = 0; // cuando hay un salto de linea entonces le volvemos al nodo inicial 0 // cuando el newestado me retorna un num negativo if (newestado < 0) { return(listaReconocida); } listaReconocida.Add(new Automata(estado, leyendo, newestado)); if ((leyendo.ToString()).Equals("$")) // reconozco el token de la liena anterior cuando hay un salto de lenea { agregarTokenReconocido(cadenaReconocida, newestado, lin); cadenaReconocida = ""; } } return(listaReconocida); }