/** a parser which translates streams of Tokens of type T into a Forest<R> */
public abstract class Parser<T extends Token, R> {
- private final Table pt;
+ public final Table pt;
/** create a parser to parse the grammar with start symbol <tt>u</tt> */
protected Parser(Union u) { this.pt = new Table(u, top()); }
public Forest<R> parse(Token.Stream<T> input) throws IOException, Failed {
GSS gss = new GSS();
Token.Location loc = input.getLocation();
- GSS.Phase current = gss.new Phase(null, input.next(1), loc);
+ GSS.Phase current = gss.new Phase(null, this, null, input.next(1, 0, 0), loc, null);
current.newNode(null, null, pt.start, true);
int count = 1;
for(;;) {
loc = input.getLocation();
- GSS.Phase next = gss.new Phase(current, input.next(count), loc);
+ //current.checkFailure();
current.reduce();
Forest forest = current.token==null ? null : shiftedToken((T)current.token, loc);
- current.shift(next, forest);
+ GSS.Phase next = gss.new Phase(current, this, current, input.next(count, gss.resets, gss.waits), loc, forest);
count = next.hash.size();
- current.checkFailure();
if (current.isDone()) return (Forest<R>)current.finalResult;
current = next;
}
// Exceptions //////////////////////////////////////////////////////////////////////////////
- public static class Failed extends Exception {
+ public static class Failed extends RuntimeException {
private final Token.Location location;
private final String message;
public Failed() { this("", null); }
public Failed(String message, Token.Location loc) { this.location = loc; this.message = message; }
public Token.Location getLocation() { return location; }
- public String toString() { return message + (location==null ? "" : (" at " + location)); }
+ public String toString() { return message/* + (location==null ? "" : (" at " + location))*/; }
}
public static class Ambiguous extends RuntimeException {
static class Table extends Walk.Cache {
public final Walk.Cache cache = this;
+
+ public HashMapBag<Position,State> byPosition = new HashMapBag<Position,State>();
private void walk(Element e, HashSet<Element> hs) {
if (e==null) return;
// register ourselves in the all_states hash so that no
// two states are ever created with an identical position set
all_states.put(hs, this);
+ for(Position p : hs) byPosition.add(p,this);
// Step 1a: examine all Position's in this state and compute the mappings from
// sets of follow tokens (tokens which could follow this position) to sets
private void finish(GSS.Phase.Node parent, Forest result, GSS.Phase target) {
State state = parent.state.gotoSetNonTerminals.get(position.owner());
if (state!=null)
- target.newNode(parent, result, state, numPop<=0);
+ target.newNode(parent, result, state, numPop<=0, this);
}
}
}