aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorgingerBill <bill+github@gingerbill.org>2016-08-10 10:00:57 +0100
committergingerBill <bill+github@gingerbill.org>2016-08-10 10:00:57 +0100
commitc930841f834e43df28be41e8e3509773a523ed0f (patch)
treef4de597e6028c64a7454ff116652f80c0d58ba34 /src/parser.cpp
parentcff5e54ec6b8d9b95effcad1ca2dd8bb0988517b (diff)
f16/f128,u|i128, basic vector support.
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index ae2162059..43d3cf196 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -197,6 +197,11 @@ AST_NODE_KIND(_TypeBegin, struct{}) \
AstNode *count; \
AstNode *elem; \
}) \
+ AST_NODE_KIND(VectorType, struct { \
+ Token token; \
+ AstNode *count; \
+ AstNode *elem; \
+ }) \
AST_NODE_KIND(StructType, struct { \
Token token; \
AstNode *field_list; \
@@ -341,6 +346,8 @@ Token ast_node_token(AstNode *node) {
return node->PointerType.token;
case AstNode_ArrayType:
return node->ArrayType.token;
+ case AstNode_VectorType:
+ return node->VectorType.token;
case AstNode_StructType:
return node->StructType.token;
}
@@ -725,6 +732,14 @@ gb_inline AstNode *make_array_type(AstFile *f, Token token, AstNode *count, AstN
return result;
}
+gb_inline AstNode *make_vector_type(AstFile *f, Token token, AstNode *count, AstNode *elem) {
+ AstNode *result = make_node(f, AstNode_VectorType);
+ result->VectorType.token = token;
+ result->VectorType.count = count;
+ result->VectorType.elem = elem;
+ return result;
+}
+
gb_inline AstNode *make_struct_type(AstFile *f, Token token, AstNode *field_list, isize field_count) {
AstNode *result = make_node(f, AstNode_StructType);
result->StructType.token = token;
@@ -1031,6 +1046,7 @@ b32 is_literal_type(AstNode *node) {
case AstNode_BadExpr:
case AstNode_Ident:
case AstNode_ArrayType:
+ case AstNode_VectorType:
case AstNode_StructType:
return true;
}
@@ -1275,6 +1291,8 @@ AstNode *parse_simple_stmt(AstFile *f) {
case Token_AndEq:
case Token_OrEq:
case Token_XorEq:
+ case Token_ShlEq:
+ case Token_ShrEq:
case Token_AndNotEq:
case Token_CmpAndEq:
case Token_CmpOrEq:
@@ -1458,6 +1476,15 @@ AstNode *parse_identifier_or_type(AstFile *f) {
return make_array_type(f, token, count_expr, parse_type(f));
}
+ case Token_OpenBrace: {
+ f->expr_level++;
+ Token token = expect_token(f, Token_OpenBrace);
+ AstNode *count_expr = parse_expr(f, false);
+ expect_token(f, Token_CloseBrace);
+ f->expr_level--;
+ return make_vector_type(f, token, count_expr, parse_type(f));
+ }
+
case Token_struct: {
Token token = expect_token(f, Token_struct);
Token open, close;