Changeset 0b60d2d in mainline for uspace/app/bithenge/script.c


Ignore:
Timestamp:
2012-08-09T04:46:44Z (12 years ago)
Author:
Sean Bartell <wingedtachikoma@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
3c70376
Parents:
d8bd2ec
Message:

Bithenge: add subblob expressions

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/bithenge/script.c

    rd8bd2ec r0b60d2d  
    530530}
    531531
     532static bithenge_expression_t *parse_postfix_expression(state_t *state)
     533{
     534        bithenge_expression_t *expr = parse_term(state);
     535        while (state->error == EOK) {
     536                if (state->token == '[') {
     537                        next_token(state);
     538                        bithenge_expression_t *start = parse_expression(state);
     539                        bool absolute_limit;
     540                        if (state->token == ',') {
     541                                absolute_limit = false;
     542                                next_token(state);
     543                        } else if (state->token == ':') {
     544                                absolute_limit = true;
     545                                next_token(state);
     546                        } else {
     547                                syntax_error(state, "expected ',' or ':'");
     548                        }
     549                        bithenge_expression_t *limit = NULL;
     550                        if (!(state->token == ']' && absolute_limit))
     551                                limit = parse_expression(state);
     552                        expect(state, ']');
     553
     554                        if (state->error != EOK) {
     555                                bithenge_expression_dec_ref(expr);
     556                                bithenge_expression_dec_ref(start);
     557                                bithenge_expression_dec_ref(limit);
     558                                return NULL;
     559                        }
     560                        int rc = bithenge_subblob_expression(&expr, expr,
     561                            start, limit, absolute_limit);
     562                        if (rc != EOK) {
     563                                error_errno(state, rc);
     564                                return NULL;
     565                        }
     566                } else {
     567                        break;
     568                }
     569        }
     570        return expr;
     571}
     572
    532573static bithenge_expression_t *parse_expression_precedence(state_t *state,
    533574    precedence_t prev_precedence)
    534575{
    535         bithenge_expression_t *expr = parse_term(state);
     576        bithenge_expression_t *expr = parse_postfix_expression(state);
    536577        while (state->error == EOK) {
    537578                bithenge_binary_op_t op =
     
    544585                next_token(state);
    545586
    546                 bithenge_expression_t *expr2 = parse_term(state);
     587                bithenge_expression_t *expr2 = parse_postfix_expression(state);
    547588                if (state->error != EOK) {
    548589                        bithenge_expression_dec_ref(expr2);
Note: See TracChangeset for help on using the changeset viewer.