Пример #1
0
        public ELEMENTOS_y_Fisrt CompiaDeActual()
        {
            ELEMENTOS_y_Fisrt iterador = new ELEMENTOS_y_Fisrt();

            string [] l = this.lista.Keys.ToArray();
            foreach (string x in l)
            {
                List <string> x2 = this.Get_First_de_un_elemento(x).ToList();
                iterador.set_elementos(x, x2);
            }
            return(iterador);
        }
Пример #2
0
        public bool EsigualAOtro(ELEMENTOS_y_Fisrt i)
        {
            bool resp = true;

            if (i.lista.Count != this.lista.Count)
            {
                return(false);
            }//si pasa esto es porque tiene la misma cantodad de elementos
            string []     llaves1 = this.lista.Keys.ToArray();
            List <string> llaves2 = i.lista.Keys.ToList <string>();

            string [] k1 = this.lista.Keys.ToArray();
            string [] k2 = i.lista.Keys.ToArray();
            foreach (string x in llaves1)
            {
                if (!llaves2.Contains(x))//si no tiene una llave del primero son diferentes
                {
                    return(false);
                }
            }
            //comparando elementos dele origninal con La copia
            foreach (string item in llaves1)
            {
                foreach (string item2 in llaves2)
                {
                    List <string> r1 = this.lista [item].get_First();
                    List <string> r2 = i.lista [item2].get_First();
                    if (item.CompareTo(item2) == 0)
                    {
                        resp = this.ArreglosIguales(r1, r2);
                        if (resp == false)
                        {
                            return(false);
                        }
                    }
                }
            }
            return(true);
        }
