void free_parsetree(node_t *parsetree) { if (!parsetree) return; free_parsetree(parsetree->left); free_parsetree(parsetree->right); g_free(parsetree); }
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; }