Example #1
0
  /**
   * Aplica el algoritmo de construcción de subconjunto para obtener a partir de un AFN su AFD
   * equivalente.
   *
   * @param afn
   * @return
   */
  public AFD build(AFN afn) {
    automata.setProduction(afn.getProduction());
    // Calculamos la cerradura ε para el estado inicial.
    Cerradura cerraduraInicial =
        new Cerradura(0, afn.getInitState(), buildCerradura(afn.getInitState()));
    cerraduras.add(cerraduraInicial);

    // Mientras existan cerraduras sin procesar.
    while (isProcess()) {
      // Hallamos el subconjunto para cada simbolo
      for (String symbol : afn.getSymbols()) {
        if (!symbol.equals(ε)) {
          List<Estado> states = new ArrayList<>();
          for (Estado state : next().getEstadosAcanzables()) {

            merge(states, buildSubconjuntoBySymbol(state, symbol, new ArrayList<Estado>()));
          }
          next().addSubconjunto(symbol, states);
        }
      }
      // Para cada subconjunto calculamos la cerradura
      for (pol.una.py.model.lexico.Cerradura.Subconjunto subconjunto : next().getSubconjuntos()) {
        if (!subconjunto.getStates().isEmpty()) {
          addCerradura(subconjunto.getStates(), buildCerradura(subconjunto.getStates()));
        }
      }
      // Finalizamos el proceso de la cerradura actual.
      next().setProcess(true);
    }

    return buildAFD();
  }