Exemplo n.º 1
0
        string getnumeroProd(string s, int v, int [] ikeys)
        { //retorna el # de la produccion de la cadena enviada, asumiendo que se envia <id>
            try
            {
                int produccion = v;
                foreach (int item in ikeys)
                {//numero, no terminal, first, produccion
                    ElementoProduccion iterator = this.ContenidoProduccion [item];
                    string             keu      = iterator.Get_llave().ToLower();
                    if (keu.CompareTo(s) == 0)
                    {
                        return(produccion.ToString());
                    }
                    string aux = iterator.EnqNivelLoPosee(s, produccion);

                    produccion = Convert.ToInt32(aux) - 1;
                }
                return(produccion.ToString());
            }
            catch (Exception)
            {
                return("");

                throw;
            }
        }
Exemplo n.º 2
0
        int Get_No_SiguienteProduccionRepetida(int intllave, string palabra)
        {
            int resp = 1;

            int [] llaves = this.ContenidoProduccion.Keys.ToArray();
            foreach (int i in llaves)
            {
                ElementoProduccion iterator = this.ContenidoProduccion [i];
                if (iterator.Get_llave().ToLower().CompareTo(palabra) == 0 && intllave == i)
                {
                    return(resp);
                }
                resp = iterator.Calculador_de_nivelesV2(resp);

                resp++;
            }
            return(resp);
        }
Exemplo n.º 3
0
        void ArreglarContenido()
        {                                                            //metodo para arreglar el contenido
            int [] llaves = this.ContenidoProduccion.Keys.ToArray(); //copia de las llaves
            foreach (int i in llaves)
            {
                ElementoProduccion iterator = this.ContenidoProduccion [i];
                string             s        = iterator.Get_llave();
                if (s.CompareTo("<start>") == 0)
                {
                    keystart.Add(i);
                }
                else
                {
                    keynostart.Add(i);
                }
            }
            Dictionary <int, ElementoProduccion> nuevo = new Dictionary <int, ElementoProduccion>();
            List <int> temp1           = new List <int>();
            List <int> temp2           = new List <int>();
            int        llavesStar      = 1;                    //comienza a asignar desde 1 a las producciones que comeincen con start
            int        llaves_Sin_Star = keystart.Count() + 1; //contador de llaves sin <Start>, inician despues de contar cuantas producciones poseen start

            foreach (int i in llaves)
            {
                if (keystart.Contains(i))
                {
                    nuevo.Add(llavesStar, this.ContenidoProduccion [i]);
                    temp1.Add(llavesStar);
                    llavesStar++;
                }
                else
                {
                    nuevo.Add(llaves_Sin_Star, this.ContenidoProduccion [i]);
                    temp2.Add(llaves_Sin_Star);
                    llaves_Sin_Star++;
                }
            }
            this.ContenidoProduccion = nuevo;
            this.keystart.Clear();
            this.keynostart.Clear();
            this.keystart   = temp1; //se asignan las nuevas llaves a las listas de control
            this.keynostart = temp2; //para las que poseen las llaves de los que tienen start y los que no
        }
Exemplo n.º 4
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);
        }
