@@ -132,40 +132,77 @@ state fn parse_seq[T](token.token bra,
132
132
ret v;
133
133
}
134
134
135
- state fn parse_lit ( parser p) -> ast . lit {
135
+ state fn parse_lit ( parser p) -> @ ast. lit {
136
136
alt ( p. peek ( ) ) {
137
137
case ( token. LIT_INT ( ?i) ) {
138
138
p. bump ( ) ;
139
- ret ast. lit_int ( i) ;
139
+ ret @ ast. lit_int ( i) ;
140
140
}
141
141
case ( token. LIT_UINT ( ?u) ) {
142
142
p. bump ( ) ;
143
- ret ast. lit_uint ( u) ;
143
+ ret @ ast. lit_uint ( u) ;
144
144
}
145
145
case ( token. LIT_CHAR ( ?c) ) {
146
146
p. bump ( ) ;
147
- ret ast. lit_char ( c) ;
147
+ ret @ ast. lit_char ( c) ;
148
148
}
149
149
case ( token. LIT_BOOL ( ?b) ) {
150
150
p. bump ( ) ;
151
- ret ast. lit_bool ( b) ;
151
+ ret @ ast. lit_bool ( b) ;
152
152
}
153
153
}
154
154
p. err ( "expected literal" ) ;
155
155
fail;
156
156
}
157
157
158
- state fn parse_atom ( parser p) -> ast. atom {
159
- ret ast. atom_lit ( @parse_lit ( p) ) ;
158
+
159
+
160
+ state fn parse_bottom_expr ( parser p) -> @ast . expr {
161
+ alt ( p. peek ( ) ) {
162
+ case ( token. LPAREN ) {
163
+ p. bump ( ) ;
164
+ auto e = parse_expr ( p) ;
165
+ expect ( p, token. RPAREN ) ;
166
+ ret e;
167
+ }
168
+
169
+ case ( _) {
170
+ ret @ast. expr_lit ( parse_lit ( p) ) ;
171
+ }
172
+ }
173
+ }
174
+
175
+
176
+ state fn parse_negation_expr ( parser p) -> @ast . expr {
177
+ alt ( p. peek ( ) ) {
178
+
179
+ case ( token. NOT ) {
180
+ auto e = parse_negation_expr ( p) ;
181
+ ret @ast. expr_unary ( ast. not , e) ;
182
+ }
183
+
184
+ case ( token. TILDE ) {
185
+ auto e = parse_negation_expr ( p) ;
186
+ ret @ast. expr_unary ( ast. bitnot , e) ;
187
+ }
188
+
189
+ case ( _) {
190
+ ret parse_bottom_expr ( p) ;
191
+ }
192
+ }
193
+ }
194
+
195
+ state fn parse_expr ( parser p) -> @ast . expr {
196
+ ret parse_negation_expr ( p) ;
160
197
}
161
198
162
199
state fn parse_stmt ( parser p) -> @ast . stmt {
163
200
alt ( p. peek ( ) ) {
164
201
case ( token. LOG ) {
165
202
p. bump ( ) ;
166
- auto a = @ parse_atom ( p) ;
203
+ auto e = parse_expr ( p) ;
167
204
expect ( p, token. SEMI ) ;
168
- ret @ast. stmt_log ( a ) ;
205
+ ret @ast. stmt_log ( e ) ;
169
206
}
170
207
}
171
208
p. err ( "expected statement" ) ;
0 commit comments