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); }
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); }
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); }