aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index 30c1797b5..d264a2619 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -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);