Changeset 10334c2e in mainline for uspace/app/bithenge/script.c
- Timestamp:
- 2012-07-30T01:40:55Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 20ac1a4
- Parents:
- d1e580a
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/bithenge/script.c
rd1e580a r10334c2e 58 58 59 59 /* Keywords */ 60 TOKEN_ELSE, 61 TOKEN_FALSE, 62 TOKEN_IF, 60 63 TOKEN_STRUCT, 61 64 TOKEN_TRANSFORM, 65 TOKEN_TRUE, 62 66 } token_type_t; 63 67 … … 204 208 if (!value) { 205 209 error_errno(state, ENOMEM); 210 } else if (!str_cmp(value, "else")) { 211 state->token = TOKEN_ELSE; 212 free(value); 213 } else if (!str_cmp(value, "false")) { 214 state->token = TOKEN_FALSE; 215 free(value); 216 } else if (!str_cmp(value, "if")) { 217 state->token = TOKEN_IF; 218 free(value); 206 219 } else if (!str_cmp(value, "struct")) { 207 220 state->token = TOKEN_STRUCT; … … 209 222 } else if (!str_cmp(value, "transform")) { 210 223 state->token = TOKEN_TRANSFORM; 224 free(value); 225 } else if (!str_cmp(value, "true")) { 226 state->token = TOKEN_TRUE; 211 227 free(value); 212 228 } else { … … 329 345 static bithenge_expression_t *parse_expression(state_t *state) 330 346 { 331 if (state->token == TOKEN_INTEGER) { 347 if (state->token == TOKEN_TRUE || state->token == TOKEN_FALSE) { 348 bool val = state->token == TOKEN_TRUE; 349 next_token(state); 350 bithenge_node_t *node; 351 int rc = bithenge_new_boolean_node(&node, val); 352 if (rc != EOK) { 353 error_errno(state, rc); 354 return NULL; 355 } 356 357 bithenge_expression_t *expr; 358 rc = bithenge_const_expression(&expr, node); 359 if (rc != EOK) { 360 error_errno(state, rc); 361 return NULL; 362 } 363 364 return expr; 365 } else if (state->token == TOKEN_INTEGER) { 332 366 bithenge_int_t val = state->token_int; 333 367 next_token(state); … … 454 488 455 489 return result; 490 } 491 492 static bithenge_transform_t *parse_if(state_t *state) 493 { 494 expect(state, TOKEN_IF); 495 expect(state, '('); 496 bithenge_expression_t *expr = parse_expression(state); 497 expect(state, ')'); 498 expect(state, '{'); 499 bithenge_transform_t *true_xform = parse_transform(state); 500 expect(state, '}'); 501 expect(state, TOKEN_ELSE); 502 expect(state, '{'); 503 bithenge_transform_t *false_xform = parse_transform(state); 504 expect(state, '}'); 505 if (state->error != EOK) { 506 bithenge_expression_dec_ref(expr); 507 bithenge_transform_dec_ref(true_xform); 508 bithenge_transform_dec_ref(false_xform); 509 return NULL; 510 } 511 bithenge_transform_t *if_xform; 512 int rc = bithenge_if_transform(&if_xform, expr, true_xform, 513 false_xform); 514 if (rc != EOK) { 515 error_errno(state, rc); 516 return NULL; 517 } 518 return if_xform; 456 519 } 457 520 … … 507 570 if (state->token == TOKEN_IDENTIFIER) { 508 571 return parse_invocation(state); 572 } else if (state->token == TOKEN_IF) { 573 return parse_if(state); 509 574 } else if (state->token == TOKEN_STRUCT) { 510 575 return parse_struct(state);
Note:
See TracChangeset
for help on using the changeset viewer.