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); }
//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; } } }