X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FUnion.java;h=8780d9ea02df515179df4827dc41658897cc3681;hp=7370a6834307c40a3e70dc98017120274475d071;hb=96a2822a729e563a64173f22dc184bc972a200ef;hpb=77d1e5fd29be1ca529e71a4c011f5edea61588e8 diff --git a/src/edu/berkeley/sbp/Union.java b/src/edu/berkeley/sbp/Union.java index 7370a68..8780d9e 100644 --- a/src/edu/berkeley/sbp/Union.java +++ b/src/edu/berkeley/sbp/Union.java @@ -16,7 +16,17 @@ public class Union extends Element implements Iterable { public Iterator iterator() { return alternatives.iterator(); } - void reachable(HashSet h) { for(Sequence s : alternatives) s.reachable(h); } + Topology toAtom() { + if (alternatives.size()==0) throw new RuntimeException("cannot build an Atom from a Union with no productions"); + Topology ret = null; + for(Sequence s : this) { + Topology a = s.toAtom(); + if (ret==null) ret = a; + else ret = ret.union(a); + } + if (ret==null) throw new RuntimeException("confusion on " + this); + return ret; + } /** adds an alternative */ public void add(Sequence s) { alternatives.add(s); } @@ -36,6 +46,9 @@ public class Union extends Element implements Iterable { this.synthetic = synthetic; } + public static Union epsilon = new Union("()"); + static { epsilon.add(Sequence.empty); } + private Forest.Ref epsilonForm = null; Forest epsilonForm() { if (epsilonForm != null) return epsilonForm;