new expr resolution eval visualization stage; use to implement array & slice view rules

This commit is contained in:
Ryan Fleury
2024-08-27 11:04:22 -07:00
parent a97c8bd070
commit 5b29f0db47
11 changed files with 348 additions and 161 deletions
+1 -1
View File
@@ -84,7 +84,7 @@ E_ExprKindTable:
{ Deref UnaryPrefix 2 "*" "*" "" "" }
{ Address UnaryPrefix 2 "&" "&" "" "" }
{ Cast Null 1 "cast" "" "" "" }
{ Cast Null 1 "cast" "(" ")" "" }
{ Sizeof UnaryPrefix 1 "sizeof" "sizeof" "" "" }
{ Neg UnaryPrefix 2 "-" "-" "" "" }
+21
View File
@@ -662,6 +662,15 @@ e_expr_ref(Arena *arena, E_Expr *ref)
return expr;
}
internal E_Expr *
e_expr_ref_addr(Arena *arena, E_Expr *rhs)
{
E_Expr *expr = e_push_expr(arena, E_ExprKind_Address, 0);
E_Expr *rhs_ref = e_expr_ref(arena, rhs);
e_expr_push_child(expr, rhs_ref);
return expr;
}
internal E_Expr *
e_expr_ref_member_access(Arena *arena, E_Expr *lhs, String8 member_name)
{
@@ -695,6 +704,18 @@ e_expr_ref_deref(Arena *arena, E_Expr *rhs)
return root;
}
internal E_Expr *
e_expr_ref_cast(Arena *arena, E_TypeKey type_key, E_Expr *rhs)
{
E_Expr *root = e_push_expr(arena, E_ExprKind_Cast, 0);
E_Expr *lhs = e_push_expr(arena, E_ExprKind_TypeIdent, 0);
lhs->type_key = type_key;
E_Expr *rhs_ref = e_expr_ref(arena, rhs);
e_expr_push_child(root, lhs);
e_expr_push_child(root, rhs_ref);
return root;
}
////////////////////////////////
//~ rjf: Expression Tree -> String Conversions
+2
View File
@@ -217,9 +217,11 @@ internal E_Expr *e_push_expr(Arena *arena, E_ExprKind kind, void *location);
internal void e_expr_push_child(E_Expr *parent, E_Expr *child);
internal E_Expr *e_expr_ref(Arena *arena, E_Expr *ref);
internal E_Expr *e_expr_ref_addr(Arena *arena, E_Expr *rhs);
internal E_Expr *e_expr_ref_member_access(Arena *arena, E_Expr *lhs, String8 member_name);
internal E_Expr *e_expr_ref_array_index(Arena *arena, E_Expr *lhs, U64 index);
internal E_Expr *e_expr_ref_deref(Arena *arena, E_Expr *rhs);
internal E_Expr *e_expr_ref_cast(Arena *arena, E_TypeKey type_key, E_Expr *rhs);
////////////////////////////////
//~ rjf: Expression Tree -> String Conversions
+1 -1
View File
@@ -85,7 +85,7 @@ E_OpInfo e_expr_kind_op_info_table[44] =
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp("."), str8_lit_comp("MemberAccess") },
{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("*"), str8_lit_comp(""), str8_lit_comp("Deref") },
{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("&"), str8_lit_comp(""), str8_lit_comp("Address") },
{ E_OpKind_Null, 1, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("Cast") },
{ E_OpKind_Null, 1, str8_lit_comp("("), str8_lit_comp(")"), str8_lit_comp("Cast") },
{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("sizeof"), str8_lit_comp(""), str8_lit_comp("Sizeof") },
{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("-"), str8_lit_comp(""), str8_lit_comp("Neg") },
{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("!"), str8_lit_comp(""), str8_lit_comp("LogNot") },