X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FGSS.java;h=7d3758f906cc5df9a5b73fa74173a0181d68b968;hb=e12a3098c6ed3cbfa6493870af3688f833c4f8ac;hp=8124590dc465f326e7e8e90c33d92c7fed4c4752;hpb=927dc9b785de472f2237c5adbc4d2ad12f16cc2d;p=sbp.git
diff --git a/src/edu/berkeley/sbp/GSS.java b/src/edu/berkeley/sbp/GSS.java
index 8124590..7d3758f 100644
--- a/src/edu/berkeley/sbp/GSS.java
+++ b/src/edu/berkeley/sbp/GSS.java
@@ -25,7 +25,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 +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())
@@ -245,7 +245,7 @@ class GSS {
}
- public class Waiting {
+ class Waiting {
Node parent;
Forest pending;
State state;
@@ -268,7 +268,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;
@@ -293,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) {
@@ -307,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