X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FParser.java;h=4244d21717cf8ac37cd029b502c0c05844f938d4;hp=5c399cc95c63246761ec4581af29816c2a664167;hb=f33c05adc5aa3dd324c5352cdbd6f4b55359acad;hpb=c4431d19cc5ddaae29d22c8c56366b53b0bad352 diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index 5c399cc..4244d21 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -37,7 +37,7 @@ public abstract class Parser { GSS gss = new GSS(); Token.Location loc = input.getLocation(); GSS.Phase current = gss.new Phase(null, input.next(), loc); - current.newNode(null, null, pt.start, true, null); + current.newNode(null, null, pt.start, true); for(;;) { loc = input.getLocation(); GSS.Phase next = gss.new Phase(current, input.next(), loc); @@ -142,6 +142,10 @@ public abstract class Parser { if (p.element() != null && p.element() instanceof Atom) state.shifts.addAll(state.gotoSetTerminals.subset(((Atom)p.element()))); } + for(State state : all_states.values()) { + state.oreductions = state.reductions.optimize(); + state.oshifts = state.shifts.optimize(); + } } /** a single state in the LR table and the transitions possible from it */ @@ -179,16 +183,26 @@ public abstract class Parser { private TopologicalBag shifts = new TopologicalBag(); private boolean accept = false; + private VisitableMap oshifts = null; + private VisitableMap oreductions = null; + // Interface Methods ////////////////////////////////////////////////////////////////////////////// - public boolean canShift(Token t) { return shifts.contains(t); } - public Iterable getShifts(Token t) { return shifts.get(t); } public boolean isAccepting() { return accept; } - public Iterable getReductions(Token t) { return t==null ? eofReductions : reductions.get(t); } - public boolean hasReductions(Token t) { return t==null ? eofReductions.size()>0 : reductions.has(t); } - public Iterable getEofReductions() { return eofReductions; } + + public boolean canShift(Token t) { return oshifts.contains(t); } + public boolean canReduce(Token t) { return t==null ? eofReductions.size()>0 : oreductions.contains(t); } + public Iterator iterator() { return hs.iterator(); } + public 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) { + if (t==null) for(Reduction r : eofReductions) irbc.invoke(r, b, c); + else oreductions.invoke(t, irbc, b, c); + } + // Constructor ////////////////////////////////////////////////////////////////////////////// /** @@ -327,6 +341,7 @@ public abstract class Parser { 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); @@ -334,23 +349,27 @@ public abstract class Parser { } 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