Skip to content

Commit db377ba

Browse files
committed
Accumulate number tokens properly, handle newline, EQ and EQEQ in rustc lexer.
1 parent 08f191d commit db377ba

File tree

1 file changed

+28
-17
lines changed

1 file changed

+28
-17
lines changed

src/comp/fe/lexer.rs

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,14 @@ fn is_bin_digit(char c) -> bool {
2424
}
2525

2626
fn is_whitespace(char c) -> bool {
27-
ret c == ' ' || c == '\t' || c == '\r';
27+
ret c == ' ' || c == '\t' || c == '\r' || c == '\n';
2828
}
2929

3030
fn next_token(stdio_reader rdr) -> token.token {
3131
auto eof = (-1) as char;
3232
auto c = rdr.getc() as char;
33-
auto accum = "";
33+
auto accum_str = "";
34+
auto accum_int = 0;
3435

3536
while (is_whitespace(c) && c != eof) {
3637
c = rdr.getc() as char;
@@ -40,38 +41,48 @@ fn next_token(stdio_reader rdr) -> token.token {
4041

4142
if (is_alpha(c)) {
4243
while (is_alpha(c)) {
43-
accum += (c as u8);
44+
accum_str += (c as u8);
4445
c = rdr.getc() as char;
4546
}
4647
rdr.ungetc(c as int);
47-
ret token.IDENT(accum);
48+
ret token.IDENT(accum_str);
4849
}
4950

5051
if (is_dec_digit(c)) {
5152
if (c == '0') {
5253
} else {
5354
while (is_dec_digit(c)) {
54-
accum += (c as u8);
55+
accum_int *= 10;
56+
accum_int += (c as int) - ('0' as int);
5557
c = rdr.getc() as char;
5658
}
5759
rdr.ungetc(c as int);
58-
ret token.LIT_INT(0);
60+
ret token.LIT_INT(accum_int);
5961
}
6062
}
6163

6264
// One-byte structural symbols.
6365
alt (c) {
64-
case (';') { ret token.SEMI(); }
65-
case (',') { ret token.COMMA(); }
66-
case ('.') { ret token.DOT(); }
67-
case ('(') { ret token.LPAREN(); }
68-
case (')') { ret token.RPAREN(); }
69-
case ('{') { ret token.LBRACE(); }
70-
case ('}') { ret token.RBRACE(); }
71-
case ('[') { ret token.LBRACKET(); }
72-
case (']') { ret token.RBRACKET(); }
73-
case ('@') { ret token.AT(); }
74-
case ('#') { ret token.POUND(); }
66+
case (';') { ret token.SEMI(); }
67+
case (',') { ret token.COMMA(); }
68+
case ('.') { ret token.DOT(); }
69+
case ('(') { ret token.LPAREN(); }
70+
case (')') { ret token.RPAREN(); }
71+
case ('{') { ret token.LBRACE(); }
72+
case ('}') { ret token.RBRACE(); }
73+
case ('[') { ret token.LBRACKET(); }
74+
case (']') { ret token.RBRACKET(); }
75+
case ('@') { ret token.AT(); }
76+
case ('#') { ret token.POUND(); }
77+
case ('=') {
78+
auto c2 = rdr.getc() as char;
79+
if (c2 == '=') {
80+
ret token.OP(token.EQEQ());
81+
} else {
82+
rdr.ungetc(c2 as int);
83+
ret token.OP(token.EQ());
84+
}
85+
}
7586
}
7687

7788
log "lexer stopping at ";

0 commit comments

Comments
 (0)