X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FGSS.java;h=7626b4ee0c0b45ec9837090517ab8fd811efe08a;hp=27eb279a16692b92ad69a6c0dfd85d55bf172508;hb=c805010980fc22bcd66c1684a772f66563cd6b72;hpb=80f8bc14a13b5e4912004e081ec96dc6ed807385 diff --git a/src/edu/berkeley/sbp/GSS.java b/src/edu/berkeley/sbp/GSS.java index 27eb279..7626b4e 100644 --- a/src/edu/berkeley/sbp/GSS.java +++ b/src/edu/berkeley/sbp/GSS.java @@ -18,13 +18,16 @@ class GSS { public GSS(Input input, Parser parser) { this.input = input; this.parser = parser;} public Input getInput() { return input; } + /* + HashSet finishedReductions = new HashSet(); + */ int numNewNodes = 0; int numOldNodes = 0; int viewPos = 0; int numReductions = 0; /** corresponds to a positions between tokens the input stream; same as Tomita's U_i's */ - class Phase implements Invokable, IntegerMappable, GraphViz.ToGraphViz, Iterable { + class Phase implements Invokable, IntegerMappable, GraphViz.ToGraphViz, Iterable { // FIXME: right now, these are the performance bottleneck private HashMapBag performed = new HashMapBag(); @@ -38,15 +41,15 @@ class GSS { parser.spin(); reductionQueue.add(r); } - public void invoke(State st, Result result) { + + public void invoke(State st, Node pred, Forest f) { parser.spin(); - good |= next.newNode(result, st, false); + good |= next.newNode(f, null, pred, st, false); } /** the token immediately after this phase */ final Tok token; final int pos; - public IntPairMap hash = new IntPairMap(); /* ALLOC */ private boolean good = false; private Phase next = null; @@ -58,8 +61,7 @@ class GSS { public Phase(State startState) throws ParseFailed, IOException { this(null, null); - Result primordealResult = new Result(null, null, null); - newNode(primordealResult, startState, true); + newNode(null, null, null, startState, true); } public Phase(Phase prev, Forest forest) throws ParseFailed, IOException { this.location = input.getLocation(); @@ -70,6 +72,9 @@ class GSS { this.pos = prev==null ? 0 : prev.pos+1; if (prev != null) prev.shift(this, forest); numReductions = 0; + /* + finishedReductions.clear(); + */ int minPhasePos = Integer.MAX_VALUE; Reduction best = null; @@ -77,15 +82,15 @@ class GSS { while(!reductionQueue.isEmpty()) { Reduction r = reductionQueue.poll(); //System.out.println("- " + r); - if (r.parentPhase() != null) - if (r.parentPhase().pos > minPhasePos) + if (r.predPhase() != null) + if (r.predPhase().pos > minPhasePos) throw new Error(); r.perform(); - if (r.parentPhase() != null) { - if (r.parentPhase().pos < minPhasePos) { - minPhasePos = r.parentPhase().pos; + if (r.predPhase() != null) { + if (r.predPhase().pos < minPhasePos) { + minPhasePos = r.predPhase().pos; best = r; - } else if (r.parentPhase().pos == minPhasePos) { + } else if (r.predPhase().pos == minPhasePos) { /* if (best != null && Parser.mastercache.comparePositions(r.reduction(), best.reduction()) < 0) throw new Error("\n"+r+"\n"+best+"\n"+ @@ -95,6 +100,9 @@ class GSS { best = r; } } + /* + finishedReductions.add(r); + */ numReductions++; } if (token==null) shift(null, null); @@ -130,12 +138,11 @@ class GSS { finalResult.merge(r.getForest()); } if (token == null) continue; - Result result = new Result(f, null, null); - result.addParent(n); - n.state().invokeShifts(token, this, result); + n.state().invokeShifts(token, this, n, f); } numNewNodes = next==null ? 0 : next.hash.size(); viewPos = this.pos; + if (!good && token!=null) { String toks = token+""; if (toks.length()==1 && toks.charAt(0) == edu.berkeley.sbp.chr.CharAtom.left) { @@ -160,8 +167,8 @@ class GSS { return getLocation().createRegion(getNextLocation()); } - void newNodeFromReduction(Result result, State state, Pos reduction) { - int pos = result.phase().pos; + void newNodeFromReduction(Forest f, Pos reduction, Node pred) { + int pos = pred.phase().pos; for(int s : reduction.hates()) if (performed.contains(pos, s)) return; @@ -170,8 +177,9 @@ class GSS { return; if (reduction.owner_needed_or_hated() && !performed.contains(pos, reduction.provides())) performed.add(pos, reduction.provides()); + Parser.Table.State state = (Parser.Table.State)pred.state().gotoSetNonTerminals.get(reduction); if (state!=null) - newNode(result, state, reduction.numPops()<=0); + newNode(f, reduction, pred, state, reduction.numPops()<=0); } /** add a new node (merging with existing nodes if possible) @@ -181,19 +189,22 @@ class GSS { * @param fromEmptyReduction true iff this node is being created as a result of a reduction of length zero (see GRMLR paper) * @param start the earliest part of the input contributing to this node (used to make merging decisions) */ - private boolean newNode(Result result, State state, boolean fromEmptyReduction) { - Node p = hash.get(state, result.phase()); - if (p != null) { p.addResult(result); return !state.doomed(); } + private boolean newNode(Forest f, Pos reduction, Node pred, State state, boolean fromEmptyReduction) { + Node p = pred==null ? null : hash.get(state, pred.phase()); + if (p != null) { + p.addResult(f, reduction, pred); + return !state.doomed(); + } do { if (token != null && state.canShift(token)) break; if (state.isAccepting()) break; if (token==null) break; if (!state.canReduce(token)) return false; } while(false); - Node n = new Node(Phase.this, result, state, fromEmptyReduction); // ALLOC + Node n = new Node(Phase.this, f, reduction, pred, state, fromEmptyReduction); // ALLOC /** FIXME: this null-result can be used to notice bogus/dead states */ for(Object s : state.conjunctStates) - newNode(new Result(null, n, null), (State)s, fromEmptyReduction); + newNode(null, null, n, (State)s, fromEmptyReduction); return !n.state().doomed(); }