X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FUnion.java;h=ea2e2db4d21eb7e52a67fc0aa24b285bbdff91e1;hb=526da96dd06e152d194ec92c9ef9df6085a1251b;hp=1d4841ff718c4aaf272a0bf83902218605458fde;hpb=2f167f63aff4b6da4d82669faf2c7ada4c93be4b;p=sbp.git diff --git a/src/edu/berkeley/sbp/Union.java b/src/edu/berkeley/sbp/Union.java index 1d4841f..ea2e2db 100644 --- a/src/edu/berkeley/sbp/Union.java +++ b/src/edu/berkeley/sbp/Union.java @@ -15,11 +15,28 @@ public class Union extends Element implements Iterable { private final List alternatives = new ArrayList(); public Iterator iterator() { return alternatives.iterator(); } + public boolean contains(Sequence s) { return alternatives.contains(s); } - 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); } + public void add(Sequence s) { + alternatives.add(s); + if (/*!synthetic &&*/ shortForm!=null + && Character.isUpperCase(shortForm.charAt(0)) + ) + s.setName(toString()); + } /** * Since every cycle in a non-degenerate grammar contains at