/* * JFLAP - Formal Languages and Automata Package * * * Susan H. Rodger * Computer Science Department * Duke University * August 27, 2009 * Copyright (c) 2002-2009 * All rights reserved. * JFLAP is open source software. Please see the LICENSE for terms. * */ package automata; import java.util.*; /** * The closure taker object can be used to take the closure of states in an * automaton. * * @author Ryan Cavalcante, Henry Qin */ public class ClosureTaker { /** * There is no reason for this class to ever be constructed. */ private ClosureTaker() { } /** * Returns the closure of state, that is, all states * reachable from state without changing any internal state * (e.g. stack, tape, input) via lambda transitions. * * @param state * the state whose closure is being taken. * @param automaton * the automaton * @return the set of states that represent the closure of state. */ public static State[] getClosure(State state, Automaton automaton) { List list = new ArrayList(); list.add(state); for (int i = 0; i < list.size(); i++) { state = (State) list.get(i); Transition transitions[] = automaton.getTransitionsFromState(state); for (int k = 0; k < transitions.length; k++) { Transition transition = transitions[k]; LambdaTransitionChecker checker = LambdaCheckerFactory .getLambdaChecker(automaton); /** if lambda transition */ if (checker.isLambdaTransition(transition)) { State toState = transition.getToState(); if (!list.contains(toState)) { list.add(toState); } } } } return (State[]) list.toArray(new State[0]); } }