X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FParser.java;h=5c399cc95c63246761ec4581af29816c2a664167;hp=d258b7870675bbd35e722d42be0c4ef456e516f6;hb=c4431d19cc5ddaae29d22c8c56366b53b0bad352;hpb=f13be78d4291906d2f4c7588567cb114f0cc3b54;ds=sidebyside diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index d258b78..5c399cc 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -185,6 +185,7 @@ public abstract class Parser { 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 Iterator iterator() { return hs.iterator(); } @@ -318,41 +319,38 @@ public abstract class Parser { return zero = position.rewrite(null); } - public Forest reduce(GSS.Phase.Node parent) { - if (numPop==0) return finish(parent, zero(), parent.phase()); - return reduce(parent, numPop-1, null, parent.phase()); + public void reduce(GSS.Phase.Node parent) { + if (numPop==0) finish(parent, zero(), parent.phase()); + else reduce(parent, numPop-1, parent.phase()); } - public Forest reduce(GSS.Phase.Node parent, GSS.Phase.Node onlychild) { + 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; holder[pos] = parent.pending(); if (pos==0) { System.arraycopy(holder, 0, position.holder, 0, holder.length); - return finish(onlychild, position.rewrite(parent.phase().getLocation()), parent.phase()); + finish(onlychild, position.rewrite(parent.phase().getLocation()), parent.phase()); + } else { + reduce(onlychild, pos-1, parent.phase()); } - return reduce(onlychild, pos-1, null, parent.phase()); } // FIXME: this could be more elegant and/or cleaner and/or somewhere else - private Forest reduce(GSS.Phase.Node parent, int pos, Forest rex, GSS.Phase target) { - if (pos<0) return finish(parent, rex, target); + private void reduce(GSS.Phase.Node parent, int pos, GSS.Phase target) { holder[pos] = parent.pending(); - if (pos==0 && rex==null) { + if (pos==0) { System.arraycopy(holder, 0, position.holder, 0, holder.length); - rex = position.rewrite(target.getLocation()); + Forest rex = position.rewrite(target.getLocation()); + for(GSS.Phase.Node child : parent.parents()) finish(child, rex, target); + } else { + for(GSS.Phase.Node child : parent.parents()) reduce(child, pos-1, target); } - for(GSS.Phase.Node child : parent.parents()) - //if (pos==0) finish(parent, rex, target); - //else - reduce(child, pos-1, rex, target); - return rex; } - private Forest finish(GSS.Phase.Node parent, Forest result, GSS.Phase target) { + private void finish(GSS.Phase.Node parent, Forest result, GSS.Phase target) { State state = parent.state.gotoSetNonTerminals.get(position.owner()); if (state!=null) target.newNode(parent, result, state, numPop<=0, parent.phase()); - return result; } } }