Exemplo n.º 5
0
        public Dictionary <int, int> CalcularProducciones()
        {
            int [] llaves = this.ContenidoProduccion.Keys.ToArray();                        //contiene todo sobre las llaves, sin importar si es o no repetida
            Dictionary <int, string> datos                = new Dictionary <int, string>(); //no repetidos
            List <int>            intsubllaves            = new List <int>();               //llaves enteras de los elementos no repetidos
            List <int>            intLlavesDeLosRepetidos = new List <int>();               //llaves int de los repetidos
            List <string>         subllaves               = new List <string>();            //llaves de los elementos no repetidos
            List <string>         llavesStrdelosRepetidos = new List <string>();            //llaves de los repetidos
            Dictionary <int, int> RESPUESTA               = new Dictionary <int, int>();

            foreach (int item in llaves)
            {                                                       //se leen las producciones y se obtienen por separado las llaves de los no repetidos y de los repetidos, pero loas llaves <id> del diccionario
                ElementoProduccion iterator = this.ContenidoProduccion [item];
                string             s        = iterator.Get_llave(); //la llave que devuelve es el <id> en minusculas
                if (!datos.ContainsValue(s))
                {
                    datos.Add(item, s);
                    subllaves.Add(s);//datos incertados si aparecen almenos 1 vez
                    intsubllaves.Add(item);
                }
                else
                {
                    llavesStrdelosRepetidos.Add(s);
                    intLlavesDeLosRepetidos.Add(item);
                }
            }
            int c = 1;//lleva el conteo de la produccion

            //se calcula la siguiente produccion
            foreach (int item in llaves)
            {                                                       //volvemos a leer todas las producciones de la gramatica
                ElementoProduccion iterator = this.ContenidoProduccion [item];
                string             s        = iterator.Get_llave(); //la llave que devuelve es el <id> en minusculas
                if (llavesStrdelosRepetidos.Contains(s))            //si las tiene se procede a calcular como llave de los  repetidos
                {
                    string [] StrsRepetidos  = llavesStrdelosRepetidos.ToArray();
                    int []    llaverepetidas = intLlavesDeLosRepetidos.ToArray();
                    int       j       = 0;
                    bool      Inserto = false;
                    foreach (string strReps in StrsRepetidos)
                    {
                        if (strReps.CompareTo(s) == 0 && Inserto == false)
                        {
                            int V = this.Get_No_SiguienteProduccionRepetida(llaverepetidas [j], StrsRepetidos [j]);
                            if (iterator.Get_Cantidad_de_niveles() == 1)
                            {
                                RESPUESTA.Add(c, V);
                            }
                            else
                            {                                                                                                          //cuando tiene mas de un nivel
                                char      separador = Convert.ToChar(1333);
                                string [] r         = iterator.Get_SiguieteProduccionPara_repetidos(c, separador, V).Split(separador); //en el arreglo la ultima posicion es la del nivel actual
                                int       newnivel  = r.Length - 1;                                                                    //obtiene la posicion del nivel
                                int       contador  = 0;
                                c = Convert.ToInt32(r [newnivel]);
                                foreach (string ix in r)
                                {
                                    if (contador < r.Length && ix != "")
                                    {
                                        string [] s1 = r [contador].Split(' ');//primera pos es el nivel, siguiente es quien le toca
                                        if (s1.Length != 1)
                                        {
                                            RESPUESTA.Add(Convert.ToInt32(s1 [0]), Convert.ToInt32(s1 [1]));
                                        }
                                    }
                                    contador++;
                                }
                            }

                            llavesStrdelosRepetidos.Remove(StrsRepetidos [j]);//PARA QUE QUITE LOS REPETIDOS QUE YA UTILIZO
                            intLlavesDeLosRepetidos.Remove(llaverepetidas [j]);
                            Inserto = true;
                        }
                        j++;
                    }
                }
                else
                {
                    #region se calcula como llave de los no repetidos
                    if (iterator.Get_Cantidad_de_niveles() == 1)//si es una declarasion sin | y que no este repetida
                    {
                        RESPUESTA.Add(c, 0);
                    }
                    else
                    {                                                                                                          //es cuando nopesee almenos otro nivel y no se repite
                        char      separador = Convert.ToChar(1333);
                        string [] r         = iterator.Get_SiguieteProduccionPara_No_repetidos(c, separador).Split(separador); //en el arreglo la ultima posicion es la del nivel actual
                        int       newnivel  = r.Length - 1;                                                                    //obtiene la posicion del nivel
                        int       contador  = 0;
                        c = Convert.ToInt32(r [newnivel]);
                        foreach (string ix in r)
                        {
                            if (contador < r.Length && ix != "")
                            {
                                string [] s1 = r [contador].Split(' ');//primera pos es el nivel, siguiente es quien le toca
                                if (s1.Length != 1)
                                {
                                    RESPUESTA.Add(Convert.ToInt32(s1 [0]), Convert.ToInt32(s1 [1]));
                                }
                            }
                            contador++;
                        }
                    }
                    #endregion
                }
                c++;
            }
            return(RESPUESTA);
        }
