X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FGSS.java;h=3c6beacabbf2c2ccd75f2286c75e2ab4d9312124;hp=c96ceeec43d7a2b2532d9e7b51545c4efb00b7f9;hb=5c4157c1118401c4223ff485e9531fc3ba851be2;hpb=9d727bd14c659cdc6c34153b988e8d3fdb8067f5 diff --git a/src/edu/berkeley/sbp/GSS.java b/src/edu/berkeley/sbp/GSS.java index c96ceee..3c6beac 100644 --- a/src/edu/berkeley/sbp/GSS.java +++ b/src/edu/berkeley/sbp/GSS.java @@ -31,6 +31,7 @@ class GSS { public Forest.Many finalResult; private PriorityQueue reductionQueue = new PriorityQueue(); + Parser parser() { return parser; } public void addReduction(Reduction r) { //System.out.println("+ " + r); parser.spin(); @@ -61,9 +62,9 @@ class GSS { newNode(primordealResult, startState, true); } public Phase(Phase prev, Forest forest) throws ParseFailed, IOException { - this.location = input.getLocation(); + this.prevLocation = input.getLocation(); this.token = (Tok)input.next(); - this.prevLocation = prev==null ? location : prev.getLocation(); + this.location = input.getLocation(); this.prev = prev; this.forest = forest; this.pos = prev==null ? 0 : prev.pos+1; @@ -106,13 +107,14 @@ class GSS { public boolean isDone() throws ParseFailed { if (token != null) return false; if (token==null && finalResult==null) - ParseFailed.error("unexpected end of file", this); + ParseFailed.error("unexpected end of file", this, null, + getLocation().createRegion(getLocation())); return true; } public Input.Location getPrevLocation() { return prevLocation; } public Input.Location getLocation() { return location; } - public Input.Region getRegion() { return getPrevLocation().createRegion(getLocation()); } + public Input.Region getRegion() { return prevLocation.createRegion(location); } public Input.Location getNextLocation() { return nextLocation; } public boolean isFrontier() { return hash!=null; } @@ -139,8 +141,23 @@ class GSS { } numNewNodes = next==null ? 0 : next.hash.size(); viewPos = this.pos; - if (!good && token!=null) ParseFailed.error("unexpected character", this); - if (token==null && finalResult==null) ParseFailed.error("unexpected end of file", this); + if (!good && token!=null) { + String toks = token+""; + if (toks.length()==1 && toks.charAt(0) == edu.berkeley.sbp.chr.CharAtom.left) { + ParseFailed.error("unexpected increase in indentation", this, + token, getRegionFromThisToNext()); + } else if (toks.length()==1 && toks.charAt(0) == edu.berkeley.sbp.chr.CharAtom.right) { + ParseFailed.error("unexpected decrease in indentation", this, + token, getRegionFromThisToNext()); + } else { + ParseFailed.error("unexpected character '"+ANSI.cyan(StringUtil.escapify(token+"", + "\\\'\r\n"))+"'", + this, token, getRegionFromThisToNext()); + } + } + if (token==null && finalResult==null) + ParseFailed.error("unexpected end of file", this, null, + getLocation().createRegion(getLocation())); for(Node n : hash) n.check(); } @@ -168,7 +185,7 @@ class GSS { */ private boolean newNode(Result result, State state, boolean fromEmptyReduction) { Node p = hash.get(state, result.phase()); - if (p != null) { p.addResult(result); return true; } + if (p != null) { p.addResult(result); return !state.doomed(); } do { if (token != null && state.canShift(token)) break; if (state.isAccepting()) break; @@ -176,9 +193,9 @@ class GSS { if (!state.canReduce(token)) return false; } while(false); Node n = new Node(Phase.this, result, state, fromEmptyReduction); // ALLOC - for(Object s : state.also) + for(Object s : state.conjunctStates) newNode(new Result(null, n, null), (State)s, fromEmptyReduction); - return true; + return !n.state().doomed(); } public int toInt() { return pos+1; }