Initial enums working
This commit is contained in:
@@ -419,6 +419,7 @@ parse_struct(Token *pos){
|
||||
do{
|
||||
Token *token = token_get();
|
||||
Ast_Named *named = parse_named(false);
|
||||
named->flags = set_flag(named->flags, AST_AGGREGATE_CHILD);
|
||||
if(!named) parsing_error(token, "Failed to parse struct member");
|
||||
if(named->kind == AST_CONST){
|
||||
members_const.add((Ast_Const *)named);
|
||||
@@ -434,6 +435,25 @@ parse_struct(Token *pos){
|
||||
return result;
|
||||
}
|
||||
|
||||
function Ast_Enum *
|
||||
parse_enum(Token *pos){
|
||||
Scratch scratch;
|
||||
Array<Ast_Enum_Member *> members = {scratch};
|
||||
Ast_Expr *typespec = parse_optional_type();
|
||||
|
||||
token_match(OPEN_SCOPE);
|
||||
do{
|
||||
Token *name = token_expect(TK_Identifier);
|
||||
Ast_Expr *value = parse_assign_expr();
|
||||
Ast_Enum_Member *member = ast_enum_member(name, name->intern_val, value);
|
||||
members.add(member);
|
||||
}while(token_match(SAME_SCOPE));
|
||||
token_expect(CLOSE_SCOPE);
|
||||
|
||||
Ast_Enum *result = ast_enum(pos, typespec, members);
|
||||
return result;
|
||||
}
|
||||
|
||||
function Ast_Named *
|
||||
parse_named(B32 is_global){
|
||||
Ast_Named *result = 0;
|
||||
@@ -448,7 +468,12 @@ parse_named(B32 is_global){
|
||||
Token *struct_pos = token_get();
|
||||
if(token_match_keyword(keyword_struct)){
|
||||
Ast_Struct *struct_val = parse_struct(struct_pos);
|
||||
result = ast_const(name, name->intern_val, struct_val);
|
||||
result = ast_const(name, name->intern_val, (Ast_Expr *)struct_val);
|
||||
}
|
||||
|
||||
else if(token_match_keyword(keyword_enum)){
|
||||
Ast_Enum *enum_val = parse_enum(struct_pos);
|
||||
result = ast_const(name, name->intern_val, (Ast_Expr *)enum_val);
|
||||
}
|
||||
|
||||
// parse constant expression
|
||||
|
||||
Reference in New Issue
Block a user