hoisted getLocation() out of Token and into Token.Stream
[sbp.git] / src / edu / berkeley / sbp / Parser.java
index a54fa08..e8e0dc8 100644 (file)
@@ -30,7 +30,7 @@ public abstract class Parser<T extends Token, R> {
     protected Parser(Union u)  { this.pt = new Table(u, top()); }
     protected Parser(Table pt) { this.pt = pt; }
 
     protected Parser(Union u)  { this.pt = new Table(u, top()); }
     protected Parser(Table pt) { this.pt = pt; }
 
-    public abstract Forest<R> shiftedToken(T t);
+    public abstract Forest<R> shiftedToken(T t, Token.Location loc);
     public abstract Topology<T> top();
 
 
     public abstract Topology<T> top();
 
 
@@ -40,12 +40,14 @@ public abstract class Parser<T extends Token, R> {
     /** parse <tt>input</tt>, using the table <tt>pt</tt> to drive the parser */
     public Forest<R> parse(Token.Stream<T> input) throws IOException, Failed {
         GSS gss = new GSS();
     /** parse <tt>input</tt>, using the table <tt>pt</tt> to drive the parser */
     public Forest<R> parse(Token.Stream<T> input) throws IOException, Failed {
         GSS gss = new GSS();
-        GSS.Phase current = gss.new Phase(null, input.next());
+        Token.Location loc = input.getLocation();
+        GSS.Phase current = gss.new Phase(null, input.next(), loc);
         current.newNode(null, null, pt.start, true, null);
         for(;;) {
         current.newNode(null, null, pt.start, true, null);
         for(;;) {
-            GSS.Phase next = gss.new Phase(current, input.next());
+            loc = input.getLocation();
+            GSS.Phase next = gss.new Phase(current, input.next(), loc);
             current.reduce();
             current.reduce();
-            Forest forest = current.token==null ? null : shiftedToken((T)current.token);
+            Forest forest = current.token==null ? null : shiftedToken((T)current.token, loc);
             current.shift(next, forest);
             if (current.isDone()) return (Forest<R>)current.finalResult;
             current.checkFailure();
             current.shift(next, forest);
             if (current.isDone()) return (Forest<R>)current.finalResult;
             current.checkFailure();