Changeset 94d484a in mainline for uspace/app/sbi/src/p_type.c
- Timestamp:
- 2010-03-07T17:45:33Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- d0febca
- Parents:
- fa36f29
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/sbi/src/p_type.c
rfa36f29 r94d484a 1 /* 1 /* YI 2 2 * Copyright (c) 2010 Jiri Svoboda 3 3 * All rights reserved. … … 35 35 #include "mytypes.h" 36 36 #include "parse.h" 37 #include "p_expr.h" 37 38 #include "stree.h" 38 39 … … 41 42 static stree_texpr_t *parse_tapply(parse_t *parse); 42 43 static stree_texpr_t *parse_tpostfix(parse_t *parse); 44 static stree_texpr_t *parse_pf_taccess(parse_t *parse, stree_texpr_t *a); 45 static stree_texpr_t *parse_pf_tindex(parse_t *parse, stree_texpr_t *a); 43 46 static stree_texpr_t *parse_tprimitive(parse_t *parse); 44 47 static stree_tliteral_t *parse_tliteral(parse_t *parse); … … 78 81 { 79 82 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. */ 108 static stree_texpr_t *parse_pf_taccess(parse_t *parse, stree_texpr_t *a) 109 { 110 stree_texpr_t *texpr; 80 111 stree_ident_t *ident; 81 stree_texpr_t *tmp;82 112 stree_taccess_t *taccess; 83 113 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. */ 128 static 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; 100 167 } 101 168
Note:
See TracChangeset
for help on using the changeset viewer.