public void buscarEnTDSIdentificador(string variable, int tipo, int size) { int incrementar = 0; foreach (var item in list_TDS) { if (item.Nombre.Equals(variable)) { if (item.Tipo == 0) { item.Tipo = tipo; item.Zise = size; } else { errores miError = new errores() { NumError = 1, MsjError = "Error sintáctico: " + variable + " variable ya definida " + incrementar }; listaErroresSintactico.Add(miError); } } incrementar++; } }
//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; } } }
public void Reconocedor_Lexico() { listaMovimientos = new List <AFD>(); lista_tks_reconocidos = new List <Tokens>(); listError = new List <errores>(); listTDS = new List <TablaSimbolos>(); int estado = 0, newestado = 0, nidentificador = 0; char simbolo; string lexema = null; bool flag_main = false; // Formateando el texto de entrada tomar en cuenta que al quitar // el blando dentro de lo que este en comillas se podra como # // Hacer un replace siempre y cuando no este entre comillas string entrada = texto_file_name.Replace('\n', '#').Replace('\t', '#').Replace('\r', '#').Replace(' ', '#') + "#"; char[] palabras = entrada.ToCharArray(); int cuenta_simbolos = entrada.Length; Tokens tk = new Tokens(); int j = 0; AFD move; while (j < palabras.Length) { simbolo = Convert.ToChar(palabras[j]); newestado = movimiento_AFD(estado, simbolo); if (!(simbolo.Equals('#') && (estado == 0))) { move = new AFD() { Estado = estado, Leyendo = simbolo, NEstado = newestado }; if (newestado < 0) { move.Lee = "Token Reconocido " + (-newestado); } listaMovimientos.Add(move); } if (newestado == 998) { estado = 0; lexema = ""; j++; continue; } if (newestado == 999) { // Presentar mensaje error errores miError = new errores() { NumError = 1, MsjError = "Error léxico: simbolo " + simbolo + " no reconocido en el lexema " + lexema }; listError.Add(miError); // Volvemos a estado 0 y lexema para que vuelva areconocer otro token while (true) { if (palabras[j] != '#') { j++; continue; } break; } estado = 0; lexema = ""; j++; continue; } else if (newestado < 0) { newestado = -newestado; BuscarToken(newestado, lexema); if (newestado == 22) { flag_main = true; } // Verificar si es un identificador if (newestado == 1 && !(flag_main)) { // Quedarnos solo con 8 carateres significativos if (!(lexema.Length < 8)) { lexema = lexema.Substring(0, 8); } // Se reconocio un identificador guardar en la tabla de simbolos TablaSimbolos identificador = new TablaSimbolos() { Numero = nidentificador++, Nombre = lexema // Guardar tipo y ancho }; //Buscar identificador: si esta error listTDS.Add(identificador); } estado = 0; lexema = ""; } else { if (!simbolo.Equals('#')) { lexema += simbolo; } estado = newestado; } j++; } }
public int movimiento_AFD(int estado, char simbolo) { int caso = 0; if (char.IsLetter(simbolo)) { //es una letra caso = 2; if (char.IsUpper(simbolo)) { //es una mayuscula caso = 1; } } else if (char.IsDigit(simbolo)) { //es un digitp caso = 3; } else { //validar que el simbolo exista en nuestro alfabeto //es otro caracter string simbolos = "!#$%&<>_=:,?'+-/*().{};\\"; string simboloString = simbolo.ToString(); if (!simbolos.Contains(simboloString)) { //Presentar mensaje de error errores miError = new errores() { NumError = 2, MsjError = "Error léxico: simbolo " + simbolo + " no es parte de nuestro lenguaje" }; listError.Add(miError); return(998); } caso = 4; } foreach (AFD transicion in ListAFD) { if (transicion.Estado == estado) { if ((transicion.Lee.Equals("letra") && caso == 2) || (transicion.Lee.Equals("mayuscula") && caso == 1) || (transicion.Lee.Equals("digito") && caso == 3) || (transicion.Lee.Equals("simbolo") && caso == 4)) { return(transicion.NEstado); } String letra = simbolo.ToString(); if (transicion.Lee.Equals(letra)) { return(transicion.NEstado); } } } return(999); }