Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 10334c2e in mainline for uspace/app/bithenge/script.c


Ignore:
Timestamp:
2012-07-30T01:40:55Z (9 years ago)
Author:
Sean Bartell <wingedtachikoma@…>
Branches:
lfn, master
Children:
20ac1a4
Parents:
d1e580a
Message:

Bithenge: add if_transform

File:
1 edited

Legend:

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

    rd1e580a r10334c2e  
    5858
    5959        /* Keywords */
     60        TOKEN_ELSE,
     61        TOKEN_FALSE,
     62        TOKEN_IF,
    6063        TOKEN_STRUCT,
    6164        TOKEN_TRANSFORM,
     65        TOKEN_TRUE,
    6266} token_type_t;
    6367
     
    204208                if (!value) {
    205209                        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);
    206219                } else if (!str_cmp(value, "struct")) {
    207220                        state->token = TOKEN_STRUCT;
     
    209222                } else if (!str_cmp(value, "transform")) {
    210223                        state->token = TOKEN_TRANSFORM;
     224                        free(value);
     225                } else if (!str_cmp(value, "true")) {
     226                        state->token = TOKEN_TRUE;
    211227                        free(value);
    212228                } else {
     
    329345static bithenge_expression_t *parse_expression(state_t *state)
    330346{
    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) {
    332366                bithenge_int_t val = state->token_int;
    333367                next_token(state);
     
    454488
    455489        return result;
     490}
     491
     492static 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;
    456519}
    457520
     
    507570        if (state->token == TOKEN_IDENTIFIER) {
    508571                return parse_invocation(state);
     572        } else if (state->token == TOKEN_IF) {
     573                return parse_if(state);
    509574        } else if (state->token == TOKEN_STRUCT) {
    510575                return parse_struct(state);
Note: See TracChangeset for help on using the changeset viewer.