Changes in uspace/app/sbi/src/p_expr.c [23de644:1ebc1a62] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/sbi/src/p_expr.c
r23de644 r1ebc1a62 31 31 #include <assert.h> 32 32 #include <stdlib.h> 33 #include "bigint.h"34 33 #include "debug.h" 35 34 #include "lex.h" … … 45 44 static stree_expr_t *parse_comparative(parse_t *parse); 46 45 static stree_expr_t *parse_additive(parse_t *parse); 47 static stree_expr_t *parse_multip(parse_t *parse);48 46 static stree_expr_t *parse_prefix(parse_t *parse); 49 47 static stree_expr_t *parse_prefix_new(parse_t *parse); … … 53 51 static stree_expr_t *parse_pf_index(parse_t *parse, stree_expr_t *a); 54 52 static stree_expr_t *parse_pf_as(parse_t *parse, stree_expr_t *a); 55 static stree_expr_t *parse_paren(parse_t *parse);56 53 static stree_expr_t *parse_primitive(parse_t *parse); 57 54 static stree_expr_t *parse_nameref(parse_t *parse); … … 169 166 stree_expr_t *a, *b, *tmp; 170 167 stree_binop_t *binop; 171 binop_class_t bc; 172 173 a = parse_multip(parse); 174 while (lcur_lc(parse) == lc_plus || lcur_lc(parse) == lc_minus) { 168 169 a = parse_prefix(parse); 170 while (lcur_lc(parse) == lc_plus) { 175 171 if (parse_is_error(parse)) 176 172 break; 177 173 178 switch (lcur_lc(parse)) {179 case lc_plus: bc = bo_plus; break;180 case lc_minus: bc = bo_minus; break;181 default: assert(b_false);182 }183 184 174 lskip(parse); 185 b = parse_ multip(parse);186 187 binop = stree_binop_new(b c);175 b = parse_prefix(parse); 176 177 binop = stree_binop_new(bo_plus); 188 178 binop->arg1 = a; 189 179 binop->arg2 = b; … … 197 187 } 198 188 199 /** Parse multiplicative expression.200 *201 * @param parse Parser object.202 */203 static stree_expr_t *parse_multip(parse_t *parse)204 {205 stree_expr_t *a, *b, *tmp;206 stree_binop_t *binop;207 binop_class_t bc;208 209 a = parse_prefix(parse);210 while (lcur_lc(parse) == lc_mult) {211 if (parse_is_error(parse))212 break;213 214 switch (lcur_lc(parse)) {215 case lc_mult: bc = bo_mult; break;216 default: assert(b_false);217 }218 219 lskip(parse);220 b = parse_prefix(parse);221 222 binop = stree_binop_new(bc);223 binop->arg1 = a;224 binop->arg2 = b;225 226 tmp = stree_expr_new(ec_binop);227 tmp->u.binop = binop;228 a = tmp;229 }230 231 return a;232 }233 234 189 /** Parse prefix expression. 235 190 * … … 239 194 { 240 195 stree_expr_t *a; 241 stree_expr_t *tmp;242 stree_unop_t *unop;243 unop_class_t uc;244 196 245 197 switch (lcur_lc(parse)) { 246 198 case lc_plus: 247 case lc_minus: 248 if (parse_is_error(parse)) 249 return parse_recovery_expr(parse); 250 251 switch (lcur_lc(parse)) { 252 case lc_plus: uc = uo_plus; break; 253 case lc_minus: uc = uo_minus; break; 254 default: assert(b_false); 255 } 256 257 lskip(parse); 258 a = parse_postfix(parse); 259 260 unop = stree_unop_new(uc); 261 unop->arg = a; 262 263 tmp = stree_expr_new(ec_unop); 264 tmp->u.unop = unop; 265 a = tmp; 199 printf("Unimplemented: Unary plus.\n"); 200 a = parse_recovery_expr(parse); 201 parse_note_error(parse); 266 202 break; 267 203 case lc_new: … … 312 248 stree_expr_t *tmp; 313 249 314 a = parse_p aren(parse);250 a = parse_primitive(parse); 315 251 316 252 while (lcur_lc(parse) == lc_period || lcur_lc(parse) == lc_lparen || … … 462 398 } 463 399 464 /** Parse possibly partenthesized expression.465 *466 * @param parse Parser object.467 */468 static stree_expr_t *parse_paren(parse_t *parse)469 {470 stree_expr_t *expr;471 472 if (lcur_lc(parse) == lc_lparen) {473 lskip(parse);474 expr = parse_expr(parse);475 lmatch(parse, lc_rparen);476 } else {477 expr = parse_primitive(parse);478 }479 480 return expr;481 }482 483 484 400 /** Parse primitive expression. 485 401 * … … 543 459 544 460 literal = stree_literal_new(ltc_int); 545 bigint_clone(&lcur(parse)->u.lit_int.value, 546 &literal->u.lit_int.value); 461 literal->u.lit_int.value = lcur(parse)->u.lit_int.value; 547 462 548 463 lskip(parse);
Note:
See TracChangeset
for help on using the changeset viewer.