Example #1
0
 public Produccion(Produccion p,List<Term>listaTokenBusq)
 {
     this._nT = p.nT;
     this._listProd = p._listProd;
     this._listTokenBusq = new List<Term>(listaTokenBusq);
     this._punto = p._punto;
 }
Example #2
0
 private void init(Produccion p)
 {
     this._listProd.Add(p); // agrega la primera prod del estado
     if (this.id == 0)
     {
         p.agregaTokenBusqueda(new Term("$"));
     }
     this.inicializaEdo(p);
     this.verificaProduccionesEdo();
 }
Example #3
0
        public Estado(List<Produccion> listProd, int id): this(id)
        {
            Produccion prodAux;

            foreach (Produccion p in listProd)
            {
                prodAux = new Produccion(p);
                this.init(prodAux);
            }
        }
Example #4
0
        private void inicializaEdo(Produccion prodAux, List<Term> listTokenBusq)
        {
//            List<Term> listTokenBusq = new List<Term>();

            if (prodAux.punto < prodAux.listProd.Count) //si el punto no ha llegado al final
            {
                if (prodAux.listProd[prodAux.punto].GetType().Name.Equals("NoTerm")) // si en la posicion del punto hay un NT
                {
                    listTokenBusq = listTokenBusq.Union(prodAux.regresaPrimeroProd()).ToList();
                    this.agregaProduccionesInicio(((NoTerm)prodAux.listProd[prodAux.punto]), listTokenBusq); //Agrega al estado las producciones de inicio de ese NT
                }
            }
        }
Example #5
0
        private void inicializaEdo(Produccion prodAux, List <Term> listTokenBusq)
        {
//            List<Term> listTokenBusq = new List<Term>();

            if (prodAux.punto < prodAux.listProd.Count)                              //si el punto no ha llegado al final
            {
                if (prodAux.listProd[prodAux.punto].GetType().Name.Equals("NoTerm")) // si en la posicion del punto hay un NT
                {
                    listTokenBusq = listTokenBusq.Union(prodAux.regresaPrimeroProd()).ToList();
                    this.agregaProduccionesInicio(((NoTerm)prodAux.listProd[prodAux.punto]), listTokenBusq); //Agrega al estado las producciones de inicio de ese NT
                }
            }
        }
Example #6
0
        /// <summary>
        /// Agrega las producciones de inicio del NT recibido
        /// Calculando los tokens de busqueda de cada producción
        /// </summary>
        /// <param name="NT">No Terminal que agregara sus Producciones al estado</param>
        private void agregaProduccionesInicio(NoTerm NT, List <Term> listTokenBusq)
        {
            Produccion prodAux;

            foreach (Produccion p in NT.listProdInicio)
            {
                prodAux = new Produccion(p);
                if (prodAux.listProd[prodAux.punto].GetType().Name.Equals("NoTerm"))
                {
                    listTokenBusq = listTokenBusq.Union(prodAux.regresaPrimeroProd()).ToList();
                }
                prodAux.agregaTokenBusqueda(listTokenBusq);
                this._listProd.Add(prodAux);
            }
        }
Example #7
0
        private void creaAfdRec(Estado e)
        {
            Produccion        nuevaProd;
            List <Produccion> listProd;
            List <Produccion> listProdIguales;
            Arista            ar;
            Estado            estadoNuevo, estadoAux;
            int numPrueba = 0;

            foreach (Produccion p in e.listProd)
            {
//                numPrueba++;
                if (this.idSig == 384)
                {
                    numPrueba = 0;
                }
                if (p.punto < p.listProd.Count)
                {
                    ar = new Arista(p.listProd[p.punto]);
                    //          if (ar.token.GetType().Name.Equals("NoTerm"))
                    //          {
                    listProdIguales = e.regresaListaDePRod(ar.token);
                    if (listProdIguales.Count > 1 /*e.listProd.Exists(a => a.listProd[a.punto].token.Equals(ar.token.token))*/)
                    {
//                             = e.listProd.FindAll(a => a.listProd[a.punto].token.Equals(ar.token.token));
                        listProd = new List <Produccion>();
                        foreach (Produccion prod in listProdIguales)
                        {
                            nuevaProd = new Produccion(prod);
                            nuevaProd.punto++;
                            listProd.Add(nuevaProd);
                        }
                        estadoNuevo = new Estado(listProd, this.idSig++);
                    }
                    else
                    {
                        nuevaProd = new Produccion(p);
                        nuevaProd.punto++;
                        estadoNuevo = new Estado(nuevaProd, this.idSig++);
                    }
                    //           }
                    //           else
                    //           {
                    //               nuevaProd = new Produccion(p);
                    //               nuevaProd.punto++;
                    //               estadoNuevo = new Estado(nuevaProd, this.idSig++);
                    //           }


                    estadoAux = this.buscaEstadosIguales(estadoNuevo);
                    if (estadoAux != null)
                    {
                        this.idSig--;
                        ar.estadoDest = estadoAux;
                        if (!e.listAristas.Exists(a => a.token.token.Equals(ar.token.token) && a.estadoDest.id.Equals(ar.estadoDest.id)))
                        {
                            e.agregaArista(ar);
                        }
                    }
                    else
                    {
                        ar.estadoDest = estadoNuevo;
                        e.agregaArista(ar);
                        this._listEdos.Add(estadoNuevo);
                        this.creaAfdRec(estadoNuevo);
                    }
                }
            }
        }
