aboutsummaryrefslogtreecommitdiff
path: root/src/comp
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-08-20 15:36:48 -0700
committerGraydon Hoare <[email protected]>2010-08-20 15:36:48 -0700
commitdb377bae3a1d9b980ea6eb6f1daf3a72bdeb7b25 (patch)
treef3eb44c3fea0946bd4566bfb9090e8588f3e076e /src/comp
parentLex commas too in the self-hosted compiler (diff)
downloadrust-db377bae3a1d9b980ea6eb6f1daf3a72bdeb7b25.tar.xz
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 4674224f..b0ee557d 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 ";