예제 #1
0
void free_parsetree(node_t *parsetree)
{
    if (!parsetree) return;

    free_parsetree(parsetree->left);
    free_parsetree(parsetree->right);
    g_free(parsetree);
}
예제 #2
0
static node_t *get_parentised_expr(token_stack_t *stack, GError **err)
{
    token_t *token;
    GError *tmp_err = NULL;
    node_t *node;

    // '('
    token = token_pop(stack);
    if (!token || token->type != TOK_LPAREN) {
        set_error(err, "Expected '('", token);
        g_free(token);
        return NULL;
    }

    // expr
    node = get_expr(stack, &tmp_err); 
    if (tmp_err) {
        g_propagate_error(err, tmp_err);
        free_parsetree(node);
        return NULL;
    }

    if (!node) { 
        // Re-use the RPAREN token for this error message.
        token->position++;
        set_error(err, "Expected expression", token);
    }
    g_free(token);

    // ')'
    token = token_pop(stack);
    if (!token || token->type != TOK_RPAREN) {
        free_parsetree(node);
        set_error(err, "Expected ')'", token);
        g_free(token);
        return NULL;
    }

    g_free(token);
    return node;
}