Exemplo n.º 1
0
 public static void getRuta_afd(string ruta)
 {
     afd                     = new AFD(ruta);
     columnSimbolos          = afd.listX;
     matriz_tabla_transicion = afd.matriz_tabla_transicion;
     tc = new TablaCompacta(matriz_tabla_transicion, columnSimbolos);
     tablaCompacta_valor  = tc.llenar_table_valor(matriz_tabla_transicion);
     tablaCompacta_prifil = tc.llenar_table_prifil(matriz_tabla_transicion, tablaCompacta_valor.Count);
 }
Exemplo n.º 2
0
        /**
         * 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);
        }
Exemplo n.º 3
0
        /**
         * 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);
        }