@@ -56,16 +56,24 @@ fn next_token(stdio_reader rdr) -> token.token {
56
56
auto accum_str = "" ;
57
57
auto accum_int = 0 ;
58
58
59
+ fn next ( stdio_reader rdr) -> char {
60
+ ret rdr. getc ( ) as char ;
61
+ }
62
+
63
+ fn forget ( stdio_reader rdr, char c) {
64
+ rdr. ungetc ( c as int ) ;
65
+ }
66
+
59
67
c = consume_any_whitespace ( rdr, c) ;
60
68
61
69
if ( c == eof) { ret token. EOF ( ) ; }
62
70
63
71
if ( is_alpha ( c) ) {
64
72
while ( is_alpha ( c) ) {
65
73
accum_str += ( c as u8 ) ;
66
- c = rdr . getc ( ) as char ;
74
+ c = next ( rdr ) ;
67
75
}
68
- rdr . ungetc ( c as int ) ;
76
+ forget ( rdr , c ) ;
69
77
ret token. IDENT ( accum_str) ;
70
78
}
71
79
@@ -75,9 +83,9 @@ fn next_token(stdio_reader rdr) -> token.token {
75
83
while ( is_dec_digit ( c) ) {
76
84
accum_int *= 10 ;
77
85
accum_int += ( c as int ) - ( '0' as int ) ;
78
- c = rdr . getc ( ) as char ;
86
+ c = next ( rdr ) ;
79
87
}
80
- rdr . ungetc ( c as int ) ;
88
+ forget ( rdr , c ) ;
81
89
ret token. LIT_INT ( accum_int) ;
82
90
}
83
91
}
@@ -88,7 +96,7 @@ fn next_token(stdio_reader rdr) -> token.token {
88
96
if ( c2 == '=' ) {
89
97
ret token. OPEQ ( op) ;
90
98
} else {
91
- rdr . ungetc ( c2 as int ) ;
99
+ forget ( rdr , c2 ) ;
92
100
ret token. OP ( op) ;
93
101
}
94
102
}
@@ -109,17 +117,17 @@ fn next_token(stdio_reader rdr) -> token.token {
109
117
110
118
// Multi-byte tokens.
111
119
case ( '=' ) {
112
- auto c2 = rdr . getc ( ) as char ;
120
+ auto c2 = next ( rdr ) ;
113
121
if ( c2 == '=' ) {
114
122
ret token. OP ( token. EQEQ ( ) ) ;
115
123
} else {
116
- rdr . ungetc ( c2 as int ) ;
124
+ forget ( rdr , c2 ) ;
117
125
ret token. OP ( token. EQ ( ) ) ;
118
126
}
119
127
}
120
128
121
129
case ( '-' ) {
122
- auto c2 = rdr . getc ( ) as char ;
130
+ auto c2 = next ( rdr ) ;
123
131
if ( c2 == '>' ) {
124
132
ret token. RARROW ( ) ;
125
133
} else {
@@ -128,7 +136,7 @@ fn next_token(stdio_reader rdr) -> token.token {
128
136
}
129
137
130
138
case ( '&' ) {
131
- auto c2 = rdr . getc ( ) as char ;
139
+ auto c2 = next ( rdr ) ;
132
140
if ( c2 == '&' ) {
133
141
ret token. OP ( token. ANDAND ( ) ) ;
134
142
} else {
@@ -137,27 +145,27 @@ fn next_token(stdio_reader rdr) -> token.token {
137
145
}
138
146
139
147
case ( '+' ) {
140
- ret op_or_opeq ( rdr, rdr . getc ( ) as char , token. PLUS ( ) ) ;
148
+ ret op_or_opeq ( rdr, next ( rdr ) , token. PLUS ( ) ) ;
141
149
}
142
150
143
151
case ( '*' ) {
144
- ret op_or_opeq ( rdr, rdr . getc ( ) as char , token. STAR ( ) ) ;
152
+ ret op_or_opeq ( rdr, next ( rdr ) , token. STAR ( ) ) ;
145
153
}
146
154
147
155
case ( '/' ) {
148
- ret op_or_opeq ( rdr, rdr . getc ( ) as char , token. STAR ( ) ) ;
156
+ ret op_or_opeq ( rdr, next ( rdr ) , token. STAR ( ) ) ;
149
157
}
150
158
151
159
case ( '!' ) {
152
- ret op_or_opeq ( rdr, rdr . getc ( ) as char , token. NOT ( ) ) ;
160
+ ret op_or_opeq ( rdr, next ( rdr ) , token. NOT ( ) ) ;
153
161
}
154
162
155
163
case ( '^' ) {
156
- ret op_or_opeq ( rdr, rdr . getc ( ) as char , token. CARET ( ) ) ;
164
+ ret op_or_opeq ( rdr, next ( rdr ) , token. CARET ( ) ) ;
157
165
}
158
166
159
167
case ( '%' ) {
160
- ret op_or_opeq ( rdr, rdr . getc ( ) as char , token. PERCENT ( ) ) ;
168
+ ret op_or_opeq ( rdr, next ( rdr ) , token. PERCENT ( ) ) ;
161
169
}
162
170
163
171
}
0 commit comments