checkpoint
[sbp.git] / src / edu / berkeley / sbp / Parser.java
index a24c523..65f3dc3 100644 (file)
@@ -313,12 +313,13 @@ public abstract class Parser<T extends Token, R> {
 
             public Forest reduce(GSS.Phase.Node parent) {
                 if (numPop==0) return finish(parent, zero(), parent.phase());
-                return reduce(parent, numPop-1, null, null, parent.phase());
+                return reduce(parent, numPop-1, null, parent.phase());
             }
 
             public Forest reduce(GSS.Phase.Node parent, GSS.Phase.Node onlychild) {
+                if (numPop<=0) throw new Error("called wrong form of reduce()");
                 int pos = numPop-1;
-                if (pos>=0) holder[pos] = parent.pending();
+                holder[pos] = parent.pending();
                 Forest rex = null;
                 if (pos==0) {
                     if (rex==null) {
@@ -326,7 +327,7 @@ public abstract class Parser<T extends Token, R> {
                         rex = position.rewrite(parent.phase().getLocation());
                     }
                 }
-                return reduce(onlychild, pos-1, rex, null, parent.phase());
+                return reduce(onlychild, pos-1, rex, parent.phase());
             }
 
             private Forest zero = null;
@@ -337,27 +338,15 @@ public abstract class Parser<T extends Token, R> {
             }
 
             // 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.Node onlychild, GSS.Phase target) {
-                if (pos>=0) holder[pos] = parent.pending();
-                if (pos==0) {
-                    if (rex==null) {
-                        System.arraycopy(holder, 0, position.holder, 0, holder.length);
-                        rex = position.rewrite(target.getLocation());
-                    }
-                    if (onlychild != null)
-                        reduce(onlychild, pos-1, rex, null, target);
-                    else 
-                        for(GSS.Phase.Node child : parent.parents())
-                            reduce(child, pos-1, rex, null, target);
-                } else if (pos>0) {
-                    if (onlychild != null)
-                        reduce(onlychild, pos-1, rex, null, target);
-                    else 
-                        for(GSS.Phase.Node child : parent.parents())
-                            reduce(child, pos-1, rex, null, target);
-                } else {
-                    return finish(parent, rex, target);
+            private Forest reduce(GSS.Phase.Node parent, int pos, Forest rex, GSS.Phase target) {
+                if (pos<0) return finish(parent, rex, target);
+                holder[pos] = parent.pending();
+                if (pos==0 && rex==null) {
+                    System.arraycopy(holder, 0, position.holder, 0, holder.length);
+                    rex = position.rewrite(target.getLocation());
                 }
+                for(GSS.Phase.Node child : parent.parents())
+                    reduce(child, pos-1, rex, target);
                 return rex;
             }
             private Forest finish(GSS.Phase.Node parent, Forest result, GSS.Phase target) {