X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Fedu%2Fberkeley%2Fsbp%2FGSS.java;h=1d91f89e338d657e89279dd207655ba834ede3d5;hb=45d799349e635f1a99e3974e4504a43d5a7aaf33;hp=bd2ecd6539b2bc91963b944a48ccca080634b70c;hpb=6a2ea790f843e058c7e67d3c7d1deebadcfe1fd5;p=sbp.git diff --git a/src/edu/berkeley/sbp/GSS.java b/src/edu/berkeley/sbp/GSS.java index bd2ecd6..1d91f89 100644 --- a/src/edu/berkeley/sbp/GSS.java +++ b/src/edu/berkeley/sbp/GSS.java @@ -48,7 +48,7 @@ class GSS { private Forest forest; - public Phase(Phase prev, Parser parser, Phase previous, Tok token, Input.Location location, Forest forest) { + public Phase(Phase prev, Parser parser, Phase previous, Tok token, Input.Location location, Forest forest) throws ParseFailed { this.prev = prev; this.forest = forest; this.parser = parser; @@ -59,7 +59,7 @@ class GSS { reset(); } - public void reset() { + public void reset() throws ParseFailed { waiting.clear(); performed.clear(); hash = new IntPairMap(); @@ -183,7 +183,7 @@ class GSS { } /** perform all reduction operations */ - public void reduce() { + public void reduce() throws ParseFailed{ try { reducing = true; if (reducing_list==null || reducing_list.length < hash.size()) @@ -234,7 +234,10 @@ class GSS { } if (!good && token!=null) - throw new ParseFailed(ParseFailed.error(ANSI.red("unexpected character")+" "+ANSI.purple(token)+" encountered at "+ANSI.green(getLocation())+"\n", token, hash.values()), + throw new ParseFailed(ParseFailed.error(ANSI.red("unexpected character ")+" \'"+ + ANSI.purple(StringUtil.escapify(token+"", "\\\'\r\n"))+ + "\' encountered at "+ + ANSI.green(getLocation())+"\n", token, hash.values()), getLocation()); if (token==null && finalResult==null) throw new ParseFailed(ParseFailed.error(ANSI.red("unexpected end of file\n"), token, hash.values()), @@ -290,6 +293,7 @@ class GSS { else state.invokeReductions(token, this, this, n2); } + public void performEmptyReductions() { state.invokeReductions(token, this, null, null); } public final void invoke(Position r, Node n, Node n2) { if (n==null || n2==null || r.pos==0) { if (r.pos==0) { @@ -304,39 +308,33 @@ class GSS { Forest[] holder = new Forest[r.pos]; if (r.pos<=0) throw new Error("called wrong form of reduce()"); int pos = r.pos-1; - Forest old = holder[pos]; - holder[pos] = n.pending(); - if (pos==0) { - System.arraycopy(holder, 0, r.holder, 0, holder.length); - Forest rex = null; - if (r.pos==1) rex = singularReductions.get(this, r); - if (rex==null) { - rex = r.rewrite(n.phase().getLocation()); - if (r.pos==1) singularReductions.put(this, r, rex); - } - n2.finish(r, rex, n.phase(), holder); - } else { - n2.reduce(r, pos-1, n.phase(), holder); - } - holder[pos] = old; + n.reduce(r, pos, n.phase(), holder, n2); } } - public void reduce(Position r, int pos, Phase target, Forest[] holder) { + public void reduce(Position r, int pos, Phase target, Forest[] holder) { reduce(r, pos, target, holder, null); } + public void reduce(Position r, int pos, Phase target, Forest[] holder, Node only) { Forest old = holder[pos]; holder[pos] = this.pending(); if (pos==0) { System.arraycopy(holder, 0, r.holder, 0, holder.length); for(int i=0; i