Changeset 23de644 in mainline for uspace/app/sbi/src/p_expr.c


Ignore:
Timestamp:
2010-04-04T22:31:01Z (15 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
074444f, ecb6ac32
Parents:
3aae4e8
Message:

Update SBI to rev. 174.

File:
1 edited

Legend:

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

    r3aae4e8 r23de644  
    3131#include <assert.h>
    3232#include <stdlib.h>
     33#include "bigint.h"
    3334#include "debug.h"
    3435#include "lex.h"
     
    4445static stree_expr_t *parse_comparative(parse_t *parse);
    4546static stree_expr_t *parse_additive(parse_t *parse);
     47static stree_expr_t *parse_multip(parse_t *parse);
    4648static stree_expr_t *parse_prefix(parse_t *parse);
    4749static stree_expr_t *parse_prefix_new(parse_t *parse);
     
    5153static stree_expr_t *parse_pf_index(parse_t *parse, stree_expr_t *a);
    5254static stree_expr_t *parse_pf_as(parse_t *parse, stree_expr_t *a);
     55static stree_expr_t *parse_paren(parse_t *parse);
    5356static stree_expr_t *parse_primitive(parse_t *parse);
    5457static stree_expr_t *parse_nameref(parse_t *parse);
     
    166169        stree_expr_t *a, *b, *tmp;
    167170        stree_binop_t *binop;
    168 
    169         a = parse_prefix(parse);
    170         while (lcur_lc(parse) == lc_plus) {
     171        binop_class_t bc;
     172
     173        a = parse_multip(parse);
     174        while (lcur_lc(parse) == lc_plus || lcur_lc(parse) == lc_minus) {
    171175                if (parse_is_error(parse))
    172176                        break;
    173177
     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
    174184                lskip(parse);
    175                 b = parse_prefix(parse);
    176 
    177                 binop = stree_binop_new(bo_plus);
     185                b = parse_multip(parse);
     186
     187                binop = stree_binop_new(bc);
    178188                binop->arg1 = a;
    179189                binop->arg2 = b;
     
    187197}
    188198
     199/** Parse multiplicative expression.
     200 *
     201 * @param parse         Parser object.
     202 */
     203static 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
    189234/** Parse prefix expression.
    190235 *
     
    194239{
    195240        stree_expr_t *a;
     241        stree_expr_t *tmp;
     242        stree_unop_t *unop;
     243        unop_class_t uc;
    196244
    197245        switch (lcur_lc(parse)) {
    198246        case lc_plus:
    199                 printf("Unimplemented: Unary plus.\n");
    200                 a = parse_recovery_expr(parse);
    201                 parse_note_error(parse);
     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;
    202266                break;
    203267        case lc_new:
     
    248312        stree_expr_t *tmp;
    249313
    250         a = parse_primitive(parse);
     314        a = parse_paren(parse);
    251315
    252316        while (lcur_lc(parse) == lc_period || lcur_lc(parse) == lc_lparen ||
     
    398462}
    399463
     464/** Parse possibly partenthesized expression.
     465 *
     466 * @param parse         Parser object.
     467 */
     468static 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
    400484/** Parse primitive expression.
    401485 *
     
    459543
    460544        literal = stree_literal_new(ltc_int);
    461         literal->u.lit_int.value = lcur(parse)->u.lit_int.value;
     545        bigint_clone(&lcur(parse)->u.lit_int.value,
     546            &literal->u.lit_int.value);
    462547
    463548        lskip(parse);
Note: See TracChangeset for help on using the changeset viewer.