function Expr * expr_new(Parser *p, Expr_Kind kind, Token *token){ Expr *expr = arena_push_struct(&p->main_arena, Expr); expr->kind = kind; expr->token = token; return expr; } function Expr * expr_atom(Parser *p, Token *token){ Expr *expr = expr_new(p, EK_Atom, token); return expr; } function Expr * expr_unary(Parser *p, Token *op, Expr *exp){ Expr *expr = expr_new(p, EK_Unary, op); expr->unary.expr = exp; return expr; } function Expr * expr_binary(Parser *p, Token *op, Expr *left, Expr *right){ Expr *expr = expr_new(p, EK_Binary, op); expr->binary.left = left; expr->binary.right = right; return expr; } function Expr * expr_ternary(Parser *p, Token *op, Expr *cond, Expr *on_true, Expr *on_false){ Expr *expr = expr_new(p, EK_Ternary, op); expr->ternary.cond = cond; expr->ternary.on_true = on_true; expr->ternary.on_false = on_false; return expr; } function Expr * expr_call(Parser *p, Token *token, Expr *atom, Expr *list){ Expr *expr = expr_new(p, EK_Call, token); expr->call.atom = atom; expr->call.list = list; return expr; } function Expr * expr_index(Parser *p, Token *token, Expr *atom, Expr *index){ Expr *expr = expr_new(p, EK_Index, token); expr->index.atom = atom; expr->index.index = index; return expr; } /* function Expr * expr_cast(Parser *p, Token *token, AST_Node *type, Expr *exp){ Expr *expr = expr_new(p, EK_Cast, token); expr->cast.type = type; expr->cast.expr = exp; return expr; } */ function Expr * expr_list(Parser *p, Token *token){ Expr *expr = expr_new(p, EK_List, token); return expr; } function void expr_list_push(Expr *list, Expr *expr){ SLLQueuePush(list->list.first, list->list.last, expr); }