X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FGSS.java;h=8053ae8a8b7a014f259dbdd81c8a30dac879fa46;hp=a8f8053e439f796072d977525956adb832a2551a;hb=a22c5074e705e3ffcf03e9f9d174aed8ef79fc91;hpb=3eb9fa560dee4f8c3b3af0460ff850d755676d81 diff --git a/src/edu/berkeley/sbp/GSS.java b/src/edu/berkeley/sbp/GSS.java index a8f8053..8053ae8 100644 --- a/src/edu/berkeley/sbp/GSS.java +++ b/src/edu/berkeley/sbp/GSS.java @@ -39,7 +39,7 @@ class GSS { public Forest.Ref finalResult; /** all nodes, keyed by the value returned by code() */ - /*private*/ HashMap hash; /* ALLOC */ + /*private*/ IntPairMap hash; /* ALLOC */ /** the number of nodes in this phase */ private int numNodes; @@ -70,7 +70,7 @@ class GSS { tail.clear(); waiting.clear(); performed.clear(); - hash = new HashMap(); + hash = new IntPairMap(); good = false; closed = false; numNodes = 0; @@ -132,7 +132,10 @@ class GSS { ret.append("\n "); ret.append(message); HashMap> errors = new HashMap>(); - for(Node n : hash.values()) complain(n, errors, false); + for(Node n : hash.values()) { + //System.out.println(n.state); + complain(n, errors, false); + } for(String s : errors.keySet()) { ret.append(" while parsing " + yellow(s)); HashSet hs = errors.get(s); @@ -151,10 +154,10 @@ class GSS { return ret.toString(); } - public boolean isDone() throws Parser.Failed { + public boolean isDone() throws ParseFailed { if (token != null) return false; if (token==null && finalResult==null) - throw new Parser.Failed(error(red("unexpected end of file\n")), + throw new ParseFailed(error(red("unexpected end of file\n")), getLocation()); return true; } @@ -169,7 +172,7 @@ class GSS { * @param start the earliest part of the input contributing to this node (used to make merging decisions) */ public boolean newNode(Node parent, Forest pending, State state, boolean fromEmptyReduction) { - Node p = hash.get(code(state, parent==null?null:parent.phase())); + Node p = hash.get(state, parent==null?null:parent.phase()); if (p != null) return newNode2(p, parent, pending, state, fromEmptyReduction); else return newNode3(parent, pending, state, fromEmptyReduction); } @@ -270,9 +273,8 @@ class GSS { reducing = true; if (reducing_list==null || reducing_list.length < hash.size()) reducing_list = new Phase.Node[hash.size() * 4]; - Collection hv = hash.values(); - hv.toArray(reducing_list); - int num = hv.size(); + hash.toArray(reducing_list); + int num = hash.size(); for(int i=0; inext */ - public void shift(Phase next, Forest result) throws Parser.Failed { + public void shift(Phase next, Forest result) throws ParseFailed { if (prev!=null) prev.hash = null; this.next = next; closed = true; @@ -314,10 +320,10 @@ class GSS { } if (!good && token!=null) - throw new Parser.Failed(error(red("unexpected character")+" "+purple(token)+" encountered at "+green(getLocation())+"\n"), + throw new ParseFailed(error(red("unexpected character")+" "+purple(token)+" encountered at "+green(getLocation())+"\n"), getLocation()); if (token==null && finalResult==null) - throw new Parser.Failed(error(red("unexpected end of file\n")), + throw new ParseFailed(error(red("unexpected end of file\n")), getLocation()); // this massively improves GC performance @@ -400,8 +406,8 @@ class GSS { this.holder().merge(pending); Phase start = parent==null ? null : parent.phase(); if (parent != null) parents().add(parent, true); - if (Phase.this.hash.get(code(state, start)) != null) throw new Error("severe problem!"); - Phase.this.hash.put(code(state, start), this); + if (Phase.this.hash.get(state, start) != null) throw new Error("severe problem!"); + Phase.this.hash.put(state, start, this); Phase.this.numNodes++; } } @@ -414,9 +420,4 @@ class GSS { if (a==null || b==null) return false; return a.equals(b); } - - /** this is something of a hack right now */ - private static long code(State state, Phase start) { - return (((long)state.idx) << 32) | (start==null ? 0 : (start.pos+1)); - } }