2003/06/16 07:58:57
[org.ibex.core.git] / src / org / xwt / js / Lexer.java
index 4752c64..eb3f69a 100644 (file)
@@ -17,6 +17,8 @@
  * Contributor(s): Roger Lawrence, Mike McCabe
  */
 
+// FIXME: mark lots of these methods 'final' so they get inlined
+
 package org.xwt.js;
 import java.io.*;
 
@@ -32,6 +34,9 @@ class Lexer implements Tokens {
 
     /** the token that was just parsed */
     protected int op;
+   /** the most recently parsed token, <i>regardless of pushbacks</i> */
+    protected int mostRecentlyReadToken;
 
     /** if the token just parsed was a NUMBER, this is the numeric value */
     protected Number number = null;
@@ -39,8 +44,11 @@ class Lexer implements Tokens {
     /** if the token just parsed was a NAME or STRING, this is the string value */
     protected String string = null;
 
-    /** the line number of the current token */
-    protected int line = 0;
+    /** the line number of the most recently <i>lexed</i> token */
+    private int line = 0;
+
+    /** the line number of the most recently <i>parsed</i> token */
+    protected int parserLine = 0;
 
     /** the column number of the current token */
     protected int col = 0;
@@ -52,6 +60,7 @@ class Lexer implements Tokens {
     public Lexer(Reader r, String sourceName, int line) throws IOException {
        this.sourceName = sourceName;
        this.line = line;
+       this.parserLine = line;
        in = new SmartReader(r);
     }
 
@@ -347,7 +356,7 @@ class Lexer implements Tokens {
             lastread = reader.read();
             if (accumulator != null) accumulator.append((char)lastread);
            if (lastread != '\n' && lastread != '\r') col++;
-           if (lastread == '\n') { line++; col = 0; }
+           if (lastread == '\n') { parserLine = ++line; col = 0; }
             return lastread;
         }
 
@@ -400,7 +409,10 @@ class Lexer implements Tokens {
     public int getToken() throws IOException {
        number = null;
        string = null;
-       if (pushBackDepth == 0) return op = _getToken();
+       if (pushBackDepth == 0) {
+           mostRecentlyReadToken = op;
+           return op = _getToken();
+       }
        pushBackDepth--;
        op = pushBackInts[pushBackDepth];
        if (pushBackObjects[pushBackDepth] != null) {