X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FParser.java;h=e707eacd3f15916dba84ea30fcc2ae41d354aa09;hp=6986a4b900de9f22a9fe3416159d17eac25d684d;hb=84a4a8204373b996105e69edf91d2f9fae7b4bcb;hpb=242a8711e98cbd3ed6d05271bf910fde38e9be9a diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index 6986a4b..e707eac 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -13,6 +13,17 @@ public class Parser { private final Table pt; + private static void reachable(Element e, HashSet h) { + if (e instanceof Atom) return; + for(Sequence s : ((Union)e)) + reachable(s.firstp(), h); + } + private static void reachable(Position p, HashSet h) { + if (h.contains(p)) return; + h.add(p); + if (p.element() != null) reachable(p.element(), h); + } + //public Parser( Topology top) { this(new Table( top)); } //public Parser(String s, Topology top) { this(new Table(s, top)); } @@ -80,7 +91,7 @@ public class Parser { public HashSet closure() { HashSet hp = new HashSet(); - start0.reachable(hp); + reachable(start0, hp); return hp; } public Position firstPosition() { return start0seq.firstp(); } @@ -223,7 +234,7 @@ public class Parser { if (position.isLast() || !(position.element() instanceof Atom)) continue; Atom a = (Atom)position.element(); HashSet hp = new HashSet(); - position.next().reachable(hp); + reachable(position.next(), hp); bag0.addAll(a.dup(), /*clo.walk()*/hp); } @@ -262,7 +273,7 @@ public class Parser { if (ys != null) { for(Element y : ys) { HashSet hp = new HashSet(); - p.next().reachable(hp); + reachable(p.next(), hp); move.addAll(y, hp); } }