Add bit_set type

This commit is contained in:
gingerBill
2018-08-14 17:07:56 +01:00
parent 89f4e7a8db
commit acc010cba5
14 changed files with 509 additions and 45 deletions

View File

@@ -89,6 +89,7 @@ Token ast_token(Ast *node) {
case Ast_UnionType: return node->UnionType.token;
case Ast_EnumType: return node->EnumType.token;
case Ast_BitFieldType: return node->BitFieldType.token;
case Ast_BitSetType: return node->BitSetType.token;
case Ast_MapType: return node->MapType.token;
}
@@ -344,6 +345,10 @@ Ast *clone_ast(Ast *node) {
case Ast_BitFieldType:
n->BitFieldType.fields = clone_ast_array(n->BitFieldType.fields);
n->BitFieldType.align = clone_ast(n->BitFieldType.align);
break;
case Ast_BitSetType:
n->BitSetType.base_type = clone_ast(n->BitSetType.base_type);
break;
case Ast_MapType:
n->MapType.count = clone_ast(n->MapType.count);
n->MapType.key = clone_ast(n->MapType.key);
@@ -922,6 +927,13 @@ Ast *ast_bit_field_type(AstFile *f, Token token, Array<Ast *> fields, Ast *align
return result;
}
Ast *ast_bit_set_type(AstFile *f, Token token, Ast *base_type) {
Ast *result = alloc_ast_node(f, Ast_BitSetType);
result->BitSetType.token = token;
result->BitSetType.base_type = base_type;
return result;
}
Ast *ast_map_type(AstFile *f, Token token, Ast *key, Ast *value) {
Ast *result = alloc_ast_node(f, Ast_MapType);
result->MapType.token = token;
@@ -1962,6 +1974,15 @@ Ast *parse_operand(AstFile *f, bool lhs) {
return ast_bit_field_type(f, token, fields, align);
} break;
case Token_bit_set: {
Token token = expect_token(f, Token_bit_set);
Token open = expect_token(f, Token_OpenBracket);
Ast *base_type = parse_type(f);
Token close = expect_token(f, Token_CloseBracket);
return ast_bit_set_type(f, token, base_type);
}
default: {
#if 0
Ast *type = parse_type_or_ident(f);