Changeset 94d484a in mainline for uspace/app/sbi/src/p_type.c


Ignore:
Timestamp:
2010-03-07T17:45:33Z (14 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d0febca
Parents:
fa36f29
Message:

Update SBI to rev. 90.

File:
1 edited

Legend:

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

    rfa36f29 r94d484a  
    1 /*
     1/*                              YI
    22 * Copyright (c) 2010 Jiri Svoboda
    33 * All rights reserved.
     
    3535#include "mytypes.h"
    3636#include "parse.h"
     37#include "p_expr.h"
    3738#include "stree.h"
    3839
     
    4142static stree_texpr_t *parse_tapply(parse_t *parse);
    4243static stree_texpr_t *parse_tpostfix(parse_t *parse);
     44static stree_texpr_t *parse_pf_taccess(parse_t *parse, stree_texpr_t *a);
     45static stree_texpr_t *parse_pf_tindex(parse_t *parse, stree_texpr_t *a);
    4346static stree_texpr_t *parse_tprimitive(parse_t *parse);
    4447static stree_tliteral_t *parse_tliteral(parse_t *parse);
     
    7881{
    7982        stree_texpr_t *a;
     83        stree_texpr_t *tmp;
     84
     85        a = parse_tprimitive(parse);
     86
     87        while (lcur_lc(parse) == lc_period || lcur_lc(parse) == lc_lsbr) {
     88
     89                switch (lcur_lc(parse)) {
     90                case lc_period:
     91                        tmp = parse_pf_taccess(parse, a);
     92                        break;
     93                case lc_lsbr:
     94                        tmp = parse_pf_tindex(parse, a);
     95                        break;
     96                default:
     97                        lunexpected_error(parse);
     98                        exit(1);
     99                }
     100
     101                a = tmp;
     102        }
     103
     104        return a;
     105}
     106
     107/** Parse access type expression. */
     108static stree_texpr_t *parse_pf_taccess(parse_t *parse, stree_texpr_t *a)
     109{
     110        stree_texpr_t *texpr;
    80111        stree_ident_t *ident;
    81         stree_texpr_t *tmp;
    82112        stree_taccess_t *taccess;
    83113
    84         a = parse_tprimitive(parse);
    85 
    86         while (lcur_lc(parse) == lc_period) {
    87                 lskip(parse);
    88                 ident = parse_ident(parse);
    89 
    90                 taccess = stree_taccess_new();
    91                 taccess->arg = a;
    92                 taccess->member_name = ident;
    93 
    94                 tmp = stree_texpr_new(tc_taccess);
    95                 tmp->u.taccess = taccess;
    96                 a = tmp;
    97         }
    98 
    99         return a;
     114        lmatch(parse, lc_period);
     115        ident = parse_ident(parse);
     116
     117        taccess = stree_taccess_new();
     118        taccess->arg = a;
     119        taccess->member_name = ident;
     120
     121        texpr = stree_texpr_new(tc_taccess);
     122        texpr->u.taccess = taccess;
     123
     124        return texpr;
     125}
     126
     127/** Parse index type expression. */
     128static stree_texpr_t *parse_pf_tindex(parse_t *parse, stree_texpr_t *a)
     129{
     130        stree_texpr_t *texpr;
     131        stree_tindex_t *tindex;
     132        stree_expr_t *expr;
     133
     134        tindex = stree_tindex_new();
     135        tindex->base_type = a;
     136
     137        tindex->n_args = 0;
     138        list_init(&tindex->args);
     139
     140        lmatch(parse, lc_lsbr);
     141
     142        if (lcur_lc(parse) != lc_rsbr && lcur_lc(parse) != lc_comma) {
     143                while (b_true) {
     144                        expr = parse_expr(parse);
     145                        tindex->n_args += 1;
     146                        list_append(&tindex->args, expr);
     147
     148                        if (lcur_lc(parse) == lc_rsbr)
     149                                break;
     150
     151                        lmatch(parse, lc_comma);
     152                }
     153        } else {
     154                tindex->n_args = 1;
     155                while (lcur_lc(parse) == lc_comma) {
     156                        lskip(parse);
     157                        tindex->n_args += 1;
     158                }
     159        }
     160
     161        lmatch(parse, lc_rsbr);
     162
     163        texpr = stree_texpr_new(tc_tindex);
     164        texpr->u.tindex = tindex;
     165
     166        return texpr;
    100167}
    101168
Note: See TracChangeset for help on using the changeset viewer.