Пример #3
0
        public Dictionary <string, List <string> > CalcularFirst()
        {                                                                       //metodo para el inicio del calculo del first
            ELEMENTOS_y_Fisrt Lista_Elemtos_y_First  = new ELEMENTOS_y_Fisrt(); //calse que maneja llave <[id=(string)],fisrt>, maneja las inserciones repetidas
            ELEMENTOS_y_Fisrt Lista_Elemtos_y_First2 = new ELEMENTOS_y_Fisrt(); //calse que maneja llave <[id=(string)],fisrt>, maneja las inserciones repetidas

            // y la sobrecarga del first, tanto como el first vacio u otros errores
            int []     llaves    = this.ContenidoProduccion.Keys.ToArray();
            List <int> NoSimples = new List <int>();

            foreach (int item in llaves)//se mandan a calcular los que tienen first simple
            {
                ElementoProduccion iterator = this.ContenidoProduccion [item];
                if (iterator.SFrist())// si la produccion posee un first simple, calcular fisrt simples primero
                {
                    List <string> firstSimple = iterator.CalcularFirstSimple().ToList <string>();
                    iterator.set_My_Fisrt(firstSimple);
                    Lista_Elemtos_y_First.set_elementos(iterator.Get_llave(), firstSimple.ToList());
                }
                else
                {
                    NoSimples.Add(item);//seguardan las llaves de las producciones que no lo contiene de manera simple
                }
            }
            foreach (int item in NoSimples) //calculamos el first por individual de cada complejo
            {                               //calculo inicial
                ElementoProduccion iterator   = this.ContenidoProduccion [item];
                String []          pendientes = iterator.GpendFirst().ToArray();
                foreach (string i in pendientes)
                {
                    if (this.bRango(i))
                    {
                        Lista_Elemtos_y_First.set_elementos(iterator.Get_llave(), Lista_Elemtos_y_First.Get_First_de_un_elemento(i));
                    }
                    else
                    {
                        Lista_Elemtos_y_First.set_elemento(iterator.Get_llave(), i);
                    }
                }
            }
            bool cambio = true;

            while (cambio == true)
            {
                Lista_Elemtos_y_First2 = Lista_Elemtos_y_First.CompiaDeActual();

                foreach (int item in NoSimples) //calculamos el first por individual de cada complejo
                {                               //miemros si la lista cambio
                    ElementoProduccion iterator   = this.ContenidoProduccion [item];
                    String []          pendientes = iterator.GpendFirst().ToArray();
                    foreach (string i in pendientes)
                    {
                        if (this.bRango(i))
                        {
                            Lista_Elemtos_y_First.set_elementos(iterator.Get_llave(), Lista_Elemtos_y_First.Get_First_de_un_elemento(i));
                        }
                        else
                        {
                            Lista_Elemtos_y_First.set_elemento(iterator.Get_llave(), i);
                        }
                    }
                }
                if (Lista_Elemtos_y_First.EsigualAOtro(Lista_Elemtos_y_First2)) //para ver si dejara de calcularlo
                {                                                               //dejara de calcularlo hasta que la Lista_Elemtos_y_First antes de volverlo a calcular sea igual a la restualten despues de calcular
                    cambio = false;
                }
            }
            List <string> anulables = Lista_Elemtos_y_First.Los_anulables().ToList();// porque ya se tiene el first de todos los complejos sin ver anulables

            cambio = true;

            while (cambio == true)//calculo hasta que no haya anulables
            {
                Lista_Elemtos_y_First2 = Lista_Elemtos_y_First.CompiaDeActual();

                foreach (int item in NoSimples) //calculamos el first por individual de cada complejo
                {                               //miemros si la lista cambio
                    ElementoProduccion iterator   = this.ContenidoProduccion [item];
                    String []          pendientes = iterator.GetpenFirst2(anulables).ToArray();

                    foreach (string i in pendientes)
                    {
                        if (this.bRango(i))
                        {
                            Lista_Elemtos_y_First.set_elementos(iterator.Get_llave(), Lista_Elemtos_y_First.Get_First_de_un_elemento(i));
                        }
                        else
                        {
                            Lista_Elemtos_y_First.set_elemento(iterator.Get_llave(), i);
                        }
                    }
                }
                if (Lista_Elemtos_y_First.EsigualAOtro(Lista_Elemtos_y_First2)) //para ver si dejara de calcularlo
                {                                                               //dejara de calcularlo hasta que la Lista_Elemtos_y_First antes de volverlo a calcular sea igual a la restualten despues de calcular
                    cambio = false;
                }
            }



            foreach (int item in NoSimples) //calculamos el first por individual de cada complejo
            {                               //calculo inicial
                ElementoProduccion iterator   = this.ContenidoProduccion [item];
                String []          pendientes = iterator.GpendFirst().ToArray();
                foreach (string i in pendientes)
                {
                    if (this.bRango(i))
                    {
                        Lista_Elemtos_y_First.set_elementos(iterator.Get_llave(), Lista_Elemtos_y_First.Get_First_de_un_elemento(i));
                    }
                    else
                    {
                        Lista_Elemtos_y_First.set_elemento(iterator.Get_llave(), i);
                    }
                }
            }


            foreach (int item in NoSimples) //calculamos el first por individual de cada complejo
            {                               //calculo inicial
                ElementoProduccion iterator   = this.ContenidoProduccion [item];
                String []          pendientes = iterator.GpendFirst().ToArray();
                foreach (string i in pendientes)
                {
                    if (this.bRango(i))
                    {
                        Lista_Elemtos_y_First.set_elementos(iterator.Get_llave(), Lista_Elemtos_y_First.Get_First_de_un_elemento(i));
                    }
                    else
                    {
                        Lista_Elemtos_y_First.set_elemento(iterator.Get_llave(), i);
                    }
                }
            }


            foreach (int item in NoSimples) //calculamos el first por individual de cada complejo
            {                               //calculo inicial
                ElementoProduccion iterator   = this.ContenidoProduccion [item];
                String []          pendientes = iterator.GpendFirst().ToArray();
                foreach (string i in pendientes)
                {
                    if (this.bRango(i))
                    {
                        Lista_Elemtos_y_First.set_elementos(iterator.Get_llave(), Lista_Elemtos_y_First.Get_First_de_un_elemento(i));
                    }
                    else
                    {
                        Lista_Elemtos_y_First.set_elemento(iterator.Get_llave(), i);
                    }
                }
            }



            foreach (int item in NoSimples) //calculamos el first por individual de cada complejo
            {                               //calculo inicial
                ElementoProduccion iterator   = this.ContenidoProduccion [item];
                String []          pendientes = iterator.GpendFirst().ToArray();
                foreach (string i in pendientes)
                {
                    if (this.bRango(i))
                    {
                        Lista_Elemtos_y_First.set_elementos(iterator.Get_llave(), Lista_Elemtos_y_First.Get_First_de_un_elemento(i));
                    }
                    else
                    {
                        Lista_Elemtos_y_First.set_elemento(iterator.Get_llave(), i);
                    }
                }
            }
            foreach (int item in NoSimples) //calculamos el first por individual de cada complejo
            {                               //calculo inicial
                ElementoProduccion iterator   = this.ContenidoProduccion [item];
                String []          pendientes = iterator.GpendFirst().ToArray();
                foreach (string i in pendientes)
                {
                    if (this.bRango(i))
                    {
                        Lista_Elemtos_y_First.set_elementos(iterator.Get_llave(), Lista_Elemtos_y_First.Get_First_de_un_elemento(i));
                    }
                    else
                    {
                        Lista_Elemtos_y_First.set_elemento(iterator.Get_llave(), i);
                    }
                }
            }



            Dictionary <string, List <string> > FirstResultantes = new Dictionary <string, List <string> >();

            foreach (int item in llaves)//se mandan a calcular los que tienen first simple
            {
                ElementoProduccion iterator = this.ContenidoProduccion [item];
                if (!FirstResultantes.ContainsKey(iterator.Get_llave()))
                {
                    if (iterator.Get_llave().CompareTo("<start>") == 0)
                    {
                        string []     elements   = Lista_Elemtos_y_First.Get_First_de_un_elemento(iterator.Get_llave()).ToArray();
                        List <string> sinEpsilon = new List <string>();
                        string        epsilon    = Convert.ToString("ԑ");
                        foreach (string s in elements)
                        {
                            /// if (s.CompareTo(epsilon) != 0)
                            ///{
                            sinEpsilon.Add(s);
                            ///}
                        }
                        FirstResultantes.Add(iterator.Get_llave(), sinEpsilon.ToList());
                    }
                    else
                    {
                        FirstResultantes.Add(iterator.Get_llave(), Lista_Elemtos_y_First.Get_First_de_un_elemento(iterator.Get_llave()).ToList());
                    }
                }
            }
            return(FirstResultantes);
        }