diff options
Diffstat (limited to 'src/parser.cpp')
| -rw-r--r-- | src/parser.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index ab38951e5..c08325c26 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -87,6 +87,7 @@ Token ast_token(Ast *node) { case Ast_OpaqueType: return node->OpaqueType.token; case Ast_PolyType: return node->PolyType.token; case Ast_ProcType: return node->ProcType.token; + case Ast_RelativeType: return ast_token(node->RelativeType.tag); case Ast_PointerType: return node->PointerType.token; case Ast_ArrayType: return node->ArrayType.token; case Ast_DynamicArrayType: return node->DynamicArrayType.token; @@ -343,6 +344,10 @@ Ast *clone_ast(Ast *node) { n->ProcType.params = clone_ast(n->ProcType.params); n->ProcType.results = clone_ast(n->ProcType.results); break; + case Ast_RelativeType: + n->RelativeType.tag = clone_ast(n->RelativeType.tag); + n->RelativeType.type = clone_ast(n->RelativeType.type); + break; case Ast_PointerType: n->PointerType.type = clone_ast(n->PointerType.type); break; @@ -922,7 +927,12 @@ Ast *ast_proc_type(AstFile *f, Token token, Ast *params, Ast *results, u64 tags, return result; } - +Ast *ast_relative_type(AstFile *f, Ast *tag, Ast *type) { + Ast *result = alloc_ast_node(f, Ast_RelativeType); + result->RelativeType.tag = tag; + result->RelativeType.type = type; + return result; +} Ast *ast_pointer_type(AstFile *f, Token token, Ast *type) { Ast *result = alloc_ast_node(f, Ast_PointerType); result->PointerType.token = token; @@ -1825,6 +1835,11 @@ Ast *parse_operand(AstFile *f, bool lhs) { syntax_error(token, "#bounds_check and #no_bounds_check cannot be applied together"); } return operand; + } else if (name.string == "relative") { + Ast *tag = ast_basic_directive(f, token, name.string); + tag = parse_call_expr(f, tag); + Ast *type = parse_type(f); + return ast_relative_type(f, tag, type); } else { operand = ast_tag_expr(f, token, name, parse_expr(f, false)); } |