X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FParser.java;h=58d0bc2a217118aaeb174974af72fc4a13dfd02c;hp=3fad1ddacd8c1e7a257d17193b9fcff3973b24b4;hb=7fbee73b4dd985cb5b217ed297710c00fd9d7004;hpb=72d5880c192b7fbd525c97ded4cf11e935c58cc8 diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index 3fad1dd..58d0bc2 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -22,7 +22,15 @@ public abstract class Parser { /** parse input for a exactly one unique result, throwing Ambiguous if not unique or Failed if none */ - public Tree parse1(Token.Stream input) throws IOException, Failed, Ambiguous { return parse(input).expand1(); } + public Tree parse1(Token.Stream input) throws IOException, Failed, Ambiguous { + Forest ret = parse(input); + try { return ret.expand1(); } + catch (Ambiguous a) { + System.out.println("while expanding:"); + System.out.println(ret); + throw a; + } + } /** parse input, using the table pt to drive the parser */ public Forest parse(Token.Stream input) throws IOException, Failed { @@ -139,6 +147,27 @@ public abstract class Parser { /** a single state in the LR table and the transitions possible from it */ public class State implements Comparable, Iterable { + /* + public boolean isResolvable(Token t) { + boolean found = false; + for(Reduction r : getReductions(t)) { + Position p = r.position; + if (!p.isRightNullable(cache)) continue; + if (p.owner().firstp()==p) continue; + if (found) { + // found two items meeting criteria #1 + return false; + } else { + found = true; + continue; + } + if (p.element()==null) continue; + Topology first = new Walk.First(top(), cache).walk(p.element()); + if (first.contains(t)) + } + } + */ + public final int idx = master_state_idx++; private final HashSet hs; @@ -265,7 +294,7 @@ public abstract class Parser { public class Reduction { // FIXME: cleanup; almost everything in here could go in either Sequence.Position.getRewrite() or else in GSS.Reduct public final int numPop; - private final Position position; + /*private*/ final Position position; private final Forest[] holder; // to avoid constant reallocation public int hashCode() { return position.hashCode(); } public boolean equals(Object o) { @@ -289,6 +318,13 @@ public abstract class Parser { return reduce(parent, numPop-1, rex, onlychild, target); } + private Forest zero = null; + public Forest zero() { + if (zero != null) return zero; + if (numPop > 0) throw new Error(); + return zero = position.rewrite(null); + } + // FIXME: this could be more elegant and/or cleaner and/or somewhere else private Forest reduce(GSS.Phase.Node parent, int pos, Forest rex, GSS.Phase.Node onlychild, GSS.Phase target) { if (pos>=0) holder[pos] = parent.pending();