X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FGSS.java;h=0bc14ae38bfe80f9e2ed005dbd676c54b58f5e10;hb=f13be78d4291906d2f4c7588567cb114f0cc3b54;hp=77464c25b4f96d28087c836b8d1f99a6bdb27afb;hpb=c263c1e02119917a9d63ab14db9711c7d1cb4d9d;p=sbp.git diff --git a/src/edu/berkeley/sbp/GSS.java b/src/edu/berkeley/sbp/GSS.java index 77464c2..0bc14ae 100644 --- a/src/edu/berkeley/sbp/GSS.java +++ b/src/edu/berkeley/sbp/GSS.java @@ -122,7 +122,6 @@ class GSS { for(int i=0; i cache = null; - - /** the set of nodes to which there is an edge starting at this node */ - //public final FastSet parents = new FastSet(); /* ALLOC */ - /** what state this node is in */ public final Parser.Table.State state; /** which Phase this Node belongs to (node that Node is also a non-static inner class of Phase) */ public Phase phase() { return Phase.this; } - public HashMap cache() { - return cache==null ? (cache = new HashMap()) : cache; - } public Forest.Ref holder() { return holder==null ? (holder = new Forest.Ref()) : holder; } public Forest pending() { return Phase.this.closed ? holder().resolve() : holder; } public FastSet parents() { return this; } - /** FIXME */ public void queueReductions() { if (allqueued) return; allqueued = true; int where = parents().size(); - for(Parser.Table.Reduction r : token==null ? state.getEofReductions() : state.getReductions(token)) - if (r.numPop > 1) - r.reduce(this, null, null); - for(int i=0; i= 1) + r.reduce(this); } - /** FIXME */ - public void queueReductions(Node n2) { queueReductions(n2, true); } - public void queueReductions(Node n2, boolean includeLongs) { + public void queueReductions(Node n2) { if (!allqueued) { queueReductions(); return; } - Node n = this; - for(Parser.Table.Reduction r : token==null ? n.state.getEofReductions() : n.state.getReductions(token)) { - - // UGLY HACK - // The problem here is that a "reduction of length 1" - // performed twice with different values of n2 needs - // to only create a *single* new result, but must add - // multiple parents to the node holding that result. - // The current reducer doesn't differentiate between - // the next node of an n-pop reduction and the - // ultimate parent of the last pop, so we need to - // cache instances here as a way of avoiding - // recreating them. - if (r.numPop <= 0) continue; - if (r.numPop == 1) { - Forest ret = n.cache().get(r); - if (ret != null) r.reduce(this, n2, ret); - else n.cache().put(r, r.reduce(this, n2, null)); - } else { - if (includeLongs) r.reduce(this, n2, null); - } - } + for(Parser.Table.Reduction r : state.getReductions(token)) + if (r.numPop > 0) + r.reduce(this, n2); } - /** FIXME */ public void queueEmptyReductions() { if (reducing) for(Parser.Table.Reduction r : token==null ? state.getEofReductions() : state.getReductions(token)) if (r.numPop==0) - r.reduce(this, null, r.zero()); + r.reduce(this); } private Node(Node parent, Forest pending, Parser.Table.State state, Phase start) {