Changeset 20ac1a4 in mainline for uspace/app/bithenge/script.c
- Timestamp:
- 2012-07-30T02:07:10Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 78d3a00
- Parents:
- 10334c2e
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/bithenge/script.c
r10334c2e r20ac1a4 342 342 343 343 static bithenge_transform_t *parse_transform(state_t *state); 344 static bithenge_transform_t *parse_struct(state_t *state); 344 345 345 346 static bithenge_expression_t *parse_expression(state_t *state) … … 490 491 } 491 492 492 static bithenge_transform_t *parse_if(state_t *state )493 static bithenge_transform_t *parse_if(state_t *state, bool in_struct) 493 494 { 494 495 expect(state, TOKEN_IF); … … 497 498 expect(state, ')'); 498 499 expect(state, '{'); 499 bithenge_transform_t *true_xform = parse_transform(state); 500 bithenge_transform_t *true_xform = 501 in_struct ? parse_struct(state) : parse_transform(state); 500 502 expect(state, '}'); 501 expect(state, TOKEN_ELSE); 502 expect(state, '{'); 503 bithenge_transform_t *false_xform = parse_transform(state); 504 expect(state, '}'); 503 bithenge_transform_t *false_xform = NULL; 504 if (state->token == TOKEN_ELSE) { 505 next_token(state); 506 expect(state, '{'); 507 false_xform = 508 in_struct ? parse_struct(state) : parse_transform(state); 509 expect(state, '}'); 510 } else { 511 if (in_struct) { 512 bithenge_node_t *node; 513 int rc = bithenge_new_empty_internal_node(&node); 514 if (rc != EOK) { 515 error_errno(state, rc); 516 goto error; 517 } 518 bithenge_expression_t *expr; 519 rc = bithenge_const_expression(&expr, node); 520 if (rc != EOK) { 521 error_errno(state, rc); 522 goto error; 523 } 524 rc = bithenge_expression_transform(&false_xform, expr); 525 if (rc != EOK) { 526 error_errno(state, rc); 527 false_xform = NULL; 528 goto error; 529 } 530 } else 531 syntax_error(state, "else expected"); 532 } 505 533 if (state->error != EOK) { 534 error: 506 535 bithenge_expression_dec_ref(expr); 507 536 bithenge_transform_dec_ref(true_xform); … … 519 548 } 520 549 550 /* The TOKEN_STRUCT and '{' must already have been skipped. */ 521 551 static bithenge_transform_t *parse_struct(state_t *state) 522 552 { … … 525 555 /* We keep an extra space for the {NULL, NULL} terminator. */ 526 556 subxforms = state_malloc(state, sizeof(*subxforms)); 527 expect(state, TOKEN_STRUCT);528 expect(state, '{');529 557 while (state->error == EOK && state->token != '}') { 530 if (state->token == '.') { 531 expect(state, '.'); 532 subxforms[num].name = expect_identifier(state); 558 if (state->token == TOKEN_IF) { 559 subxforms[num].transform = parse_if(state, true); 560 subxforms[num].name = NULL; 561 } else { 562 if (state->token == '.') { 563 next_token(state); 564 subxforms[num].name = expect_identifier(state); 565 } else { 566 subxforms[num].name = NULL; 567 } 533 568 expect(state, TOKEN_LEFT_ARROW); 534 } else { 535 subxforms[num].name = NULL; 536 expect(state, TOKEN_LEFT_ARROW); 537 } 538 subxforms[num].transform = parse_transform(state); 539 expect(state, ';'); 569 subxforms[num].transform = parse_transform(state); 570 expect(state, ';'); 571 } 540 572 num++; 541 573 subxforms = state_realloc(state, subxforms, 542 574 (num + 1)*sizeof(*subxforms)); 543 575 } 544 expect(state, '}');545 576 546 577 if (state->error != EOK) { … … 571 602 return parse_invocation(state); 572 603 } else if (state->token == TOKEN_IF) { 573 return parse_if(state );604 return parse_if(state, false); 574 605 } else if (state->token == TOKEN_STRUCT) { 575 return parse_struct(state); 606 next_token(state); 607 expect(state, '{'); 608 bithenge_transform_t *xform = parse_struct(state); 609 expect(state, '}'); 610 return xform; 576 611 } else { 577 612 syntax_error(state, "unexpected (transform expected)");
Note:
See TracChangeset
for help on using the changeset viewer.