diff options
| author | gingerBill <gingerBill@users.noreply.github.com> | 2021-08-22 11:50:47 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-08-22 11:50:47 +0100 |
| commit | d3fee9d76172172a0f8a70b96938dff45f3dd7e6 (patch) | |
| tree | e3ccf349254e041a97cb8e5c5860f2b39eb3e46d /src/parser.cpp | |
| parent | 93b5befe45b6464f30f7a9404d1db2d84edf201f (diff) | |
| parent | 36a6805b7cdb8b5e4014b03756f969ce6548ff73 (diff) | |
Merge pull request #1093 from odin-lang/multi-pointers
Multi Pointers `[^]T`
Diffstat (limited to 'src/parser.cpp')
| -rw-r--r-- | src/parser.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index e9efd989a..2c29f651a 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -337,6 +337,9 @@ Ast *clone_ast(Ast *node) { case Ast_PointerType: n->PointerType.type = clone_ast(n->PointerType.type); break; + case Ast_MultiPointerType: + n->MultiPointerType.type = clone_ast(n->MultiPointerType.type); + break; case Ast_ArrayType: n->ArrayType.count = clone_ast(n->ArrayType.count); n->ArrayType.elem = clone_ast(n->ArrayType.elem); @@ -985,7 +988,12 @@ Ast *ast_pointer_type(AstFile *f, Token token, Ast *type) { result->PointerType.type = type; return result; } - +Ast *ast_multi_pointer_type(AstFile *f, Token token, Ast *type) { + Ast *result = alloc_ast_node(f, Ast_MultiPointerType); + result->MultiPointerType.token = token; + result->MultiPointerType.type = type; + return result; +} Ast *ast_array_type(AstFile *f, Token token, Ast *count, Ast *elem) { Ast *result = alloc_ast_node(f, Ast_ArrayType); result->ArrayType.token = token; @@ -2317,7 +2325,11 @@ Ast *parse_operand(AstFile *f, bool lhs) { case Token_OpenBracket: { Token token = expect_token(f, Token_OpenBracket); Ast *count_expr = nullptr; - if (f->curr_token.kind == Token_Question) { + if (f->curr_token.kind == Token_Pointer) { + expect_token(f, Token_Pointer); + expect_token(f, Token_CloseBracket); + return ast_multi_pointer_type(f, token, parse_type(f)); + } else if (f->curr_token.kind == Token_Question) { count_expr = ast_unary_expr(f, expect_token(f, Token_Question), nullptr); } else if (allow_token(f, Token_dynamic)) { expect_token(f, Token_CloseBracket); |