示例#1
0
        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++;
            }
        }
示例#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;
                }
            }
        }
示例#3
0
        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++;
            }
        }
示例#4
0
        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);
        }