X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FSequence.java;h=d0c3dfd7c63345f4028abcd7a555b3d5199b913c;hp=f63c30a918bd696c5f88e1a746cec23c9c5d7808;hb=bbb16d2522ed587238fd7a69e346d5e5e8f2551a;hpb=61566402d83d5c06d57fb850e60ca0f82c27b9a2 diff --git a/src/edu/berkeley/sbp/Sequence.java b/src/edu/berkeley/sbp/Sequence.java index f63c30a..d0c3dfd 100644 --- a/src/edu/berkeley/sbp/Sequence.java +++ b/src/edu/berkeley/sbp/Sequence.java @@ -10,9 +10,9 @@ import java.lang.reflect.*; import java.lang.ref.*; /** juxtaposition; zero or more adjacent Elements; can specify a rewriting */ -public abstract class Sequence implements Iterable, SequenceOrElement { +public abstract class Sequence implements Iterable, SequenceOrElement, Serializable { - protected final Element[] elements; + protected transient final Element[] elements; boolean needed_or_hated = false; boolean in_a_union = false; @@ -26,7 +26,7 @@ public abstract class Sequence implements Iterable, SequenceOrElement { final Position firstp; - Atom follow = null; + transient Atom follow = null; private static int global_sernum = 0; private int sernum = global_sernum++; @@ -137,11 +137,16 @@ public abstract class Sequence implements Iterable, SequenceOrElement { static abstract class Pos implements IntegerMappable, Comparable, Serializable { public int ord = -1; + private Sequence owner; + public int ord() { return ord; } final Forest[] holder; - Pos(int len) { this.holder = new Forest[len]; } + Pos(int len, Sequence owner) { + this.owner = owner; + this.holder = new Forest[len]; + } public abstract int provides(); public abstract int[] needs(); @@ -154,7 +159,9 @@ public abstract class Sequence implements Iterable, SequenceOrElement { public abstract Pos prev(); public abstract Pos next(); - abstract Sequence owner(); + /** the element which produces the sequence to which this Position belongs */ + public Sequence owner() { return owner; } + abstract Element element(); public abstract int numPops(); @@ -180,7 +187,6 @@ public abstract class Sequence implements Iterable, SequenceOrElement { final int pos; private final Position next; private final Position prev; - private transient Sequence owner; public int provides() { return owner().sernum; } public int[] needs() { return owner().needs_int(); } @@ -188,8 +194,7 @@ public abstract class Sequence implements Iterable, SequenceOrElement { public boolean owner_needed_or_hated() { return owner().needed_or_hated; } private Position(Sequence owner, int pos, Position prev) { - super(owner.elements.length); - this.owner = owner; + super(owner.elements.length,owner); this.pos = pos; this.next = pos==owner.elements.length ? null : new Position(owner, pos+1, this); this.prev = prev; @@ -205,9 +210,6 @@ public abstract class Sequence implements Iterable, SequenceOrElement { /** the element immediately after this Position, or null if this is the last Position */ public Element element() { return pos>=owner().elements.length ? null : owner().elements[pos]; } - /** the element which produces the sequence to which this Position belongs */ - public Sequence owner() { return owner; } - /** the next Position (the Position after this.element()) */ public Position next() { return next; } @@ -219,10 +221,14 @@ public abstract class Sequence implements Iterable, SequenceOrElement { // Position ///////////////////////////////////////////////////////////////////////////////// public final Forest rewrite(Input.Region loc) { - if (isFirst()) owner().epsilonForm(loc); + if (isFirst()) return owner().epsilonForm(loc); for(int i=0; i, SequenceOrElement { public Forest postReduce(Input.Region loc, Forest[] args, Position p) { return args[idx]; } Sequence _clone() { return new Singleton(elements,idx); } Forest epsilonForm(Input.Region loc) { + if (elements==null) return new Forest.Many(); /* FIXME */ return ((Union)elements[idx]).epsilonForm(loc); } }