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


Ignore:
Timestamp:
2010-02-27T17:59:14Z (14 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
94d484a
Parents:
09ababb7
Message:

Update SBI to rev. 75.

File:
1 edited

Legend:

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

    r09ababb7 rfa36f29  
    3434#include "list.h"
    3535#include "mytypes.h"
     36#include "p_type.h"
    3637#include "parse.h"
    3738#include "stree.h"
     
    4243static stree_expr_t *parse_comparative(parse_t *parse);
    4344static stree_expr_t *parse_additive(parse_t *parse);
     45static stree_expr_t *parse_prefix(parse_t *parse);
     46static stree_expr_t *parse_prefix_new(parse_t *parse);
    4447static stree_expr_t *parse_postfix(parse_t *parse);
    4548static stree_expr_t *parse_pf_access(parse_t *parse, stree_expr_t *a);
     
    4851static stree_expr_t *parse_nameref(parse_t *parse);
    4952static stree_expr_t *parse_lit_int(parse_t *parse);
     53static stree_expr_t *parse_lit_ref(parse_t *parse);
    5054static stree_expr_t *parse_lit_string(parse_t *parse);
     55static stree_expr_t *parse_self_ref(parse_t *parse);
    5156
    5257/** Parse expression. */
     
    130135        stree_binop_t *binop;
    131136
    132         a = parse_postfix(parse);
     137        a = parse_prefix(parse);
    133138        while (lcur_lc(parse) == lc_plus) {
    134139                lskip(parse);
    135                 b = parse_postfix(parse);
     140                b = parse_prefix(parse);
    136141
    137142                binop = stree_binop_new(bo_plus);
     
    145150
    146151        return a;
     152}
     153
     154/** Parse prefix expression. */
     155static stree_expr_t *parse_prefix(parse_t *parse)
     156{
     157        stree_expr_t *a;
     158
     159        switch (lcur_lc(parse)) {
     160        case lc_plus:
     161                printf("Unimplemented: Unary plus.\n");
     162                exit(1);
     163        case lc_new:
     164                a = parse_prefix_new(parse);
     165                break;
     166        default:
     167                a = parse_postfix(parse);
     168                break;
     169        }
     170
     171        return a;
     172}
     173
     174/** Parse @c new operator. */
     175static stree_expr_t *parse_prefix_new(parse_t *parse)
     176{
     177        stree_texpr_t *texpr;
     178        stree_new_t *new_op;
     179        stree_expr_t *expr;
     180
     181        lmatch(parse, lc_new);
     182        texpr = parse_texpr(parse);
     183        lmatch(parse, lc_lparen);
     184        lmatch(parse, lc_rparen);
     185
     186        new_op = stree_new_new();
     187        new_op->texpr = texpr;
     188        expr = stree_expr_new(ec_new);
     189        expr->u.new_op = new_op;
     190
     191        return expr;
    147192}
    148193
     
    240285                expr = parse_lit_int(parse);
    241286                break;
     287        case lc_nil:
     288                expr = parse_lit_ref(parse);
     289                break;
    242290        case lc_lit_string:
    243291                expr = parse_lit_string(parse);
     292                break;
     293        case lc_self:
     294                expr = parse_self_ref(parse);
    244295                break;
    245296        default:
     
    284335}
    285336
     337/** Parse reference literal (@c nil). */
     338static stree_expr_t *parse_lit_ref(parse_t *parse)
     339{
     340        stree_literal_t *literal;
     341        stree_expr_t *expr;
     342
     343        lmatch(parse, lc_nil);
     344
     345        literal = stree_literal_new(ltc_ref);
     346
     347        expr = stree_expr_new(ec_literal);
     348        expr->u.literal = literal;
     349
     350        return expr;
     351}
     352
    286353/** Parse string literal. */
    287354static stree_expr_t *parse_lit_string(parse_t *parse)
     
    302369        return expr;
    303370}
     371
     372/** Parse @c self keyword. */
     373static stree_expr_t *parse_self_ref(parse_t *parse)
     374{
     375        stree_self_ref_t *self_ref;
     376        stree_expr_t *expr;
     377
     378        lmatch(parse, lc_self);
     379
     380        self_ref = stree_self_ref_new();
     381
     382        expr = stree_expr_new(ec_self_ref);
     383        expr->u.self_ref = self_ref;
     384
     385        return expr;
     386}
Note: See TracChangeset for help on using the changeset viewer.