X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FGSS.java;h=a726297a7346cb06849949b1bce06531864fa32c;hb=c78e4efbba69fc058bbe487319b3abf5d94df3cb;hp=c96ceeec43d7a2b2532d9e7b51545c4efb00b7f9;hpb=9d727bd14c659cdc6c34153b988e8d3fdb8067f5;p=sbp.git diff --git a/src/edu/berkeley/sbp/GSS.java b/src/edu/berkeley/sbp/GSS.java index c96ceee..a726297 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(); @@ -51,7 +52,6 @@ class GSS { private Phase prev; private Input.Location location; private Input.Location nextLocation; - private Input.Location prevLocation; private Forest forest; @@ -63,11 +63,10 @@ class GSS { public Phase(Phase prev, Forest forest) throws ParseFailed, IOException { this.location = input.getLocation(); this.token = (Tok)input.next(); - this.prevLocation = prev==null ? location : prev.getLocation(); + this.nextLocation = input.getLocation(); this.prev = prev; this.forest = forest; this.pos = prev==null ? 0 : prev.pos+1; - this.nextLocation = input.getLocation(); if (prev != null) prev.shift(this, forest); numReductions = 0; @@ -106,13 +105,12 @@ 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.Location getNextLocation() { return nextLocation; } public boolean isFrontier() { return hash!=null; } @@ -124,8 +122,7 @@ class GSS { IntPairMap h = prev.hash; prev.hash = null; prev.performed = null; - for(Node n : h) - n.check(); + for(Node n : h) n.check(); } numOldNodes = hash.size(); for(Node n : hash.values()) { @@ -139,11 +136,30 @@ 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(); } + Input.Region getRegionFromThisToNext() { + return getLocation().createRegion(getNextLocation()); + } + void newNodeFromReduction(Result result, State state, Position reduction) { int pos = result.phase().pos; Sequence owner = reduction.owner(); @@ -168,7 +184,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 +192,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; }