Initial enums working

This commit is contained in:
Krzosa Karol
2022-05-31 11:50:36 +02:00
parent 5e0aabb1cb
commit 627e2bad88
8 changed files with 168 additions and 17 deletions

View File

@@ -100,6 +100,8 @@ enum Ast_Kind: U32{
AST_BLOCK,
AST_LAMBDA,
AST_LAMBDA_ARG,
AST_ENUM,
AST_ENUM_MEMBER,
AST_STRUCT,
AST_CONST,
AST_VAR,
@@ -112,7 +114,8 @@ enum{
AST_BINDING = 4,
AST_AGGREGATE = 8,
AST_ATOM = 16,
AST_ITEM_INCLUDED = 32,
AST_AGGREGATE_CHILD = 32,
AST_ITEM_INCLUDED = 64,
};
struct Ast{
@@ -191,11 +194,6 @@ struct Ast_If: Ast{
Array<Ast_If_Node *> ifs;
};
struct Ast_Enum : Ast{
Ast_Expr *typespec;
Array<Ast_Init *> children;
};
struct Ast_Lambda_Arg: Ast_Expr{
Intern_String name;
Ast_Expr *typespec;
@@ -224,18 +222,29 @@ struct Ast_Var: Ast_Named{
struct Ast_Const;
struct Ast_Resolved_Type;
struct Ast_Struct: Ast_Expr{
struct Ast_Struct: Ast{
// Required to be Ast_Struct or Ast_Var or Ast_Const
Array<Ast_Var *> members;
Array<Ast_Const *> const_members;
Ast_Resolved_Type *type;
};
struct Ast_Enum_Member: Ast{
Intern_String name;
Ast_Expr *value;
};
struct Ast_Enum: Ast{
Ast_Expr *typespec;
Array<Ast_Enum_Member *> members;
};
struct Ast_Const: Ast_Named{
union{
Ast *ast;
Ast_Expr *value;
Ast_Struct *agg;
Ast_Enum *enu;
};
};
@@ -421,12 +430,32 @@ ast_init(Token *pos, Token_Kind op, Ast_Atom *ident, Ast_Expr *expr){
function Ast_Array *
ast_array(Token *pos, Ast_Expr *expr){
AST_NEW(Array, ARRAY, pos, AST_EXPR);
result->flags = AST_EXPR;
result->expr = expr;
result->expr->parent = result;
return result;
}
function Ast_Enum_Member *
ast_enum_member(Token *pos, Intern_String name, Ast_Expr *default_value){
AST_NEW(Enum_Member, ENUM_MEMBER, pos, AST_AGGREGATE_CHILD);
result->name = name;
result->value = default_value;
if(result->value) result->value->parent = result;
return result;
}
function Ast_Enum *
ast_enum(Token *pos, Ast_Expr *typespec, Array<Ast_Enum_Member *> members){
AST_NEW(Enum, ENUM, pos, AST_AGGREGATE);
result->members = members.tight_copy(pctx->perm);
result->typespec = typespec;
if(result->typespec) result->typespec->parent = result;
For(result->members){
it->parent = result;
}
return result;
}
function Ast_Struct *
ast_struct(Token *pos, Array<Ast_Var *> members, Array<Ast_Const *> const_members){
AST_NEW(Struct, STRUCT, pos, AST_AGGREGATE);
@@ -461,9 +490,8 @@ ast_var(Token *pos, Ast_Expr *typespec, Intern_String name, Ast_Expr *expr){
function Ast_Const *
ast_const(Token *pos, Intern_String name, Ast_Expr *value){
assert(is_flag_set(value->flags, AST_AGGREGATE) || is_flag_set(value->flags, AST_EXPR) );
AST_NEW(Const, CONST, pos, AST_BINDING);
assert(value->kind == AST_STRUCT || is_flag_set(value->flags, AST_EXPR));
result->value = value;
result->name = name;
result->value->parent = result;