From c930841f834e43df28be41e8e3509773a523ed0f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 10 Aug 2016 10:00:57 +0100 Subject: f16/f128,u|i128, basic vector support. --- src/parser.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'src/parser.cpp') 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; -- cgit v1.2.3