Exemplo n.º 6
0
        public List <string> CalcularNT()
        {//metodo a corregir metodo a veces funciona a veces no
            int [] llaves = this.ContenidoProduccion.Keys.ToArray();
            Dictionary <int, string> datos      = new Dictionary <int, string>();
            List <string>            resp       = new List <string>();
            List <string>            pendientes = new List <string>();
            List <int> subllaves = new List <int>();

            foreach (int item in llaves)
            {
                ElementoProduccion iterator = this.ContenidoProduccion [item];
                string             s        = iterator.Get_llave();//la llave que devuelve es el <id> en minusculas
                if (!datos.ContainsValue(s))
                {
                    datos.Add(item, s);
                    subllaves.Add(item);
                }
            }
            Dictionary <string, List <string> > LISTAFIRST = this.CalcularFirst();

            foreach (int item in subllaves)
            {//se asignan a los que ya fueron instanciados en la gramatica en formato numero, no terminal, first, produccion
                List <string> first = LISTAFIRST [datos [item].ToString()];
                string        FIRST = firstDatos(first);
                string        s     = item.ToString() + '‡' + datos [item].ToString() + '‡' + FIRST + '‡' + " ";
                resp.Add(s);
            }
            int [] ar1           = subllaves.ToArray();
            int    subllaveError = -1;

            foreach (int i in ar1)
            {
                if (i > subllaveError)
                {
                    subllaveError = i;
                }
            }
            if (subllaveError < 0)
            {
                subllaveError = 0;
            }
            subllaveError++; //sieguiente llave para los pendientes o los de error, como los quiera ver uno
            foreach (string item in resp)
            {                //para obtener los <pendientes>, los que no se declararon con ->
                String []          r         = item.Split('‡');
                int                i         = Convert.ToInt32(r [0]);
                ElementoProduccion iterator  = this.ContenidoProduccion [i];
                List <string>      contenido = iterator.listagetcontenido();
                foreach (string x in contenido)
                {
                    bool b = (this.bRango(x));
                    if (b == true && datos.Values.Contains(x) == false && pendientes.Contains(x) == false)
                    {
                        pendientes.Add(x);
                    }
                }
            }
            String [] raux = pendientes.ToArray();
            int       c    = 0;

            foreach (string i in raux)
            {
                raux [c] = subllaveError.ToString() + '‡' + raux [c] + '‡' + " " + '‡' + "ERROR";
                subllaveError++;
                c++;
            }
            pendientes.Clear();
            pendientes = raux.ToList();
            c          = 1;
            //calular la produccion de los demas
            string [] subresp = resp.ToArray();
            int       icc     = 0;

            foreach (string st in subresp)     //dentro de un foreach para que lo haga con cada elemetno
            {
                string [] myr = st.Split('‡'); //
                myr [3]       = getnumeroProd(myr [1], c, llaves);
                subresp [icc] = myr [0] + '‡' + myr [1] + '‡' + myr [2] + '‡' + myr [3];
                Valores.Add(myr [1], Convert.ToInt32(myr [0]));
                icc++;
                c++;
            }
            //luego aca concatenar y retornar
            resp.Clear();
            resp = subresp.ToList();
            resp = this.OrdenarResp(resp);
            string [] pendientealfinal = pendientes.ToArray();
            foreach (string i in pendientealfinal)
            {
                string [] myr = i.Split('‡');
                Valores.Add(myr [1], Convert.ToInt32(myr [0]));
                resp.Add(i);
            }

            return(resp);
        }