X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FSequence.java;h=ac34264b3a527fe16c9fb6790ab802e4aab2840d;hb=f7f669e438822dd46922e3d3b1c880fdec998a9b;hp=adf93fa64d35b8c645d7e3c72928f8585fdf2e03;hpb=21c2c8445fd1d0c6ed630a2ecb259ddd9712c750;p=sbp.git diff --git a/src/edu/berkeley/sbp/Sequence.java b/src/edu/berkeley/sbp/Sequence.java index adf93fa..ac34264 100644 --- a/src/edu/berkeley/sbp/Sequence.java +++ b/src/edu/berkeley/sbp/Sequence.java @@ -87,7 +87,15 @@ public abstract class Sequence extends Element implements Iterable { // Position ////////////////////////////////////////////////////////////////////////////// /** the imaginary position before or after an element of a sequence; corresponds to an "LR item" */ - public class Position { + public class Position implements IntegerMappable { + + private Forest zero = null; + public Forest zero() { + if (zero != null) return zero; + if (pos > 0) throw new Error(); + return zero = rewrite(null); + } + final int pos; private final Position next; @@ -100,11 +108,6 @@ public abstract class Sequence extends Element implements Iterable { } boolean isFirst() { return pos==0; } - boolean isRightNullable(Walk.Cache cache) { - if (isLast()) return true; - if (!element().possiblyEpsilon(cache)) return false; - return next().isRightNullable(cache); - } /** the element immediately after this Position, or null if this is the last Position */ public Element element() { return pos>=elements.length ? null : elements[pos]; } @@ -118,7 +121,7 @@ public abstract class Sequence extends Element implements Iterable { /** true iff this Position is the last one in the sequence */ public boolean isLast() { return next()==null; } - // Reduction ///////////////////////////////////////////////////////////////////////////////// + // Position ///////////////////////////////////////////////////////////////////////////////// final Forest rewrite(Token.Location loc) { if (this==firstp()) return epsilonForm(); @@ -142,14 +145,16 @@ public abstract class Sequence extends Element implements Iterable { for(Position p = Sequence.this.firstp(); p != null; p = p.next()) { ret.append(' '); if (p==this) ret.append(" | "); - if (p.element()!=null) ret.append(p.element().possiblyEpsilon(null) ? "["+p.element()+"]" : p.element()); + if (p.element()!=null) ret.append(p.element()); else ret.append(' '); } ret.append("}>"); return ret.toString(); } + private final int idx = master_position_idx++; + public int toInt() { return idx; } } - + private static int master_position_idx = 0; // toString //////////////////////////////////////////////////////////////////////////////