private void metodoSubConjuntos() { if (raiz != null) { Mover primero = new Mover(); primero.addEstado(raiz.Index); cerraduras.AddLast(makeCerradura(primero)); for (int k = 0; k < cerraduras.Count; k++) { Transicion transition = new Transicion(cerraduras.ElementAt(k).getNumEstado()); foreach (Nodo item in NonTerminals) { Mover temp = makeMove(cerraduras.ElementAt(k).getEstados(), item); if (temp != null) { if (temp.getEstados().Count > 0) { if (!mueves.Contains(temp)) { mueves.AddLast(temp); } Cerradura temporal = makeCerradura(temp); if (temporal != null) { if (temporal.getEstados().Count > 0) { if (!cerraduras.Contains(temporal)) { cerraduras.AddLast(temporal); } } } transition.addTransicion(new Destino(item.getDato(), temporal.getNumEstado())); } } } transicionesEstados.AddLast(transition); } foreach (Cerradura cer in cerraduras) { if (cer.isEstadoFinal()) { foreach (Transicion t in transicionesEstados) { if (cer.getNumEstado() == t.getEstado()) { t.isEstadoFinal(); } } } } } }
private Cerradura makeCerradura(Mover m) { contadorEstados++; encontrados = new ArrayList(); Nodo aux = raiz; Nodo aux2; Cerradura nueva = new Cerradura(contadorEstados); foreach (int i in m.getEstados()) { aux2 = findNode(aux, i); encontrados.Add(aux2); desVisitarTodo(aux2); nueva.setEstados(transicionesEpsilon(encontrados, aux2)); desVisitarTodo(aux2); nueva.ordenarEstados(); if (nueva.getEstados().Contains(lastNode)) { nueva.setEstadoFinal(); } desVisitarTodo(raiz); } for (int j = 0; j < cerraduras.Count; j++) { if (cerraduras.ElementAt(j).getEstados().Count == nueva.getEstados().Count) { bool iguales = true; foreach (Nodo n in cerraduras.ElementAt(j).getEstados()) { if (!nueva.getEstados().Contains(n)) { iguales = false; break; } } if (iguales) { contadorEstados--; return(cerraduras.ElementAt(j)); } } } return(nueva); }