@@ -24,13 +24,14 @@ fn is_bin_digit(char c) -> bool {
24
24
}
25
25
26
26
fn is_whitespace ( char c) -> bool {
27
- ret c == ' ' || c == '\t' || c == '\r' ;
27
+ ret c == ' ' || c == '\t' || c == '\r' || c == '\n' ;
28
28
}
29
29
30
30
fn next_token ( stdio_reader rdr) -> token . token {
31
31
auto eof = ( -1 ) as char ;
32
32
auto c = rdr. getc ( ) as char ;
33
- auto accum = "" ;
33
+ auto accum_str = "" ;
34
+ auto accum_int = 0 ;
34
35
35
36
while ( is_whitespace ( c) && c != eof) {
36
37
c = rdr. getc ( ) as char ;
@@ -40,38 +41,48 @@ fn next_token(stdio_reader rdr) -> token.token {
40
41
41
42
if ( is_alpha ( c) ) {
42
43
while ( is_alpha ( c) ) {
43
- accum += ( c as u8 ) ;
44
+ accum_str += ( c as u8 ) ;
44
45
c = rdr. getc ( ) as char ;
45
46
}
46
47
rdr. ungetc ( c as int ) ;
47
- ret token. IDENT ( accum ) ;
48
+ ret token. IDENT ( accum_str ) ;
48
49
}
49
50
50
51
if ( is_dec_digit ( c) ) {
51
52
if ( c == '0' ) {
52
53
} else {
53
54
while ( is_dec_digit ( c) ) {
54
- accum += ( c as u8 ) ;
55
+ accum_int *= 10 ;
56
+ accum_int += ( c as int ) - ( '0' as int ) ;
55
57
c = rdr. getc ( ) as char ;
56
58
}
57
59
rdr. ungetc ( c as int ) ;
58
- ret token. LIT_INT ( 0 ) ;
60
+ ret token. LIT_INT ( accum_int ) ;
59
61
}
60
62
}
61
63
62
64
// One-byte structural symbols.
63
65
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
+ }
75
86
}
76
87
77
88
log "lexer stopping at " ;
0 commit comments