Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/sbi/src/p_expr.c

    r23de644 r1ebc1a62  
    3131#include <assert.h>
    3232#include <stdlib.h>
    33 #include "bigint.h"
    3433#include "debug.h"
    3534#include "lex.h"
     
    4544static stree_expr_t *parse_comparative(parse_t *parse);
    4645static stree_expr_t *parse_additive(parse_t *parse);
    47 static stree_expr_t *parse_multip(parse_t *parse);
    4846static stree_expr_t *parse_prefix(parse_t *parse);
    4947static stree_expr_t *parse_prefix_new(parse_t *parse);
     
    5351static stree_expr_t *parse_pf_index(parse_t *parse, stree_expr_t *a);
    5452static stree_expr_t *parse_pf_as(parse_t *parse, stree_expr_t *a);
    55 static stree_expr_t *parse_paren(parse_t *parse);
    5653static stree_expr_t *parse_primitive(parse_t *parse);
    5754static stree_expr_t *parse_nameref(parse_t *parse);
     
    169166        stree_expr_t *a, *b, *tmp;
    170167        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) {
    175171                if (parse_is_error(parse))
    176172                        break;
    177173
    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 
    184174                lskip(parse);
    185                 b = parse_multip(parse);
    186 
    187                 binop = stree_binop_new(bc);
     175                b = parse_prefix(parse);
     176
     177                binop = stree_binop_new(bo_plus);
    188178                binop->arg1 = a;
    189179                binop->arg2 = b;
     
    197187}
    198188
    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 
    234189/** Parse prefix expression.
    235190 *
     
    239194{
    240195        stree_expr_t *a;
    241         stree_expr_t *tmp;
    242         stree_unop_t *unop;
    243         unop_class_t uc;
    244196
    245197        switch (lcur_lc(parse)) {
    246198        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);
    266202                break;
    267203        case lc_new:
     
    312248        stree_expr_t *tmp;
    313249
    314         a = parse_paren(parse);
     250        a = parse_primitive(parse);
    315251
    316252        while (lcur_lc(parse) == lc_period || lcur_lc(parse) == lc_lparen ||
     
    462398}
    463399
    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 
    484400/** Parse primitive expression.
    485401 *
     
    543459
    544460        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;
    547462
    548463        lskip(parse);
Note: See TracChangeset for help on using the changeset viewer.