Beispiel #1
0
        //Metodo para agregar elementos iniciales.
        public void addinic(NT X, List <NT> B, List <NT> buscar)
        {
            Separa     nregla;
            Separa     aux;
            Produccion nproduccion;

            for (int x = 0; x < X.listaP.Count(); x++)
            {
                nregla      = new Separa();
                nproduccion = X.listaP[x].duprod();
                nproduccion.quitatks("ε");
                nproduccion.ponerpunto();
                nregla.tksbusqueda = new Produccion();
                nregla.derecha.Add(nproduccion);
                nregla.ladoIzq = X;
                Primeragrega(nregla, B, buscar);
                aux = buscaregla(nregla, lreg);
                if (aux == null)
                {
                    lreg.Add(nregla);
                }
                else
                {
                    aux.tksbusqueda.agconjunto(nregla.tksbusqueda.ltok);
                }
            }
        }
Beispiel #2
0
 public Separa buscaregla(Separa buscar, List <Separa> lista)
 {
     return(lista.Find((Predicate <Separa>) delegate(Separa regla)
     {
         return regla.ladoIzq.nom == buscar.ladoIzq.nom && regla.derecha[0].comparaprod(buscar.derecha[0]) == true;
     }));
 }
Beispiel #3
0
        List <Separa> Buscasim(List <Separa> list, Separa sepreg)
        {
            List <Separa> listaux = new List <Separa>();
            NT            tkaux   = sepreg.derecha[0].tksiguiente();

            if (tkaux == null)
            {
                return(null);
            }
            else
            {
                for (int x = 0; x < list.Count(); x++)
                {
                    if ((list[x].derecha[0].tksiguiente() != null) && (list[x].derecha[0].tksiguiente().nom == tkaux.nom))
                    {
                        listaux.Add(list[x]);
                    }
                }
            }
            if (listaux.Count == 0)
            {
                return(null);
            }
            else
            {
                return(listaux);
            }
        }
        //Este metodo se encarga de duplicar una produccion.
        public Separa coprod()
        {
            Separa     nr = new Separa();
            Produccion np;

            NT izq = new NT(ladoIzq.nom);

            izq.NoTerminal();
            izq.primero   = ladoIzq.primero;
            izq.siguiente = ladoIzq.siguiente;

            foreach (Produccion paux in derecha)
            {
                np = paux.duprod();
                nr.derecha.Add(np);
            }

            izq.listaP     = nr.derecha;
            nr.ladoIzq     = izq;
            nr.tksbusqueda = new Produccion();
            if (tksbusqueda != null)
            {
                nr.tksbusqueda.agregafintk(tksbusqueda.ltok);
            }

            return(nr);
        }
Beispiel #5
0
 public bool Reglasim(Separa r1, Separa r2)
 {
     if ((r1.ladoIzq.nom == r2.ladoIzq.nom) && (r1.derecha[0].comparaprod(r2.derecha[0]) == true) && (r1.tksbusqueda.verificaexist(r2.tksbusqueda.ltok) == true))
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
Beispiel #6
0
 //Este metodo sirve para buscar un estado en especifico en la lista, recibe como referencia
 //una variable que es la que se intenta buscar y al final regresa un estado de la lista.
 public AFD buscaEstado(Separa estadobuscado)
 {
     foreach (AFD estado in estados)
     {
         if ((estado.lreg[0].ladoIzq.nom == estadobuscado.ladoIzq.nom) && (estado.lreg[0].derecha[0].comparaprod(estadobuscado.derecha[0]) == true) && (estado.lreg[0].tksbusqueda.verificaexist(estadobuscado.tksbusqueda.ltok) == true))
         {
             return(estado);
         }
     }
     return(null);
 }
Beispiel #7
0
        //Metodo que calcula los primeros a ser agregados
        public void Primeragrega(Separa nue, List <NT> B, List <NT> bucar)
        {
            bool band = false;

            if (B.Count == 0)
            {
                nue.tksbusqueda.agconjunto(bucar);
            }
            else
            {
                for (int d = 0; d < B.Count(); d++)
                {
                    if (B[d].esTerminal == true)
                    {
                        nue.tksbusqueda.agregatkprim(B[d]);
                        band = false;
                        break;
                    }
                    else
                    {
                        if (B[d].primero.seps() == false)
                        {
                            nue.tksbusqueda.agconjunto(B[d].primero.ltok);
                            band = false;
                            break;
                        }
                        else
                        {
                            nue.tksbusqueda.agconjunto(B[d].primero.ltok);
                            band = true;
                        }
                    }
                }
                if (band == true)
                {
                    nue.tksbusqueda.agconjunto(bucar);
                }
            }
        }