X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FUnion.java;h=8f3ea2e428b6cbc8f1cc3da0d9cc6b7b7b6bb14c;hp=d52c6e96209c53ebffa76640995dc33e126635b0;hb=HEAD;hpb=2c1c0293545f3d12c23220fd05c663e6aa3f3de1 diff --git a/src/edu/berkeley/sbp/Union.java b/src/edu/berkeley/sbp/Union.java index d52c6e9..8f3ea2e 100644 --- a/src/edu/berkeley/sbp/Union.java +++ b/src/edu/berkeley/sbp/Union.java @@ -1,3 +1,5 @@ +// Copyright 2006-2007 all rights reserved; see LICENSE file for BSD-style license + package edu.berkeley.sbp; import edu.berkeley.sbp.util.*; import edu.berkeley.sbp.*; @@ -17,13 +19,15 @@ import java.lang.ref.*; */ public class Union extends Element implements Iterable { - private final String name; + private final String name; private final boolean synthetic; private boolean viewed = false; private final List alternatives = new ArrayList(); public Union(String name) { this(name, false); } + public Union(String name, Sequence s) { this(name, s, false); } + public Union(String name, Sequence s, boolean synthetic) { this(name, synthetic); add(s); } /** * Since every cycle in a non-degenerate grammar contains at @@ -51,14 +55,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 */ @@ -66,31 +73,25 @@ public class Union extends Element implements Iterable { add(Sequence.create(e)); } - - // Epsilon Form ////////////////////////////////////////////////////////////////////////////// - - // FIXME - private Forest.Many epsilonForm = null; - Forest epsilonForm() { - if (epsilonForm != null) return epsilonForm; - epsilonForm = new Forest.Many(); - for(Sequence s : this) { - // FIXME FIXME FIXME - if (new Walk.Cache().possiblyEpsilon(s)) - epsilonForm.merge(s.epsilonForm()); - } + /** the Forest which results from matching this Union against the empty string at region region */ + Forest epsilonForm(Input.Region region) { + viewed = true; + Forest.Many epsilonForm = new Forest.Many(); + for(Sequence s : this) + if (Element.possiblyEpsilon(s)) + epsilonForm.merge(s.epsilonForm(region)); return epsilonForm; } // Display ////////////////////////////////////////////////////////////////////////////// - public String getName() { - if (name != null) return name; - return "(anon_union)"; - } + boolean isSynthetic() { return synthetic; } + 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("("); @@ -101,7 +102,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()) + " = ";