X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FParser.java;h=b4ac23a0a3285023df34427c262e921a9411e241;hb=cd979dfc5968a185c12d6eedc2aa688ef4b0f8b8;hp=24f8410d0d5f521a19cc47b2091dc65b69d447b1;hpb=37d28a2fa4ecc9534ca03827c23fdb493af79645;p=sbp.git diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index 24f8410..b4ac23a 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -32,8 +32,8 @@ public abstract class Parser { current.reduce(); Forest forest = current.token==null ? null : shiftedToken((T)current.token, loc); GSS.Phase next = gss.new Phase(current, this, current, input.next(count, gss.resets, gss.waits), loc, forest); - count = next.hash.size(); - if (current.isDone()) return (Forest)current.finalResult; + count = next.size(); + if (current.isDone()) return (Forest)gss.finalResult; current = next; } } @@ -126,7 +126,7 @@ public abstract class Parser { public final int idx = master_state_idx++; private final HashSet hs; - private transient HashMap gotoSetNonTerminals = new HashMap(); + public transient HashMap gotoSetNonTerminals = new HashMap(); private transient TopologicalBag gotoSetTerminals = new TopologicalBag(); private TopologicalBag reductions = new TopologicalBag(); @@ -139,17 +139,16 @@ public abstract class Parser { // Interface Methods ////////////////////////////////////////////////////////////////////////////// - public boolean isAccepting() { return accept; } - - public boolean canShift(Token t) { return oshifts.contains(t); } - public boolean canReduce(Token t) { return t==null ? eofReductions.size()>0 : oreductions.contains(t); } - + boolean isAccepting() { return accept; } public Iterator iterator() { return hs.iterator(); } - public void invokeShifts(Token t, Invokable irbc, B b, C c) { + boolean canShift(Token t) { return oshifts.contains(t); } + void invokeShifts(Token t, Invokable irbc, B b, C c) { oshifts.invoke(t, irbc, b, c); } - public void invokeReductions(Token t, Invokable irbc, B b, C c) { + + boolean canReduce(Token t) { return t==null ? eofReductions.size()>0 : oreductions.contains(t); } + void invokeReductions(Token t, Invokable irbc, B b, C c) { if (t==null) for(Reduction r : eofReductions) irbc.invoke(r, b, c); else oreductions.invoke(t, irbc, b, c); } @@ -236,7 +235,6 @@ public abstract class Parser { } public String toString() { - //return "state["+idx+"]"; StringBuffer ret = new StringBuffer(); ret.append("state["+idx+"]: "); for(Position p : this) ret.append("{"+p+"} "); @@ -253,9 +251,7 @@ public abstract class Parser { */ public class Reduction { // FIXME: cleanup; almost everything in here could go in either Sequence.Position.getRewrite() or else in GSS.Reduct - public final int numPop; /*private*/ final Position position; - private final Forest[] holder; // to avoid constant reallocation public int hashCode() { return position.hashCode(); } public boolean equals(Object o) { if (o==null) return false; @@ -266,57 +262,16 @@ public abstract class Parser { } public Reduction(Position p) { this.position = p; - this.numPop = p.pos; - this.holder = new Forest[numPop]; } public String toString() { return "[reduce " + position + "]"; } private Forest zero = null; public Forest zero() { if (zero != null) return zero; - if (numPop > 0) throw new Error(); + if (position.pos > 0) throw new Error(); return zero = position.rewrite(null); } - public void reduce(GSS.Phase.Node parent) { - if (numPop==0) finish(parent, zero(), parent.phase()); - else reduce(parent, numPop-1, parent.phase()); - } - - public void reduce(GSS.Phase.Node parent, GSS.Phase.Node onlychild) { - if (numPop<=0) throw new Error("called wrong form of reduce()"); - int pos = numPop-1; - Forest old = holder[pos]; - holder[pos] = parent.pending(); - if (pos==0) { - System.arraycopy(holder, 0, position.holder, 0, holder.length); - finish(onlychild, position.rewrite(parent.phase().getLocation()), parent.phase()); - } else { - reduce(onlychild, pos-1, parent.phase()); - } - holder[pos] = old; - } - - // FIXME: this could be more elegant and/or cleaner and/or somewhere else - private void reduce(GSS.Phase.Node parent, int pos, GSS.Phase target) { - Forest old = holder[pos]; - holder[pos] = parent.pending(); - if (pos==0) { - System.arraycopy(holder, 0, position.holder, 0, holder.length); - for(int i=0; i