diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2019-06-09 19:24:24 -0400 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2019-06-09 19:26:32 -0400 |
| commit | b735764898412c5b9388fdf729c8ad8db43ddde5 (patch) | |
| tree | 1a5873e654ff7189b236acc15516b9c6cd35a315 /src/parser.cpp | |
| parent | 10e33b35368735d1911a073bcb7cbbaebee671ee (diff) | |
| download | zig-b735764898412c5b9388fdf729c8ad8db43ddde5.tar.gz zig-b735764898412c5b9388fdf729c8ad8db43ddde5.zip | |
different array literal syntax when inferring the size
old syntax: []i32{1, 2, 3}
new syntax: [_]i32{1, 2, 3}
closes #1797
Diffstat (limited to 'src/parser.cpp')
| -rw-r--r-- | src/parser.cpp | 43 |
1 files changed, 32 insertions, 11 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index 3d7bbf7801..89836f9bc8 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -288,6 +288,9 @@ static AstNode *ast_parse_prefix_op_expr( case NodeTypeArrayType: right = &prefix->data.array_type.child_type; break; + case NodeTypeInferredArrayType: + right = &prefix->data.inferred_array_type.child_type; + break; case NodeTypePointerType: { // We might get two pointers from *_ptr_type_start AstNode *child = prefix->data.pointer_type.op_expr; @@ -1852,11 +1855,15 @@ static AstNode *ast_parse_asm_output(ParseContext *pc) { // AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN static AsmOutput *ast_parse_asm_output_item(ParseContext *pc) { - if (eat_token_if(pc, TokenIdLBracket) == nullptr) - return nullptr; - - Token *sym_name = expect_token(pc, TokenIdSymbol); - expect_token(pc, TokenIdRBracket); + Token *sym_name = eat_token_if(pc, TokenIdBracketUnderscoreBracket); + if (sym_name == nullptr) { + if (eat_token_if(pc, TokenIdLBracket) == nullptr) { + return nullptr; + } else { + sym_name = expect_token(pc, TokenIdSymbol); + expect_token(pc, TokenIdRBracket); + } + } Token *str = expect_token(pc, TokenIdStringLiteral); expect_token(pc, TokenIdLParen); @@ -1871,7 +1878,7 @@ static AsmOutput *ast_parse_asm_output_item(ParseContext *pc) { expect_token(pc, TokenIdRParen); AsmOutput *res = allocate<AsmOutput>(1); - res->asm_symbolic_name = token_buf(sym_name); + res->asm_symbolic_name = (sym_name->id == TokenIdBracketUnderscoreBracket) ? buf_create_from_str("_") : token_buf(sym_name); res->constraint = token_buf(str); res->variable_name = token_buf(var_name); res->return_type = return_type; @@ -1894,18 +1901,23 @@ static AstNode *ast_parse_asm_input(ParseContext *pc) { // AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN static AsmInput *ast_parse_asm_input_item(ParseContext *pc) { - if (eat_token_if(pc, TokenIdLBracket) == nullptr) - return nullptr; + Token *sym_name = eat_token_if(pc, TokenIdBracketUnderscoreBracket); + if (sym_name == nullptr) { + if (eat_token_if(pc, TokenIdLBracket) == nullptr) { + return nullptr; + } else { + sym_name = expect_token(pc, TokenIdSymbol); + expect_token(pc, TokenIdRBracket); + } + } - Token *sym_name = expect_token(pc, TokenIdSymbol); - expect_token(pc, TokenIdRBracket); Token *constraint = expect_token(pc, TokenIdStringLiteral); expect_token(pc, TokenIdLParen); AstNode *expr = ast_expect(pc, ast_parse_expr); expect_token(pc, TokenIdRParen); AsmInput *res = allocate<AsmInput>(1); - res->asm_symbolic_name = token_buf(sym_name); + res->asm_symbolic_name = (sym_name->id == TokenIdBracketUnderscoreBracket) ? buf_create_from_str("_") : token_buf(sym_name); res->constraint = token_buf(constraint); res->expr = expr; return res; @@ -2597,6 +2609,12 @@ static AstNode *ast_parse_prefix_type_op(ParseContext *pc) { return ptr; } + Token *arr_init = eat_token_if(pc, TokenIdBracketUnderscoreBracket); + if (arr_init != nullptr) { + return ast_create_node(pc, NodeTypeInferredArrayType, arr_init); + } + + return nullptr; } @@ -3003,6 +3021,9 @@ void ast_visit_node_children(AstNode *node, void (*visit)(AstNode **, void *cont visit_field(&node->data.array_type.child_type, visit, context); visit_field(&node->data.array_type.align_expr, visit, context); break; + case NodeTypeInferredArrayType: + visit_field(&node->data.array_type.child_type, visit, context); + break; case NodeTypePromiseType: visit_field(&node->data.promise_type.payload_type, visit, context); break; |
