示例#1
0
        public List <reglas_de_produccion> cargarReglasProduccion()
        {
            string path = path_file_sin + "\\gramatica.json";
            List <reglas_de_produccion> listreglasProduccion = new List <reglas_de_produccion>();
            string  archivo = File.ReadAllText(path);
            dynamic data    = JObject.Parse(archivo);
            int     cont    = 1;

            foreach (var item in data.gramatica.reglas.regla)
            {
                if (item.size != null)
                {
                    misReglasProduccion = new reglas_de_produccion()
                    {
                        Numero_regla   = cont,
                        Part_derecha   = item.parteDerechaNS,
                        Part_izquierda = item.parteIzquierdaNS,
                        Izq_sinonimo   = item.parteIzquierda,
                        Der_sinonimo   = item.parteDerecha,
                        Size           = item.size
                    };

                    listreglasProduccion.Add(misReglasProduccion);
                    cont++;
                }
            }

            return(listreglasProduccion);
        }
示例#2
0
        //algiriitmo del analizador
        public void AnalizadorSLR()
        {
            Tokens tk = new Tokens();

            list_reglas_reconocidas = new List <reglas_de_produccion>();
            bool   band = true;
            string simbolo;
            int    estado    = 0;
            int    newestado = 0;
            int    cont      = 0;

            //tomar el token
            tk      = list_tokens_reconocido[cont];
            simbolo = tk.Sinonimo;

            //Guarda el movimiento quese hizo en pila
            pila_sintactica.Push(estado);
            guardarMovimientoPila();

            //bucle del reconosedor hasta cuando reconosca Apectar o Error
            while (band)
            {
                // Movernos en la matriz sintactica con el simbolo
                // para buscar el nuevo estado
                newestado = devolverNuevoEstado(estado, simbolo);

                Console.WriteLine(estado + " leyendo: " + simbolo + " va a: " + newestado);
                // Verificar si encontro el nuevo estado
                if (newestado != 997)
                {
                    // Si encontro nuevo estado
                    if (newestado < 0)
                    {
                        //se reconocio regla
                        newestado = -newestado;
                        reglas_de_produccion rule = devolverRegla(newestado);

                        if (rule == null)
                        {
                            //Error no encontró regla
                            continue;
                        }
                        //Guardar la regla en lista de reglas reconocidas
                        list_reglas_reconocidas.Add(rule);

                        int cuenta = rule.Der_sinonimo.Length;
                        cuenta = cuenta * 2;
                        // Agregamos a la pila sintactica
                        guardarMovimientoPila();
                        //bajar de la pila
                        for (int i = 0; i < cuenta; i++)
                        {
                            pila_sintactica.Pop();
                        }
                        //encontro la regla y tenemos que sacar la parte izquierda
                        estado = (int)pila_sintactica.Peek();
                        // Guardamos en la pila el no terminal que esta la parte izquierda de la regla
                        pila_sintactica.Push(rule.Izq_sinonimo);
                        //movernos en la SLR para ver a que estado va
                        string s = rule.Izq_sinonimo;
                        newestado = devolverNuevoEstado(estado, s);

                        if (newestado != 997)
                        {
                            pila_sintactica.Push(newestado);
                            estado = newestado;
                        }
                        else
                        {
                            // Presentar mensaje de error
                            errores miError = new errores()
                            {
                                NumError = 1,
                                MsjError = "Error sintáctico: " + s + " no se encuentra en la matriz transciones " + newestado
                            };
                            listaErroresSintactico.Add(miError);
                            band = false;
                        }
                        // Guardar movimiento de la pila
                        guardarMovimientoPila();
                    }
                    else if (newestado == 1000)
                    {
                        //Aceptar
                        //bajar de la pila
                        for (int i = 0; i < 3; i++)
                        {
                            pila_sintactica.Pop();
                        }
                        guardarMovimientoPila();
                        break;
                    }
                    else
                    {
                        // Guardar movimientos en la lista de movimientos
                        // para presentar en la tabla mov sintactica
                        AFD miMove = new AFD()
                        {
                            Estado  = estado,
                            Leyendo = Convert.ToChar(simbolo),
                            NEstado = newestado
                        };
                        list_movimientos.Add(miMove);
                        //moverse dentrodel automata
                        pila_sintactica.Push(simbolo);
                        pila_sintactica.Push(newestado);
                        estado = newestado;
                        //tomar el token
                        cont++;
                        tk      = list_tokens_reconocido[cont];
                        simbolo = tk.Sinonimo;
                    }
                }
                else
                {
                    // Guardar movimientos en la lista de movimientos
                    // para presentar en la tabla mov sintactica
                    AFD miMove = new AFD()
                    {
                        Estado  = estado,
                        Leyendo = Convert.ToChar(simbolo),
                        NEstado = newestado
                    };
                    list_movimientos.Add(miMove);
                    //Buscar y presentar posible simbolo con el que debe ir
                    string simbolosPosibles = "";
                    foreach (var item in list_SLR)
                    {
                        if (estado == item.Estado)
                        {
                            if (!Char.IsUpper(Convert.ToChar(item.Simbolos_lee)))
                            {
                                //Buscar en alfabeto
                                string lexema = buscarEnAlfabeto(item.Simbolos_lee);
                                simbolosPosibles += lexema + " ";
                            }
                        }
                    }

                    // Presentar mensaje de error
                    errores miError = new errores()
                    {
                        NumError = 1,
                        MsjError = "Error sintáctico: " + simbolo +
                                   " no se encuentra en la matriz transciones  talvex quizas omitio uno de estos simbolos: " + simbolosPosibles
                    };
                    listaErroresSintactico.Add(miError);
                    band = false;
                    //tomar el token para recuperarse del error
                    cont++;

                    tk      = list_tokens_reconocido[cont];
                    simbolo = tk.Sinonimo;
                }
            }
        }