90 lines
2.1 KiB
C
90 lines
2.1 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, Typespec *type, Expr *exp){
|
|
Expr *expr = expr_new(p, EK_Cast, token);
|
|
expr->cast.type = type;
|
|
expr->cast.expr = exp;
|
|
return expr;
|
|
}
|
|
|
|
function Expr *
|
|
expr_sizeof_type(Parser *p, Token *token, Typespec *type){
|
|
Expr *expr = expr_new(p, EK_Sizeof, token);
|
|
expr->size_of.kind = SIZEOF_Type;
|
|
expr->size_of.type = type;
|
|
return expr;
|
|
}
|
|
|
|
function Expr *
|
|
expr_sizeof_expr(Parser *p, Token *token, Expr *in_expr){
|
|
Expr *expr = expr_new(p, EK_Sizeof, token);
|
|
expr->size_of.kind = SIZEOF_Expr;
|
|
expr->size_of.expr = in_expr;
|
|
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);
|
|
}
|