added Element.toAtom()
authoradam <adam@megacz.com>
Mon, 2 Jan 2006 02:37:13 +0000 (21:37 -0500)
committeradam <adam@megacz.com>
Mon, 2 Jan 2006 02:37:13 +0000 (21:37 -0500)
darcs-hash:20060102023713-5007d-26080b7906673e77b89f10ae42fe09a8174fc89e.gz

src/edu/berkeley/sbp/Atom.java
src/edu/berkeley/sbp/Element.java
src/edu/berkeley/sbp/Sequence.java
src/edu/berkeley/sbp/Union.java

index 1b9c254..037dfaa 100644 (file)
@@ -16,6 +16,8 @@ public abstract class Atom<T extends Token> extends Element implements Topology<
 
     void reachable(HashSet<Sequence.Position> h) { /* do-nothing */ }
 
+    public Topology toAtom() { return dup(); }
+
     /** equality is based on the underlying <tt>Topology</tt> */
     public int hashCode() { return rt.hashCode(); }
     
index b199a23..5f55be6 100644 (file)
@@ -13,6 +13,7 @@ public abstract class Element {
     /** add all positions reachable from the start of this Element to @rp */
     abstract void reachable(HashSet<Sequence.Position> rp);
 
+    abstract Topology toAtom();
     Forest epsilonForm() { throw new Error("no epsilon form: " + this); }
     final boolean possiblyEpsilon(Walk.Cache cache)   {
         Boolean ret = cache==null ? null : cache.possiblyEpsilon.get(this);
index fcff530..9586f72 100644 (file)
@@ -35,6 +35,11 @@ public abstract class Sequence extends Element implements Iterable<Element> {
 
     ////////////////////////////////////////////////////////////////////////////////
 
+    Topology toAtom() {
+        if (elements.length!=1) return null;
+        return elements[0].toAtom();
+    }
+
     protected final Element[] elements;
 
     final HashSet<Sequence> needs;
index 1d4841f..7274dae 100644 (file)
@@ -18,6 +18,17 @@ public class Union extends Element implements Iterable<Sequence> {
 
     void reachable(HashSet<Sequence.Position> h) { for(Sequence s : alternatives) s.reachable(h); }
 
+    Topology toAtom() {
+        if (alternatives.size()==0) return null;
+        Topology ret = null;
+        for(Sequence s : this) {
+            Topology a = s.toAtom();
+            if (ret==null) ret = a.dup();
+            else           ret.add(a.dup());
+        }
+        return ret;
+    }
+
     /** adds an alternative */
     public void add(Sequence s) { alternatives.add(s); }