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