Files
corelang/expr.c
2022-05-02 09:49:22 +02:00

76 lines
1.7 KiB
C

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);
}