if (hs.contains(e)) return;
hs.add(e);
if (e instanceof Atom) return;
- for(Sequence s : (Union)e) {
- hs.add(s);
- for(Position p = s.firstp(); p != null; p = p.next())
- walk(p.element(), hs);
- }
+ for(Sequence s : (Union)e)
+ walk(s, hs);
+ }
+ private void walk(Sequence s, HashSet<Element> hs) {
+ hs.add(s);
+ for(Position p = s.firstp(); p != null; p = p.next())
+ walk(p.element(), hs);
+ for(Sequence ss : s.needs()) walk(ss, hs);
+ for(Sequence ss : s.hates()) walk(ss, hs);
}
/** the start state */
// Helpers //////////////////////////////////////////////////////////////////////////////
+ private static void reachable(Sequence s, HashSet<Position> h) {
+ reachable(s.firstp(), h);
+ for(Sequence ss : s.needs()) reachable(ss, h);
+ for(Sequence ss : s.hates()) reachable(ss, h);
+ }
private static void reachable(Element e, HashSet<Position> h) {
if (e instanceof Atom) return;
for(Sequence s : ((Union)e))
- reachable(s.firstp(), h);
+ reachable(s, h);
}
private static void reachable(Position p, HashSet<Position> h) {
if (h.contains(p)) return;