From b9228a7c1bd98e514e6a5c0483c2e539ee777992 Mon Sep 17 00:00:00 2001 From: adam Date: Mon, 26 Mar 2007 01:46:12 -0400 Subject: [PATCH] Union: many cleanups darcs-hash:20070326054612-5007d-14dd73800a517a4e412930f61efa0a3b3daff044.gz --- src/edu/berkeley/sbp/Union.java | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/src/edu/berkeley/sbp/Union.java b/src/edu/berkeley/sbp/Union.java index 94c1fc9..1843a46 100644 --- a/src/edu/berkeley/sbp/Union.java +++ b/src/edu/berkeley/sbp/Union.java @@ -54,14 +54,17 @@ public class Union extends Element implements Iterable { } /** adds an alternative */ - public void add(Sequence s) { - /* - FIXME + public Union add(Sequence s) { if (viewed) - throw new RuntimeException("attempt to add a Sequence to a Union that has already been examined:\n "+this); - */ - if (alternatives.contains(s)) return; + throw new RuntimeException("once Union.contains() or Union.iterator() has been invoked, "+ + "you may not add any more Sequences to it\n "+ + " union in question: " + this); + if (s.needed_or_hated) + throw new RuntimeException("you may not add a conjunct directly to a Union"); + s.in_a_union = true; + if (alternatives.contains(s)) return this; alternatives.add(s); + return this; } /** adds a one-element sequence */ @@ -72,16 +75,16 @@ public class Union extends Element implements Iterable { // Epsilon Form ////////////////////////////////////////////////////////////////////////////// - // FIXME - //private Forest.Many epsilonForm = null; + private Forest.Many epsilonForm = null; Forest epsilonForm(Input.Region loc) { - //if (epsilonForm != null) return epsilonForm; + // FIXME: this is pretty ugly... + viewed = true; + if (epsilonForm != null) return epsilonForm; Forest.Many epsilonForm = new Forest.Many(); - for(Sequence s : this) { - // FIXME FIXME FIXME - if (new Walk.Cache().possiblyEpsilon(s)) + Cache cache = new Cache(null, null); + for(Sequence s : this) + if (cache.possiblyEpsilon(s)) epsilonForm.merge(s.epsilonForm(loc)); - } return epsilonForm; } @@ -92,7 +95,8 @@ public class Union extends Element implements Iterable { String getName() { return name==null ? "(anon_union)" : name; } public String toString() { - viewed = true; + // technically this should be turned on, but we don't make a big deal + //viewed = true; if (name != null) return name; StringBuffer sb = new StringBuffer(); sb.append("("); @@ -103,7 +107,8 @@ public class Union extends Element implements Iterable { /** display this union in long/expanded form */ public StringBuffer toString(StringBuffer sb) { - viewed = true; + // technically this should be turned on, but we don't make a big deal + //viewed = true; if (synthetic) return sb; boolean first = true; String before = StringUtil.pad(15, getName()) + " = "; -- 1.7.10.4