Example #8
0
 public Estado(Produccion p, int id):this(id)
 {
     Produccion prodAux = new Produccion(p);
     
     this.init(prodAux);
 }
Example #9
0
        /// <summary>
        /// Agrega las producciones de inicio del NT recibido
        /// Calculando los tokens de busqueda de cada producción
        /// </summary>
        /// <param name="NT">No Terminal que agregara sus Producciones al estado</param>
        private void agregaProduccionesInicio(NoTerm NT,List<Term>listTokenBusq)
        {
            Produccion prodAux;

            foreach (Produccion p in NT.listProdInicio)
            {
                prodAux = new Produccion(p);
                if (prodAux.listProd[prodAux.punto].GetType().Name.Equals("NoTerm"))
                {
                    listTokenBusq = listTokenBusq.Union(prodAux.regresaPrimeroProd()).ToList();
                }
                    prodAux.agregaTokenBusqueda(listTokenBusq);
                    this._listProd.Add(prodAux);
            }
        }
Example #10
0
        public Estado(Produccion p, int id) : this(id)
        {
            Produccion prodAux = new Produccion(p);

            this.init(prodAux);
        }
Example #11
0
        private void creaAfdRec(Estado e)
        {
            Produccion nuevaProd;
            List<Produccion> listProd;
            List<Produccion> listProdIguales;
            Arista ar;
            Estado estadoNuevo,estadoAux;
            int numPrueba = 0;

            foreach (Produccion p in e.listProd)
            {
//                numPrueba++;
                if (this.idSig == 384)
                {
                    numPrueba = 0;
                }
                if (p.punto < p.listProd.Count)
                {
                    ar = new Arista(p.listProd[p.punto]);
          //          if (ar.token.GetType().Name.Equals("NoTerm"))
          //          {
                        listProdIguales = e.regresaListaDePRod(ar.token);
                        if (listProdIguales.Count>1/*e.listProd.Exists(a => a.listProd[a.punto].token.Equals(ar.token.token))*/)
                        {
//                             = e.listProd.FindAll(a => a.listProd[a.punto].token.Equals(ar.token.token));
                            listProd = new List<Produccion>();
                            foreach (Produccion prod in listProdIguales)
                            {
                                nuevaProd = new Produccion(prod);
                                nuevaProd.punto++;
                                listProd.Add(nuevaProd);
                            }
                            estadoNuevo = new Estado(listProd, this.idSig++);
                        }
                        else
                        {
                            nuevaProd = new Produccion(p);
                            nuevaProd.punto++;
                            estadoNuevo = new Estado(nuevaProd, this.idSig++);
                        }
         //           }
         //           else
         //           {
         //               nuevaProd = new Produccion(p);
         //               nuevaProd.punto++;
         //               estadoNuevo = new Estado(nuevaProd, this.idSig++);
         //           }
                    

                    estadoAux = this.buscaEstadosIguales(estadoNuevo);
                    if (estadoAux != null)
                    {
                        this.idSig--;
                        ar.estadoDest = estadoAux;
                        if (!e.listAristas.Exists(a => a.token.token.Equals(ar.token.token) && a.estadoDest.id.Equals(ar.estadoDest.id)))
                        {
                            e.agregaArista(ar);
                        }
                    }
                    else
                    {
                        ar.estadoDest = estadoNuevo;
                        e.agregaArista(ar);
                        this._listEdos.Add(estadoNuevo);
                        this.creaAfdRec(estadoNuevo);
                    }
                }
            }
        }