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