Initial enums working
This commit is contained in:
48
new_ast.cpp
48
new_ast.cpp
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user