X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FSequence.java;h=430f29813c37952956b6cf0762f4a4c03219840f;hp=eff94a47ecd7233f216a1adcfa7d3f10300a82f0;hb=260e46cff8995fb5a01e94c1a707d0ffff0a5382;hpb=93b9f1a57460257f71a4cef17419a723e294550d diff --git a/src/edu/berkeley/sbp/Sequence.java b/src/edu/berkeley/sbp/Sequence.java index eff94a4..430f298 100644 --- a/src/edu/berkeley/sbp/Sequence.java +++ b/src/edu/berkeley/sbp/Sequence.java @@ -127,9 +127,9 @@ public abstract class Sequence implements Iterable, SequenceOrElement { this.firstp = new Position(this, 0, null); } - abstract Forest epsilonForm(Input.Region loc, Grammar cache); + abstract Forest epsilonForm(Input.Region loc); - protected abstract Forest postReduce(Input.Region loc, Forest[] args, Pos p); + protected abstract Forest postReduce(Input.Region loc, Forest[] args, Position p); // Position ////////////////////////////////////////////////////////////////////////////// @@ -137,11 +137,16 @@ public abstract class Sequence implements Iterable, SequenceOrElement { static abstract class Pos implements IntegerMappable, Comparable, Serializable { public int ord = -1; + private transient 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,11 +159,13 @@ 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(); - public abstract Forest rewrite(Input.Region loc, Grammar cache); + public abstract Forest rewrite(Input.Region loc); } /** the imaginary position before or after an element of a sequence; corresponds to an "LR item" */ @@ -171,18 +178,15 @@ public abstract class Sequence implements Iterable, SequenceOrElement { public int[] hates(); public boolean owner_needed_or_hated(); public int numPops(); - public Forest rewrite(Input.Region loc, Grammar cache) + public Forest rewrite(Input.Region loc) }; } */ - public int ord = -1; - public int ord() { return ord; } public int numPops() { return pos; } 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(); } @@ -190,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; @@ -207,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; } @@ -220,14 +220,14 @@ public abstract class Sequence implements Iterable, SequenceOrElement { // Position ///////////////////////////////////////////////////////////////////////////////// - public final Forest rewrite(Input.Region loc, Grammar cache) { - if (this==firstp()) epsilonForm(loc, cache); + public final Forest rewrite(Input.Region loc) { + if (isFirst()) return owner().epsilonForm(loc); for(int i=0; i, SequenceOrElement { return sb; } - // Specialized Subclasses ////////////////////////////////////////////////////////////////////////////// static class Singleton extends Sequence { @@ -281,8 +280,8 @@ public abstract class Sequence implements Iterable, SequenceOrElement { public Singleton(Element[] e, int idx) { super(e); this.idx = idx; } 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, Grammar cache) { - return ((Union)elements[idx]).epsilonForm(loc, cache); + Forest epsilonForm(Input.Region loc) { + return ((Union)elements[idx]).epsilonForm(loc); } } @@ -321,7 +320,7 @@ public abstract class Sequence implements Iterable, SequenceOrElement { if (spacing) for(int i=0; i<50-len; i++) sb.append(' '); return sb; } - Forest epsilonForm(Input.Region loc, Grammar cache) { + Forest epsilonForm(Input.Region loc) { return Forest.create(loc, tag, new Forest[0], lifts); } }