package edu.berkeley.sbp;
import edu.berkeley.sbp.*;
import edu.berkeley.sbp.util.*;
+import edu.berkeley.sbp.Parser.Table.*;
import edu.berkeley.sbp.Sequence.Position;
-import edu.berkeley.sbp.Parser.Table.State;
import java.io.*;
import java.util.*;
import java.lang.reflect.*;
public Forest.Ref finalResult;
/** corresponds to a positions <i>between tokens</i> the input stream; same as Tomita's U_i's */
- public class Phase implements Invokable<State, Forest, GSS.Phase.Node>, IntegerMappable {
+ public class Phase<Tok> implements Invokable<State, Forest, Phase<Tok>.Node>, IntegerMappable {
+
+ public void invoke(State st, Forest result, Node n) {
+ good |= next.newNode(n, result, st, false);
+ }
/** the token immediately after this phase */
- final Token token;
+ final Tok token;
private final int pos;
private Forest forest;
- public Phase(Phase prev, Parser parser, Phase previous, Token token, Token.Location location, Forest forest) {
+ public Phase(Phase prev, Parser parser, Phase previous, Tok token, Token.Location location, Forest forest) {
this.prev = prev;
this.forest = forest;
this.parser = parser;
class Reset extends RuntimeException { }
- public void invoke(State st, Forest result, Node n) {
- good |= next.newNode(n, result, st, false);
- }
-
/** perform all shift operations, adding promoted nodes to <tt>next</tt> */
public void shift(Phase next, Forest result) throws ParseFailed {
// this massively improves GC performance
private boolean allqueued = false;
/** what state this node is in */
- public final State state;
+ public final Parser.Table<Tok>.State<Tok> state;
/** which Phase this Node belongs to (node that Node is also a non-static inner class of Phase) */
public Phase phase() { return Phase.this; }
}
}
- public void reduce(Position r, int pos, GSS.Phase target, Forest[] holder) {
+ public void reduce(Position r, int pos, Phase target, Forest[] holder) {
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<r.pos; i++) if (r.holder[i]==null) throw new Error("realbad");
Forest rex = r.rewrite(target.getLocation());
- for(GSS.Phase.Node child : this.parents()) child.finish(r, rex, target, holder);
+ for(Node child : this.parents()) child.finish(r, rex, target, holder);
} else {
- for(GSS.Phase.Node child : this.parents()) child.reduce(r, pos-1, target, holder);
+ for(Node child : this.parents()) child.reduce(r, pos-1, target, holder);
}
holder[pos] = old;
}
- public void finish(Position r, Forest result, GSS.Phase target, Forest[] holder) {
- State state0 = state.gotoSetNonTerminals.get(r.owner());
+ public void finish(Position r, Forest result, Phase<Tok> target, Forest[] holder) {
+ Parser.Table<Tok>.State<Tok> state0 = state.gotoSetNonTerminals.get(r.owner());
if (result==null) throw new Error();
if (state0!=null)
target.newNode(this, result, state0, r.pos<=0, r);