Пример #1
0
        private bool ChequearQueNoSeEsteOperandoLaPilaParaUnErrorSintactico(Produccion prod)
        {
            bool retorno      = false;
            bool pararChequeo = false;

            if (prod.ProduceElementoVacio())
            {
                int posPila = 1;
                while (!(CadenaEntrada.EsFinDeCadena() && Pila.EsFinDePila()) && (Pila.Count > posPila) && !pararChequeo)
                {
                    if (Pila.ObtenerPosicion(posPila).GetType() == typeof(Terminal))
                    {
                        Terminal term = (Terminal)Pila.ObtenerPosicion(posPila);

                        if (CadenaEntrada.ObtenerPrimerTerminal().Equals(Pila.ObtenerPosicion(posPila)))
                        {
                            //No hay error pq coincide el terminal, y se va a poder descartar en el proximo paso.
                            retorno      = false;
                            pararChequeo = true;
                        }
                        else
                        {
                            if (term.NoEsLambda())
                            {
                                //Hay error pq el terminal no coindiria con el de la cadena de entrada.
                                retorno      = true;
                                pararChequeo = true;
                            }
                        }
                    }
                    else
                    {
                        Terminal   t  = CadenaEntrada.ObtenerPrimerTerminal();
                        NoTerminal nt = (NoTerminal)Pila.ObtenerPosicion(posPila);

                        bool generaProdVacia = false;

                        //Que es esto??
                        if (!PerteneceNoTerminalesNoEscapeables(nt))
                        {
                            generaProdVacia = gramatica.NoTerminalGeneraProduccionVacia(nt);
                        }

                        Produccion prodAux = tabla.BuscarEnTablaProduccion(nt, t, false, generaProdVacia);

                        if (prodAux != null)
                        {
                            if (prodAux.ProduceElementoVacio())
                            {
                                posPila++;
                            }
                            else
                            {
                                //Significa que llegue a algo concreto con el terminal que tengo en el tope, y dejo seguir.
                                retorno      = false;
                                pararChequeo = true;
                            }
                        }
                        else
                        {
                            //Significa que en la tabla ni figura, o sea que es un error
                            retorno      = true;
                            pararChequeo = true;
                        }
                    }
                }

                if (posPila > Pila.Count)
                {
                    //Hubo error pq el terminal tope no servia para nada de la pila
                    retorno = true;
                }
            }

            return(retorno);
        }