/** * Returns next DFAState<T> for given condition or null if no transition exist * @param condition * @return */ public DFAState<T> transit(Range condition) { Transition<DFAState<T>> t = transitions.get(condition); if (t != null) { return t.getTo(); } return null; } /**
void removeTransitionsFromAcceptImmediatelyStates() { if (acceptImmediately) { for (Transition<DFAState<T>> tr : transitions.values()) { DFAState<T> to = tr.getTo(); edges.remove(to); to.inStates.remove(this); } transitions.clear(); } }
/** * Returns true if this state is not accepting and doesn't have any outbound * transitions. * @param nfaSet * @return */ boolean isDeadEnd(Set<NFAState<T>> nfaSet) { for (Set<Transition<NFAState<T>>> set : transitions.values()) { for (Transition<NFAState<T>> t : set) { if (!nfaSet.contains(t.getTo())) { return false; } } } return true; } /**
/** * Returns a set of NFAState<T>s to where a non epsilon transition exists * @return */ public Set<NFAState<T>> getNonEpsilonDestinations() { Set<NFAState<T>> set = new HashSet<>(); for (Range range : transitions.keySet()) { if (range != null) { Set<Transition<NFAState<T>>> set2 = transitions.get(range); for (Transition<NFAState<T>> tr : set2) { set.add(tr.getTo()); } } } return set; } public void removeAllNonEpsilonConditionsTo(NFAState<T> state)
/** * Removes transition to states that doesn't contain any outbound transition * and that are not accepting states */ void removeDeadEndTransitions() { Iterator<Range> it = transitions.keySet().iterator(); while (it.hasNext()) { Range r = it.next(); if (transitions.get(r).getTo().isDeadEnd()) { it.remove(); } } } /**
/** * Returns next DFAState<T> for given input or null if no transition exist * @param input * @return */ public DFAState<T> transit(int input) { for (Map.Entry<Range, Transition<DFAState<T>>> e : transitions.entrySet()) { Range r = e.getKey(); if (r.accept(input)) { return e.getValue().getTo(); } } return null; } /**
Set<NFAState<T>> transit(Range condition) { Set<NFAState<T>> set = new HashSet<>(); for (Range r : transitions.keySet()) { if ( (condition == null && r == null) || (r != null && r.contains(condition)) ) { Set<Transition<NFAState<T>>> s = transitions.get(r); for (Transition<NFAState<T>> t : s) { set.add(t.getTo()); } } } return set; } /**
public void removeAllNonEpsilonConditionsTo(NFAState<T> state) { for (Range range : transitions.keySet()) { if (range != null) { Set<Transition<NFAState<T>>> set2 = transitions.get(range); for (Transition<NFAState<T>> tr : set2) { if (state.equals(tr.getTo())) { set2.remove(tr); } } } } } /**
public void dump(Appendable p) throws IOException { for (NFAState<T> s : this) { for (Set<Transition<NFAState<T>>> set : s.getTransitions()) { for (Transition<NFAState<T>> t : set) p.append(s+"-"+t.getCondition()+">"+t.getTo()).append('\n'); } } }
/** * Returns true if state doesn't contain any outbound transition * and is not accepting state * @return */ boolean isDeadEnd() { if (isAccepting()) { return false; } for (Transition<DFAState<T>> next : transitions.values()) { if (next.getTo() != this) { return false; } } return true; } /**
/** * Returns true if transition with condition to state exists * @param condition * @param state * @return */ public boolean hasTransitionTo(Range condition, NFAState<T> state) { Set<Transition<NFAState<T>>> set = transitions.get(condition); if (set != null) { for (Transition<NFAState<T>> tr : set) { if (state.equals(tr.getTo())) { return true; } } } return false; } public RangeSet getNonEpsilonConditions()
/** * Construct a new nfa state by cloning other state as well as all connected * states. * @param other * @param map */ NFAState(Scope<NFAState<T>> scope, NFAState<T> other, Map<NFAState<T>,NFAState<T>> map) { super(scope, other); map.put(other, this); for (Range r : other.transitions.keySet()) { Set<Transition<NFAState<T>>> s = other.transitions.get(r); for (Transition<NFAState<T>> t : s) { NFAState<T> to = map.get(t.getTo()); if (to == null) { to = new NFAState<>(scope, t.getTo(), map); } addTransition(r, to); } } } public boolean isAcceptImmediately()
for (Transition<NFAState<T>> tr : s) if (state.equals(tr.getTo()))
/** * Optimizes transition by merging ranges */ void optimizeTransitions() { HashMap<DFAState<T>,RangeSet> hml = new HashMap<>(); for (Transition<DFAState<T>> t : transitions.values()) { RangeSet rs = hml.get(t.getTo()); if (rs == null) { rs = new RangeSet(); hml.put(t.getTo(), rs); } rs.add(t.getCondition()); } transitions.clear(); for (DFAState<T> dfa : hml.keySet()) { RangeSet rs = RangeSet.merge(hml.get(dfa)); for (Range r : rs) { addTransition(r, dfa); } } } /**
public RangeSet getNonEpsilonConditionsTo(NFAState<T> state) { RangeSet rs = new RangeSet(); for (Range range : transitions.keySet()) { if (range != null) { Set<Transition<NFAState<T>>> set2 = transitions.get(range); for (Transition<NFAState<T>> tr : set2) { if (state.equals(tr.getTo())) { rs.add(range); } } } } return rs; } /**
public void dump(PrintStream p) { for (DFAState<T> s : this) { for (Transition<DFAState<T>> t : s.getTransitions()) { p.println(stateDump(s)+"-"+t.getCondition()+">"+stateDump(t.getTo())); } } }
/** * Returns non epsilon confitions to transit to given state * @param state * @return */ public RangeSet getConditionsTo(NFAState<T> state) { RangeSet rs = new RangeSet(); for (Range range : transitions.keySet()) { if (range != null) { Set<Transition<NFAState<T>>> set2 = transitions.get(range); for (Transition<NFAState<T>> tr : set2) { if (state.equals(tr.getTo())) { rs.add(range); } } } } return rs; } /**