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; }
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(); }
public Estado(List<Produccion> listProd, int id): this(id) { Produccion prodAux; foreach (Produccion p in listProd) { prodAux = new Produccion(p); this.init(prodAux); } }
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 } } }
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 } } }
/// <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); } }
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); } } } }
public Estado(Produccion p, int id):this(id) { Produccion prodAux = new Produccion(p); this.init(prodAux); }
/// <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); } }
public Estado(Produccion p, int id) : this(id) { Produccion prodAux = new Produccion(p); this.init(prodAux); }
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); } } } }