about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2010-08-20 15:36:48 -0700
committerGraydon Hoare <graydon@mozilla.com>2010-08-20 15:36:48 -0700
commitdb377bae3a1d9b980ea6eb6f1daf3a72bdeb7b25 (patch)
treef3eb44c3fea0946bd4566bfb9090e8588f3e076e /src/comp
parent08f191d6d9135960f0f706c39c2b2840298a29e2 (diff)
downloadrust-db377bae3a1d9b980ea6eb6f1daf3a72bdeb7b25.tar.gz
rust-db377bae3a1d9b980ea6eb6f1daf3a72bdeb7b25.zip
Accumulate number tokens properly, handle newline, EQ and EQEQ in rustc lexer.
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/fe/lexer.rs45
1 files changed, 28 insertions, 17 deletions
diff --git a/src/comp/fe/lexer.rs b/src/comp/fe/lexer.rs
index 4674224fd9b..b0ee557dde6 100644
--- a/src/comp/fe/lexer.rs
+++ b/src/comp/fe/lexer.rs
@@ -24,13 +24,14 @@ fn is_bin_digit(char c) -> bool {
 }
 
 fn is_whitespace(char c) -> bool {
-    ret c == ' ' || c == '\t' || c == '\r';
+    ret c == ' ' || c == '\t' || c == '\r' || c == '\n';
 }
 
 fn next_token(stdio_reader rdr) -> token.token {
     auto eof = (-1) as char;
     auto c = rdr.getc() as char;
-    auto accum = "";
+    auto accum_str = "";
+    auto accum_int = 0;
 
     while (is_whitespace(c) && c != eof) {
         c = rdr.getc() as char;
@@ -40,38 +41,48 @@ fn next_token(stdio_reader rdr) -> token.token {
 
     if (is_alpha(c)) {
         while (is_alpha(c)) {
-            accum += (c as u8);
+            accum_str += (c as u8);
             c = rdr.getc() as char;
         }
         rdr.ungetc(c as int);
-        ret token.IDENT(accum);
+        ret token.IDENT(accum_str);
     }
 
     if (is_dec_digit(c)) {
         if (c == '0') {
         } else {
             while (is_dec_digit(c)) {
-                accum += (c as u8);
+                accum_int *= 10;
+                accum_int += (c as int) - ('0' as int);
                 c = rdr.getc() as char;
             }
             rdr.ungetc(c as int);
-            ret token.LIT_INT(0);
+            ret token.LIT_INT(accum_int);
         }
     }
 
     // One-byte structural symbols.
     alt (c) {
-    case (';') { ret token.SEMI(); }
-    case (',') { ret token.COMMA(); }
-    case ('.') { ret token.DOT(); }
-    case ('(') { ret token.LPAREN(); }
-    case (')') { ret token.RPAREN(); }
-    case ('{') { ret token.LBRACE(); }
-    case ('}') { ret token.RBRACE(); }
-    case ('[') { ret token.LBRACKET(); }
-    case (']') { ret token.RBRACKET(); }
-    case ('@') { ret token.AT(); }
-    case ('#') { ret token.POUND(); }
+        case (';') { ret token.SEMI(); }
+        case (',') { ret token.COMMA(); }
+        case ('.') { ret token.DOT(); }
+        case ('(') { ret token.LPAREN(); }
+        case (')') { ret token.RPAREN(); }
+        case ('{') { ret token.LBRACE(); }
+        case ('}') { ret token.RBRACE(); }
+        case ('[') { ret token.LBRACKET(); }
+        case (']') { ret token.RBRACKET(); }
+        case ('@') { ret token.AT(); }
+        case ('#') { ret token.POUND(); }
+        case ('=') {
+            auto c2 = rdr.getc() as char;
+            if (c2 == '=') {
+                ret token.OP(token.EQEQ());
+            } else {
+                rdr.ungetc(c2 as int);
+                ret token.OP(token.EQ());
+            }
+        }
     }
 
     log "lexer stopping at ";