예제 #1
0
  /**
   * Contruye el AFD equivalente
   *
   * @return <b>AFD</b> Automata finito equivalente al AFN recibido
   */
  private AFD buildAFD() {
    for (Cerradura cerradura : cerraduras) {
      Estado origen = getState(cerradura);
      Estado destino = null;

      for (pol.una.py.model.lexico.Cerradura.Subconjunto conjunto : cerradura.getSubconjuntos()) {
        String codigoUnico = conjunto.getCodCerradura();
        // Conjunto vacio
        if (codigoUnico.equals("{}")) {
          destino = getStateError();
        } else {
          destino = getState(getCerradura(codigoUnico));
        }
        origen.addTransition(new Transicion(origen, destino, conjunto.getSymbol()));
      }
      automata.addEstado(origen);
    }
    // Puede darse el caso de que el estado inicial del AFN no sea mas un
    // estado inicial, sino un estado de aceptacion. Si no es un estado de
    // aceptacion, indicamos que es el estado inicial.
    if (!automata.getInitState().isAcceptation()) {
      automata.getInitState().setInit(true);
    }
    return automata;
  }
예제 #2
0
 /**
  * Verifica si un estado en particular se encuentra en una lista de estados.
  *
  * @param state Estado a analizar.
  * @param states Lista de estados
  * @return <b>true</b> Si el estado ya se encuentra en la lista.</br> <b>false</b> Si el estado no
  *     se encuentra en la lista.
  */
 private boolean contain(Estado state, List<Estado> states) {
   for (Estado valid : states) {
     if (valid.getValue() == state.getValue()) {
       return true;
     }
   }
   return false;
 }
예제 #3
0
 /**
  * Verifica si el aumata ya posee un estado de error y si no lo tiene crea un estado de error y lo
  * retorna.
  *
  * @return
  */
 private Estado getStateError() {
   Estado state = null;
   if (!automata.containState(cerraduras.size())) {
     state = new Estado(cerraduras.size());
     state.setError(true);
     automata.addEstado(state);
   } else {
     state = automata.getState(cerraduras.size());
   }
   return state;
 }
예제 #4
0
 /**
  * Obtiene el estado relacionado a la cerradura, esto es, si el estado ya se encuentra en el
  * automata retorna dicho estado, caso contrario crea un nuevo estado.
  *
  * @param cerradura Cerradura de la cual se desea obtener el estado asociado.
  * @return Estado asociado a la cerradura
  */
 private Estado getState(Cerradura cerradura) {
   Estado state = null;
   // Si el estado aun no esta en el automata
   if (!automata.containState(cerradura.getValue())) {
     state = new Estado(cerradura.getValue());
     state.setAcceptation(cerradura.isAcceptation());
     state.setInit(cerradura.isInit());
   } else {
     // Si el estado ya esta en el automata
     state = automata.getState(cerradura.getValue());
   }
   return state;
 }
예제 #5
0
 /**
  * Obtiene los estados alcanzables desde un estado en particular con transiciones ε.
  *
  * @param state Estado inicial
  * @param states Lista de estados alcanzables
  */
 private List<Estado> getEstadosAlcanzables(Estado state, List<Estado> states) {
   for (Transicion transicion : state.getTransitions()) {
     if (transicion.getSymbol().equals(ε)) {
       states.add(transicion.getDestination());
       getEstadosAlcanzables(transicion.getDestination(), states);
     }
   }
   return states;
 }
예제 #6
0
  /**
   * Obtiene los estados alcanzables desde un estado con transiciones ε y un símbolo en particular.
   *
   * @param state Estado inicial
   * @param symbol Transicion
   * @param states Lista de estados alcanzables
   */
  public List<Estado> buildSubconjuntoBySymbol(Estado state, String symbol, List<Estado> states) {
    for (Transicion transition : state.getTransitions()) {
      if (transition.getSymbol().equals(ε)) {
        buildSubconjuntoBySymbol(transition.getDestination(), symbol, states);
      } else {
        if (transition.getSymbol().equals(symbol)) {

          states.add(transition.getDestination());
        }
      }
    }
    return states;
  }