/** * Adds a transition * @param condition * @param to * @return */ public Transition<NFAState<T>> addTransition(Range condition, NFAState<T> to) { Transition<NFAState<T>> t = new Transition<>(condition, this, to); Set<Transition<NFAState<T>>> set = transitions.get(t.getCondition()); if (set == null) { set = new HashSet<>(); transitions.put(t.getCondition(), set); } set.add(t); edges.add(to); to.inStates.add(this); return t; } /**
/** * Adds a new transition * @param condition * @param to */ void addTransition(Range condition, DFAState<T> to) { Transition<DFAState<T>> t = new Transition<>(condition, this, to); t = transitions.put(t.getCondition(), t); assert t == null; edges.add(to); to.inStates.add(this); } /**
/** * Return true if one of transition ranges is a boundary match. * @return */ public boolean hasBoundaryMatches() { for (Transition<DFAState<T>> t : transitions.values()) { Range range = t.getCondition(); if (range.getFrom() < 0) { return true; } } return false; } /**
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'); } } }
/** * Calculates a value of how selective transitions are from this state. * Returns 1 if all ranges accept exactly one character. Greater number * means less selectivity * @return */ public int getTransitionSelectivity() { int count = 0; for (Transition<DFAState<T>> t : transitions.values()) { Range range = t.getCondition(); count += range.getTo()-range.getFrom(); } return count/transitions.size(); } /**
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())); } } }
/** * 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); } } } /**
prefix.addLast(t.getCondition()); findSkip(t.getTo(),indexOf, stack, prefix); prefix.removeLast();
depth.put(state, Math.max(depth.get(state), depth.get(t.getTo())+t.getCondition().getLength()));
int s = minDepth(t.getTo(),indexOf, stack, depth+t.getCondition().getLength()); if (nskip == -1)
set.add(state); Transition<DFAState<T>> tr = state.getTransitions().iterator().next(); Range condition = tr.getCondition(); int repeat = 1; DFAState<T> to = tr.getTo(); condition.equals(totr.getCondition()) && !set.contains(totr.getTo())
for (Transition<NFAState> tr : firstOfFixedEnder) rs4.add(tr.getCondition());
Range range = tr.getCondition(); DFAState to = s.transit(range); tload("reader"); tload("cc"); iflt("eof"); Range range = first.getCondition(); DFAState to = s.transit(range); compile(range, "error", !ti.hasNext()); Range range = tr.getCondition(); DFAState to = s.transit(range); String next = s.toString()+"-"+range+">"+to.toString(); for (Transition tr : s.getTransitions()) Range range = tr.getCondition(); if (range.getFrom() >= 0) for (Transition tr : s.getTransitions()) Range range = tr.getCondition(); DFAState<T> to = s.transit(range); String target = s.toString()+"-"+range+">"+to.toString();