X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=inline;f=src%2Fedu%2Fberkeley%2Fsbp%2FGSS.java;h=2154731274229e22643d1775550864f295eab26a;hb=474037fe8463b96dfaf0209be157cbf5223a0910;hp=89a16ed8c5c3e9b22e07be5fe5d7e1aa7ed1d6f0;hpb=5d18f5606c9296e6b0c5749f05fc68f358ace2f6;p=sbp.git
diff --git a/src/edu/berkeley/sbp/GSS.java b/src/edu/berkeley/sbp/GSS.java
index 89a16ed..2154731 100644
--- a/src/edu/berkeley/sbp/GSS.java
+++ b/src/edu/berkeley/sbp/GSS.java
@@ -10,6 +10,7 @@ import java.lang.reflect.*;
/** implements Tomita's Graph Structured Stack */
class GSS {
+ public static int count = 0;
public GSS() { }
private Phase.Node[] reducing_list = null;
@@ -25,7 +26,7 @@ class GSS {
public Forest.Ref finalResult;
/** corresponds to a positions between tokens the input stream; same as Tomita's U_i's */
- public class Phase implements Invokable.Node>, IntegerMappable {
+ class Phase implements Invokable.Node>, IntegerMappable {
public void invoke(State st, Forest result, Node n) {
good |= next.newNode(n, result, st, false);
@@ -48,7 +49,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,13 +60,14 @@ class GSS {
reset();
}
- public void reset() {
+ public void reset() throws ParseFailed {
waiting.clear();
performed.clear();
hash = new IntPairMap();
singularReductions = new IntPairMap();
expectedInhibit.clear();
expectedInhibit.addAll(inhibited);
+ reset = false;
good = false;
closed = false;
reducing = false;
@@ -113,7 +115,7 @@ class GSS {
}
if (!owner.lame)
newNode(parent, pending, state, fromEmptyReduction);
- if (reduction!=null) inhibit(reduction, parent==null?0:parent.phase().pos);
+ if (reduction!=null) uninhibit(reduction, parent==null?0:parent.phase().pos);
if (reduction != null) {
boolean redo = true;
while(redo) {
@@ -156,19 +158,19 @@ class GSS {
return true;
}
- public void uninhibit(int p, Sequence s) {
+ public void inhibit(int p, Sequence s) {
if (s.hated!=null)
for(Sequence s2 : s.hated)
inhibited.remove(p, s2);
}
- public void inhibit(Position r, int p) {
+ public void uninhibit(Position r, int p) {
if (r.owner().hated == null) return;
// remember that dead states are still allowed to shift -- just not allowed to reduce
boolean reset = false;
for(Sequence seq : r.owner().hated) {
if (performed.contains(p,seq)) {
- uninhibit(p, seq);
+ inhibit(p, seq);
//System.out.println("\nresetting due to " + r.owner() + " killing " + seq);
//inhibited.clear();
inhibited.add(p, seq);
@@ -183,7 +185,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())
@@ -209,8 +211,10 @@ class GSS {
reset();
reduce();
}
+ count = 0;
}
+ private boolean reset = false;
class Reset extends RuntimeException { }
/** perform all shift operations, adding promoted nodes to next */
@@ -245,7 +249,7 @@ class GSS {
}
- public class Waiting {
+ class Waiting {
Node parent;
Forest pending;
State state;
@@ -268,7 +272,7 @@ class GSS {
// Node /////////////////////////////////////////////////////////////////////////////////
/** a node in the GSS */
- public final class Node extends FastSet implements Invokable, IntegerMappable {
+ final class Node extends FastSet implements Invokable, IntegerMappable {
private Forest.Ref holder = null;
private boolean allqueued = false;
@@ -308,39 +312,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