X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FParser.java;h=6bf274d30ecb6bde3135d9fce9061321c9a63d47;hp=ab0688966495d0ee149c14e02306e2eee7c5ce38;hb=96a2822a729e563a64173f22dc184bc972a200ef;hpb=6b53048f4413f3c618acc3581d0b4f60a236a9bc;ds=sidebyside diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index ab06889..6bf274d 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -9,7 +9,7 @@ import java.util.*; import java.lang.reflect.*; /** a parser which translates streams of Tokens of type T into a Forest */ -public class Parser { +public abstract class Parser { private final Table pt; @@ -24,16 +24,15 @@ public class Parser { if (p.element() != null) reachable(p.element(), h); } - //public Parser( Topology top) { this(new Table( top)); } - //public Parser(String s, Topology top) { this(new Table(s, top)); } - /** * create a parser to parse the grammar with start symbol u - * @param top a "sample" Topology that can be cloned (FIXME, demanding this is lame) */ - public Parser(Union u, Topology top) { this(new Table(u, top)); } + protected Parser(Union u) { this.pt = new Table(u, top()); } + protected Parser(Table pt) { this.pt = pt; } + + public abstract Forest shiftedToken(T t); + public abstract Topology top(); - Parser(Table pt) { this.pt = pt; } /** 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(); } @@ -46,7 +45,8 @@ public class Parser { for(;;) { GSS.Phase next = gss.new Phase(current, input.next()); current.reduce(); - current.shift(next); + Forest forest = current.token==null ? null : shiftedToken((T)current.token); + current.shift(next, forest); if (current.isDone()) return (Forest)current.finalResult; current.checkFailure(); current = next; @@ -80,12 +80,13 @@ public class Parser { // Table ////////////////////////////////////////////////////////////////////////////// + static class Top extends Union { public Top() { super("0"); } } + /** an SLR(1) parse table which may contain conflicts */ static class Table { private final Union start0 = new Top(); private final Sequence start0seq; - static class Top extends Union { public Top() { super("0"); } } public final Walk.Cache cache = new Walk.Cache();