| ... | @@ -6,6 +6,8 @@ | ... | @@ -6,6 +6,8 @@ |
| 6 | */ | 6 | */ |
| 7 | | 7 | |
| 8 | #include "parser.hpp" | 8 | #include "parser.hpp" |
| | 9 | #include "errmsg.hpp" |
| | 10 | #include "semantic_info.hpp" |
| 9 | | 11 | |
| 10 | #include <stdarg.h> | 12 | #include <stdarg.h> |
| 11 | #include <stdio.h> | 13 | #include <stdio.h> |
| ... | @@ -45,21 +47,6 @@ static const char *prefix_op_str(PrefixOp prefix_op) { | ... | @@ -45,21 +47,6 @@ static const char *prefix_op_str(PrefixOp prefix_op) { |
| 45 | zig_unreachable(); | 47 | zig_unreachable(); |
| 46 | } | 48 | } |
| 47 | | 49 | |
| 48 | __attribute__ ((format (printf, 2, 3))) | | |
| 49 | __attribute__ ((noreturn)) | | |
| 50 | static void ast_error(Token *token, const char *format, ...) { | | |
| 51 | int line = token->start_line + 1; | | |
| 52 | int column = token->start_column + 1; | | |
| 53 | | | |
| 54 | va_list ap; | | |
| 55 | va_start(ap, format); | | |
| 56 | fprintf(stderr, "Error: Line %d, column %d: ", line, column); | | |
| 57 | vfprintf(stderr, format, ap); | | |
| 58 | fprintf(stderr, "\n"); | | |
| 59 | va_end(ap); | | |
| 60 | exit(EXIT_FAILURE); | | |
| 61 | } | | |
| 62 | | | |
| 63 | const char *node_type_str(NodeType node_type) { | 50 | const char *node_type_str(NodeType node_type) { |
| 64 | switch (node_type) { | 51 | switch (node_type) { |
| 65 | case NodeTypeRoot: | 52 | case NodeTypeRoot: |
| ... | @@ -254,11 +241,35 @@ struct ParseContext { | ... | @@ -254,11 +241,35 @@ struct ParseContext { |
| 254 | AstNode *root; | 241 | AstNode *root; |
| 255 | ZigList<Token> *tokens; | 242 | ZigList<Token> *tokens; |
| 256 | ZigList<AstNode *> *directive_list; | 243 | ZigList<AstNode *> *directive_list; |
| | 244 | ImportTableEntry *owner; |
| 257 | }; | 245 | }; |
| 258 | | 246 | |
| 259 | static AstNode *ast_create_node_no_line_info(NodeType type) { | 247 | __attribute__ ((format (printf, 3, 4))) |
| | 248 | __attribute__ ((noreturn)) |
| | 249 | static void ast_error(ParseContext *pc, Token *token, const char *format, ...) { |
| | 250 | ErrorMsg *err = allocate<ErrorMsg>(1); |
| | 251 | err->line_start = token->start_line; |
| | 252 | err->column_start = token->start_column; |
| | 253 | err->line_end = -1; |
| | 254 | err->column_end = -1; |
| | 255 | |
| | 256 | va_list ap; |
| | 257 | va_start(ap, format); |
| | 258 | err->msg = buf_vprintf(format, ap); |
| | 259 | va_end(ap); |
| | 260 | |
| | 261 | err->path = pc->owner->path; |
| | 262 | err->source = pc->owner->source_code; |
| | 263 | err->line_offsets = pc->owner->line_offsets; |
| | 264 | |
| | 265 | print_err_msg(err); |
| | 266 | exit(EXIT_FAILURE); |
| | 267 | } |
| | 268 | |
| | 269 | static AstNode *ast_create_node_no_line_info(ParseContext *pc, NodeType type) { |
| 260 | AstNode *node = allocate<AstNode>(1); | 270 | AstNode *node = allocate<AstNode>(1); |
| 261 | node->type = type; | 271 | node->type = type; |
| | 272 | node->owner = pc->owner; |
| 262 | return node; | 273 | return node; |
| 263 | } | 274 | } |
| 264 | | 275 | |
| ... | @@ -267,21 +278,21 @@ static void ast_update_node_line_info(AstNode *node, Token *first_token) { | ... | @@ -267,21 +278,21 @@ static void ast_update_node_line_info(AstNode *node, Token *first_token) { |
| 267 | node->column = first_token->start_column; | 278 | node->column = first_token->start_column; |
| 268 | } | 279 | } |
| 269 | | 280 | |
| 270 | static AstNode *ast_create_node(NodeType type, Token *first_token) { | 281 | static AstNode *ast_create_node(ParseContext *pc, NodeType type, Token *first_token) { |
| 271 | AstNode *node = ast_create_node_no_line_info(type); | 282 | AstNode *node = ast_create_node_no_line_info(pc, type); |
| 272 | ast_update_node_line_info(node, first_token); | 283 | ast_update_node_line_info(node, first_token); |
| 273 | return node; | 284 | return node; |
| 274 | } | 285 | } |
| 275 | | 286 | |
| 276 | static AstNode *ast_create_node_with_node(NodeType type, AstNode *other_node) { | 287 | static AstNode *ast_create_node_with_node(ParseContext *pc, NodeType type, AstNode *other_node) { |
| 277 | AstNode *node = ast_create_node_no_line_info(type); | 288 | AstNode *node = ast_create_node_no_line_info(pc, type); |
| 278 | node->line = other_node->line; | 289 | node->line = other_node->line; |
| 279 | node->column = other_node->column; | 290 | node->column = other_node->column; |
| 280 | return node; | 291 | return node; |
| 281 | } | 292 | } |
| 282 | | 293 | |
| 283 | static AstNode *ast_create_void_type_node(ParseContext *pc, Token *token) { | 294 | static AstNode *ast_create_void_type_node(ParseContext *pc, Token *token) { |
| 284 | AstNode *node = ast_create_node(NodeTypeType, token); | 295 | AstNode *node = ast_create_node(pc, NodeTypeType, token); |
| 285 | node->data.type.type = AstNodeTypeTypePrimitive; | 296 | node->data.type.type = AstNodeTypeTypePrimitive; |
| 286 | buf_init_from_str(&node->data.type.primitive_name, "void"); | 297 | buf_init_from_str(&node->data.type.primitive_name, "void"); |
| 287 | return node; | 298 | return node; |
| ... | @@ -331,7 +342,7 @@ __attribute__ ((noreturn)) | ... | @@ -331,7 +342,7 @@ __attribute__ ((noreturn)) |
| 331 | static void ast_invalid_token_error(ParseContext *pc, Token *token) { | 342 | static void ast_invalid_token_error(ParseContext *pc, Token *token) { |
| 332 | Buf token_value = BUF_INIT; | 343 | Buf token_value = BUF_INIT; |
| 333 | ast_buf_from_token(pc, token, &token_value); | 344 | ast_buf_from_token(pc, token, &token_value); |
| 334 | ast_error(token, "invalid token: '%s'", buf_ptr(&token_value)); | 345 | ast_error(pc, token, "invalid token: '%s'", buf_ptr(&token_value)); |
| 335 | } | 346 | } |
| 336 | | 347 | |
| 337 | static AstNode *ast_parse_expression(ParseContext *pc, int *token_index, bool mandatory); | 348 | static AstNode *ast_parse_expression(ParseContext *pc, int *token_index, bool mandatory); |
| ... | @@ -349,7 +360,7 @@ static AstNode *ast_parse_directive(ParseContext *pc, int token_index, int *new_ | ... | @@ -349,7 +360,7 @@ static AstNode *ast_parse_directive(ParseContext *pc, int token_index, int *new_ |
| 349 | token_index += 1; | 360 | token_index += 1; |
| 350 | ast_expect_token(pc, number_sign, TokenIdNumberSign); | 361 | ast_expect_token(pc, number_sign, TokenIdNumberSign); |
| 351 | | 362 | |
| 352 | AstNode *node = ast_create_node(NodeTypeDirective, number_sign); | 363 | AstNode *node = ast_create_node(pc, NodeTypeDirective, number_sign); |
| 353 | | 364 | |
| 354 | Token *name_symbol = &pc->tokens->at(token_index); | 365 | Token *name_symbol = &pc->tokens->at(token_index); |
| 355 | token_index += 1; | 366 | token_index += 1; |
| ... | @@ -399,7 +410,7 @@ static AstNode *ast_parse_type(ParseContext *pc, int token_index, int *new_token | ... | @@ -399,7 +410,7 @@ static AstNode *ast_parse_type(ParseContext *pc, int token_index, int *new_token |
| 399 | Token *token = &pc->tokens->at(token_index); | 410 | Token *token = &pc->tokens->at(token_index); |
| 400 | token_index += 1; | 411 | token_index += 1; |
| 401 | | 412 | |
| 402 | AstNode *node = ast_create_node(NodeTypeType, token); | 413 | AstNode *node = ast_create_node(pc, NodeTypeType, token); |
| 403 | | 414 | |
| 404 | if (token->id == TokenIdKeywordUnreachable) { | 415 | if (token->id == TokenIdKeywordUnreachable) { |
| 405 | node->data.type.type = AstNodeTypeTypePrimitive; | 416 | node->data.type.type = AstNodeTypeTypePrimitive; |
| ... | @@ -437,7 +448,7 @@ static AstNode *ast_parse_param_decl(ParseContext *pc, int token_index, int *new | ... | @@ -437,7 +448,7 @@ static AstNode *ast_parse_param_decl(ParseContext *pc, int token_index, int *new |
| 437 | token_index += 1; | 448 | token_index += 1; |
| 438 | ast_expect_token(pc, param_name, TokenIdSymbol); | 449 | ast_expect_token(pc, param_name, TokenIdSymbol); |
| 439 | | 450 | |
| 440 | AstNode *node = ast_create_node(NodeTypeParamDecl, param_name); | 451 | AstNode *node = ast_create_node(pc, NodeTypeParamDecl, param_name); |
| 441 | | 452 | |
| 442 | | 453 | |
| 443 | ast_buf_from_token(pc, param_name, &node->data.param_decl.name); | 454 | ast_buf_from_token(pc, param_name, &node->data.param_decl.name); |
| ... | @@ -544,21 +555,21 @@ static AstNode *ast_parse_primary_expr(ParseContext *pc, int *token_index, bool | ... | @@ -544,21 +555,21 @@ static AstNode *ast_parse_primary_expr(ParseContext *pc, int *token_index, bool |
| 544 | Token *token = &pc->tokens->at(*token_index); | 555 | Token *token = &pc->tokens->at(*token_index); |
| 545 | | 556 | |
| 546 | if (token->id == TokenIdNumberLiteral) { | 557 | if (token->id == TokenIdNumberLiteral) { |
| 547 | AstNode *node = ast_create_node(NodeTypeNumberLiteral, token); | 558 | AstNode *node = ast_create_node(pc, NodeTypeNumberLiteral, token); |
| 548 | ast_buf_from_token(pc, token, &node->data.number); | 559 | ast_buf_from_token(pc, token, &node->data.number); |
| 549 | *token_index += 1; | 560 | *token_index += 1; |
| 550 | return node; | 561 | return node; |
| 551 | } else if (token->id == TokenIdStringLiteral) { | 562 | } else if (token->id == TokenIdStringLiteral) { |
| 552 | AstNode *node = ast_create_node(NodeTypeStringLiteral, token); | 563 | AstNode *node = ast_create_node(pc, NodeTypeStringLiteral, token); |
| 553 | parse_string_literal(pc, token, &node->data.string); | 564 | parse_string_literal(pc, token, &node->data.string); |
| 554 | *token_index += 1; | 565 | *token_index += 1; |
| 555 | return node; | 566 | return node; |
| 556 | } else if (token->id == TokenIdKeywordUnreachable) { | 567 | } else if (token->id == TokenIdKeywordUnreachable) { |
| 557 | AstNode *node = ast_create_node(NodeTypeUnreachable, token); | 568 | AstNode *node = ast_create_node(pc, NodeTypeUnreachable, token); |
| 558 | *token_index += 1; | 569 | *token_index += 1; |
| 559 | return node; | 570 | return node; |
| 560 | } else if (token->id == TokenIdSymbol) { | 571 | } else if (token->id == TokenIdSymbol) { |
| 561 | AstNode *node = ast_create_node(NodeTypeSymbol, token); | 572 | AstNode *node = ast_create_node(pc, NodeTypeSymbol, token); |
| 562 | ast_buf_from_token(pc, token, &node->data.symbol); | 573 | ast_buf_from_token(pc, token, &node->data.symbol); |
| 563 | *token_index += 1; | 574 | *token_index += 1; |
| 564 | return node; | 575 | return node; |
| ... | @@ -592,7 +603,7 @@ static AstNode *ast_parse_fn_call_expr(ParseContext *pc, int *token_index, bool | ... | @@ -592,7 +603,7 @@ static AstNode *ast_parse_fn_call_expr(ParseContext *pc, int *token_index, bool |
| 592 | if (l_paren->id != TokenIdLParen) | 603 | if (l_paren->id != TokenIdLParen) |
| 593 | return primary_expr; | 604 | return primary_expr; |
| 594 | | 605 | |
| 595 | AstNode *node = ast_create_node_with_node(NodeTypeFnCallExpr, primary_expr); | 606 | AstNode *node = ast_create_node_with_node(pc, NodeTypeFnCallExpr, primary_expr); |
| 596 | node->data.fn_call_expr.fn_ref_expr = primary_expr; | 607 | node->data.fn_call_expr.fn_ref_expr = primary_expr; |
| 597 | ast_parse_fn_call_param_list(pc, *token_index, token_index, &node->data.fn_call_expr.params); | 608 | ast_parse_fn_call_param_list(pc, *token_index, token_index, &node->data.fn_call_expr.params); |
| 598 | | 609 | |
| ... | @@ -635,7 +646,7 @@ static AstNode *ast_parse_prefix_op_expr(ParseContext *pc, int *token_index, boo | ... | @@ -635,7 +646,7 @@ static AstNode *ast_parse_prefix_op_expr(ParseContext *pc, int *token_index, boo |
| 635 | return ast_parse_fn_call_expr(pc, token_index, mandatory); | 646 | return ast_parse_fn_call_expr(pc, token_index, mandatory); |
| 636 | | 647 | |
| 637 | AstNode *primary_expr = ast_parse_fn_call_expr(pc, token_index, true); | 648 | AstNode *primary_expr = ast_parse_fn_call_expr(pc, token_index, true); |
| 638 | AstNode *node = ast_create_node(NodeTypePrefixOpExpr, token); | 649 | AstNode *node = ast_create_node(pc, NodeTypePrefixOpExpr, token); |
| 639 | node->data.prefix_op_expr.primary_expr = primary_expr; | 650 | node->data.prefix_op_expr.primary_expr = primary_expr; |
| 640 | node->data.prefix_op_expr.prefix_op = prefix_op; | 651 | node->data.prefix_op_expr.prefix_op = prefix_op; |
| 641 | | 652 | |
| ... | @@ -656,7 +667,7 @@ static AstNode *ast_parse_cast_expression(ParseContext *pc, int *token_index, bo | ... | @@ -656,7 +667,7 @@ static AstNode *ast_parse_cast_expression(ParseContext *pc, int *token_index, bo |
| 656 | return prefix_op_expr; | 667 | return prefix_op_expr; |
| 657 | *token_index += 1; | 668 | *token_index += 1; |
| 658 | | 669 | |
| 659 | AstNode *node = ast_create_node(NodeTypeCastExpr, as_kw); | 670 | AstNode *node = ast_create_node(pc, NodeTypeCastExpr, as_kw); |
| 660 | node->data.cast_expr.prefix_op_expr = prefix_op_expr; | 671 | node->data.cast_expr.prefix_op_expr = prefix_op_expr; |
| 661 | | 672 | |
| 662 | node->data.cast_expr.type = ast_parse_type(pc, *token_index, token_index); | 673 | node->data.cast_expr.type = ast_parse_type(pc, *token_index, token_index); |
| ... | @@ -705,7 +716,7 @@ static AstNode *ast_parse_mult_expr(ParseContext *pc, int *token_index, bool man | ... | @@ -705,7 +716,7 @@ static AstNode *ast_parse_mult_expr(ParseContext *pc, int *token_index, bool man |
| 705 | | 716 | |
| 706 | AstNode *operand_2 = ast_parse_cast_expression(pc, token_index, true); | 717 | AstNode *operand_2 = ast_parse_cast_expression(pc, token_index, true); |
| 707 | | 718 | |
| 708 | AstNode *node = ast_create_node(NodeTypeBinOpExpr, token); | 719 | AstNode *node = ast_create_node(pc, NodeTypeBinOpExpr, token); |
| 709 | node->data.bin_op_expr.op1 = operand_1; | 720 | node->data.bin_op_expr.op1 = operand_1; |
| 710 | node->data.bin_op_expr.bin_op = mult_op; | 721 | node->data.bin_op_expr.bin_op = mult_op; |
| 711 | node->data.bin_op_expr.op2 = operand_2; | 722 | node->data.bin_op_expr.op2 = operand_2; |
| ... | @@ -753,7 +764,7 @@ static AstNode *ast_parse_add_expr(ParseContext *pc, int *token_index, bool mand | ... | @@ -753,7 +764,7 @@ static AstNode *ast_parse_add_expr(ParseContext *pc, int *token_index, bool mand |
| 753 | | 764 | |
| 754 | AstNode *operand_2 = ast_parse_mult_expr(pc, token_index, true); | 765 | AstNode *operand_2 = ast_parse_mult_expr(pc, token_index, true); |
| 755 | | 766 | |
| 756 | AstNode *node = ast_create_node(NodeTypeBinOpExpr, token); | 767 | AstNode *node = ast_create_node(pc, NodeTypeBinOpExpr, token); |
| 757 | node->data.bin_op_expr.op1 = operand_1; | 768 | node->data.bin_op_expr.op1 = operand_1; |
| 758 | node->data.bin_op_expr.bin_op = add_op; | 769 | node->data.bin_op_expr.bin_op = add_op; |
| 759 | node->data.bin_op_expr.op2 = operand_2; | 770 | node->data.bin_op_expr.op2 = operand_2; |
| ... | @@ -801,7 +812,7 @@ static AstNode *ast_parse_bit_shift_expr(ParseContext *pc, int *token_index, boo | ... | @@ -801,7 +812,7 @@ static AstNode *ast_parse_bit_shift_expr(ParseContext *pc, int *token_index, boo |
| 801 | | 812 | |
| 802 | AstNode *operand_2 = ast_parse_add_expr(pc, token_index, true); | 813 | AstNode *operand_2 = ast_parse_add_expr(pc, token_index, true); |
| 803 | | 814 | |
| 804 | AstNode *node = ast_create_node(NodeTypeBinOpExpr, token); | 815 | AstNode *node = ast_create_node(pc, NodeTypeBinOpExpr, token); |
| 805 | node->data.bin_op_expr.op1 = operand_1; | 816 | node->data.bin_op_expr.op1 = operand_1; |
| 806 | node->data.bin_op_expr.bin_op = bit_shift_op; | 817 | node->data.bin_op_expr.bin_op = bit_shift_op; |
| 807 | node->data.bin_op_expr.op2 = operand_2; | 818 | node->data.bin_op_expr.op2 = operand_2; |
| ... | @@ -825,7 +836,7 @@ static AstNode *ast_parse_bin_and_expr(ParseContext *pc, int *token_index, bool | ... | @@ -825,7 +836,7 @@ static AstNode *ast_parse_bin_and_expr(ParseContext *pc, int *token_index, bool |
| 825 | | 836 | |
| 826 | AstNode *operand_2 = ast_parse_bit_shift_expr(pc, token_index, true); | 837 | AstNode *operand_2 = ast_parse_bit_shift_expr(pc, token_index, true); |
| 827 | | 838 | |
| 828 | AstNode *node = ast_create_node(NodeTypeBinOpExpr, token); | 839 | AstNode *node = ast_create_node(pc, NodeTypeBinOpExpr, token); |
| 829 | node->data.bin_op_expr.op1 = operand_1; | 840 | node->data.bin_op_expr.op1 = operand_1; |
| 830 | node->data.bin_op_expr.bin_op = BinOpTypeBinAnd; | 841 | node->data.bin_op_expr.bin_op = BinOpTypeBinAnd; |
| 831 | node->data.bin_op_expr.op2 = operand_2; | 842 | node->data.bin_op_expr.op2 = operand_2; |
| ... | @@ -848,7 +859,7 @@ static AstNode *ast_parse_bin_xor_expr(ParseContext *pc, int *token_index, bool | ... | @@ -848,7 +859,7 @@ static AstNode *ast_parse_bin_xor_expr(ParseContext *pc, int *token_index, bool |
| 848 | | 859 | |
| 849 | AstNode *operand_2 = ast_parse_bin_and_expr(pc, token_index, true); | 860 | AstNode *operand_2 = ast_parse_bin_and_expr(pc, token_index, true); |
| 850 | | 861 | |
| 851 | AstNode *node = ast_create_node(NodeTypeBinOpExpr, token); | 862 | AstNode *node = ast_create_node(pc, NodeTypeBinOpExpr, token); |
| 852 | node->data.bin_op_expr.op1 = operand_1; | 863 | node->data.bin_op_expr.op1 = operand_1; |
| 853 | node->data.bin_op_expr.bin_op = BinOpTypeBinXor; | 864 | node->data.bin_op_expr.bin_op = BinOpTypeBinXor; |
| 854 | node->data.bin_op_expr.op2 = operand_2; | 865 | node->data.bin_op_expr.op2 = operand_2; |
| ... | @@ -871,7 +882,7 @@ static AstNode *ast_parse_bin_or_expr(ParseContext *pc, int *token_index, bool m | ... | @@ -871,7 +882,7 @@ static AstNode *ast_parse_bin_or_expr(ParseContext *pc, int *token_index, bool m |
| 871 | | 882 | |
| 872 | AstNode *operand_2 = ast_parse_bin_xor_expr(pc, token_index, true); | 883 | AstNode *operand_2 = ast_parse_bin_xor_expr(pc, token_index, true); |
| 873 | | 884 | |
| 874 | AstNode *node = ast_create_node(NodeTypeBinOpExpr, token); | 885 | AstNode *node = ast_create_node(pc, NodeTypeBinOpExpr, token); |
| 875 | node->data.bin_op_expr.op1 = operand_1; | 886 | node->data.bin_op_expr.op1 = operand_1; |
| 876 | node->data.bin_op_expr.bin_op = BinOpTypeBinOr; | 887 | node->data.bin_op_expr.bin_op = BinOpTypeBinOr; |
| 877 | node->data.bin_op_expr.op2 = operand_2; | 888 | node->data.bin_op_expr.op2 = operand_2; |
| ... | @@ -920,7 +931,7 @@ static AstNode *ast_parse_comparison_expr(ParseContext *pc, int *token_index, bo | ... | @@ -920,7 +931,7 @@ static AstNode *ast_parse_comparison_expr(ParseContext *pc, int *token_index, bo |
| 920 | | 931 | |
| 921 | AstNode *operand_2 = ast_parse_bin_or_expr(pc, token_index, true); | 932 | AstNode *operand_2 = ast_parse_bin_or_expr(pc, token_index, true); |
| 922 | | 933 | |
| 923 | AstNode *node = ast_create_node(NodeTypeBinOpExpr, token); | 934 | AstNode *node = ast_create_node(pc, NodeTypeBinOpExpr, token); |
| 924 | node->data.bin_op_expr.op1 = operand_1; | 935 | node->data.bin_op_expr.op1 = operand_1; |
| 925 | node->data.bin_op_expr.bin_op = cmp_op; | 936 | node->data.bin_op_expr.bin_op = cmp_op; |
| 926 | node->data.bin_op_expr.op2 = operand_2; | 937 | node->data.bin_op_expr.op2 = operand_2; |
| ... | @@ -943,7 +954,7 @@ static AstNode *ast_parse_bool_and_expr(ParseContext *pc, int *token_index, bool | ... | @@ -943,7 +954,7 @@ static AstNode *ast_parse_bool_and_expr(ParseContext *pc, int *token_index, bool |
| 943 | | 954 | |
| 944 | AstNode *operand_2 = ast_parse_comparison_expr(pc, token_index, true); | 955 | AstNode *operand_2 = ast_parse_comparison_expr(pc, token_index, true); |
| 945 | | 956 | |
| 946 | AstNode *node = ast_create_node(NodeTypeBinOpExpr, token); | 957 | AstNode *node = ast_create_node(pc, NodeTypeBinOpExpr, token); |
| 947 | node->data.bin_op_expr.op1 = operand_1; | 958 | node->data.bin_op_expr.op1 = operand_1; |
| 948 | node->data.bin_op_expr.bin_op = BinOpTypeBoolAnd; | 959 | node->data.bin_op_expr.bin_op = BinOpTypeBoolAnd; |
| 949 | node->data.bin_op_expr.op2 = operand_2; | 960 | node->data.bin_op_expr.op2 = operand_2; |
| ... | @@ -958,7 +969,7 @@ static AstNode *ast_parse_return_expr(ParseContext *pc, int *token_index, bool m | ... | @@ -958,7 +969,7 @@ static AstNode *ast_parse_return_expr(ParseContext *pc, int *token_index, bool m |
| 958 | Token *return_tok = &pc->tokens->at(*token_index); | 969 | Token *return_tok = &pc->tokens->at(*token_index); |
| 959 | if (return_tok->id == TokenIdKeywordReturn) { | 970 | if (return_tok->id == TokenIdKeywordReturn) { |
| 960 | *token_index += 1; | 971 | *token_index += 1; |
| 961 | AstNode *node = ast_create_node(NodeTypeReturnExpr, return_tok); | 972 | AstNode *node = ast_create_node(pc, NodeTypeReturnExpr, return_tok); |
| 962 | node->data.return_expr.expr = ast_parse_expression(pc, token_index, false); | 973 | node->data.return_expr.expr = ast_parse_expression(pc, token_index, false); |
| 963 | return node; | 974 | return node; |
| 964 | } else if (mandatory) { | 975 | } else if (mandatory) { |
| ... | @@ -983,7 +994,7 @@ static AstNode *ast_parse_bool_or_expr(ParseContext *pc, int *token_index, bool | ... | @@ -983,7 +994,7 @@ static AstNode *ast_parse_bool_or_expr(ParseContext *pc, int *token_index, bool |
| 983 | | 994 | |
| 984 | AstNode *operand_2 = ast_parse_bool_and_expr(pc, token_index, true); | 995 | AstNode *operand_2 = ast_parse_bool_and_expr(pc, token_index, true); |
| 985 | | 996 | |
| 986 | AstNode *node = ast_create_node(NodeTypeBinOpExpr, token); | 997 | AstNode *node = ast_create_node(pc, NodeTypeBinOpExpr, token); |
| 987 | node->data.bin_op_expr.op1 = operand_1; | 998 | node->data.bin_op_expr.op1 = operand_1; |
| 988 | node->data.bin_op_expr.bin_op = BinOpTypeBoolOr; | 999 | node->data.bin_op_expr.bin_op = BinOpTypeBoolOr; |
| 989 | node->data.bin_op_expr.op2 = operand_2; | 1000 | node->data.bin_op_expr.op2 = operand_2; |
| ... | @@ -1046,7 +1057,7 @@ static AstNode *ast_parse_block(ParseContext *pc, int *token_index, bool mandato | ... | @@ -1046,7 +1057,7 @@ static AstNode *ast_parse_block(ParseContext *pc, int *token_index, bool mandato |
| 1046 | } | 1057 | } |
| 1047 | *token_index += 1; | 1058 | *token_index += 1; |
| 1048 | | 1059 | |
| 1049 | AstNode *node = ast_create_node(NodeTypeBlock, l_brace); | 1060 | AstNode *node = ast_create_node(pc, NodeTypeBlock, l_brace); |
| 1050 | | 1061 | |
| 1051 | for (;;) { | 1062 | for (;;) { |
| 1052 | Token *token = &pc->tokens->at(*token_index); | 1063 | Token *token = &pc->tokens->at(*token_index); |
| ... | @@ -1092,7 +1103,7 @@ static AstNode *ast_parse_fn_proto(ParseContext *pc, int *token_index, bool mand | ... | @@ -1092,7 +1103,7 @@ static AstNode *ast_parse_fn_proto(ParseContext *pc, int *token_index, bool mand |
| 1092 | return nullptr; | 1103 | return nullptr; |
| 1093 | } | 1104 | } |
| 1094 | | 1105 | |
| 1095 | AstNode *node = ast_create_node(NodeTypeFnProto, token); | 1106 | AstNode *node = ast_create_node(pc, NodeTypeFnProto, token); |
| 1096 | node->data.fn_proto.visib_mod = visib_mod; | 1107 | node->data.fn_proto.visib_mod = visib_mod; |
| 1097 | node->data.fn_proto.directives = pc->directive_list; | 1108 | node->data.fn_proto.directives = pc->directive_list; |
| 1098 | pc->directive_list = nullptr; | 1109 | pc->directive_list = nullptr; |
| ... | @@ -1125,7 +1136,7 @@ static AstNode *ast_parse_fn_def(ParseContext *pc, int *token_index, bool mandat | ... | @@ -1125,7 +1136,7 @@ static AstNode *ast_parse_fn_def(ParseContext *pc, int *token_index, bool mandat |
| 1125 | AstNode *fn_proto = ast_parse_fn_proto(pc, token_index, mandatory); | 1136 | AstNode *fn_proto = ast_parse_fn_proto(pc, token_index, mandatory); |
| 1126 | if (!fn_proto) | 1137 | if (!fn_proto) |
| 1127 | return nullptr; | 1138 | return nullptr; |
| 1128 | AstNode *node = ast_create_node_with_node(NodeTypeFnDef, fn_proto); | 1139 | AstNode *node = ast_create_node_with_node(pc, NodeTypeFnDef, fn_proto); |
| 1129 | | 1140 | |
| 1130 | node->data.fn_def.fn_proto = fn_proto; | 1141 | node->data.fn_def.fn_proto = fn_proto; |
| 1131 | node->data.fn_def.body = ast_parse_block(pc, token_index, true); | 1142 | node->data.fn_def.body = ast_parse_block(pc, token_index, true); |
| ... | @@ -1138,7 +1149,7 @@ FnDecl : FnProto token(Semicolon) | ... | @@ -1138,7 +1149,7 @@ FnDecl : FnProto token(Semicolon) |
| 1138 | */ | 1149 | */ |
| 1139 | static AstNode *ast_parse_fn_decl(ParseContext *pc, int token_index, int *new_token_index) { | 1150 | static AstNode *ast_parse_fn_decl(ParseContext *pc, int token_index, int *new_token_index) { |
| 1140 | AstNode *fn_proto = ast_parse_fn_proto(pc, &token_index, true); | 1151 | AstNode *fn_proto = ast_parse_fn_proto(pc, &token_index, true); |
| 1141 | AstNode *node = ast_create_node_with_node(NodeTypeFnDecl, fn_proto); | 1152 | AstNode *node = ast_create_node_with_node(pc, NodeTypeFnDecl, fn_proto); |
| 1142 | | 1153 | |
| 1143 | node->data.fn_decl.fn_proto = fn_proto; | 1154 | node->data.fn_decl.fn_proto = fn_proto; |
| 1144 | | 1155 | |
| ... | @@ -1166,7 +1177,7 @@ static AstNode *ast_parse_extern_block(ParseContext *pc, int *token_index, bool | ... | @@ -1166,7 +1177,7 @@ static AstNode *ast_parse_extern_block(ParseContext *pc, int *token_index, bool |
| 1166 | } | 1177 | } |
| 1167 | *token_index += 1; | 1178 | *token_index += 1; |
| 1168 | | 1179 | |
| 1169 | AstNode *node = ast_create_node(NodeTypeExternBlock, extern_kw); | 1180 | AstNode *node = ast_create_node(pc, NodeTypeExternBlock, extern_kw); |
| 1170 | | 1181 | |
| 1171 | node->data.extern_block.directives = pc->directive_list; | 1182 | node->data.extern_block.directives = pc->directive_list; |
| 1172 | pc->directive_list = nullptr; | 1183 | pc->directive_list = nullptr; |
| ... | @@ -1184,7 +1195,7 @@ static AstNode *ast_parse_extern_block(ParseContext *pc, int *token_index, bool | ... | @@ -1184,7 +1195,7 @@ static AstNode *ast_parse_extern_block(ParseContext *pc, int *token_index, bool |
| 1184 | Token *token = &pc->tokens->at(*token_index); | 1195 | Token *token = &pc->tokens->at(*token_index); |
| 1185 | if (token->id == TokenIdRBrace) { | 1196 | if (token->id == TokenIdRBrace) { |
| 1186 | if (pc->directive_list->length > 0) { | 1197 | if (pc->directive_list->length > 0) { |
| 1187 | ast_error(directive_token, "invalid directive"); | 1198 | ast_error(pc, directive_token, "invalid directive"); |
| 1188 | } | 1199 | } |
| 1189 | pc->directive_list = nullptr; | 1200 | pc->directive_list = nullptr; |
| 1190 | | 1201 | |
| ... | @@ -1216,7 +1227,7 @@ static AstNode *ast_parse_root_export_decl(ParseContext *pc, int *token_index, b | ... | @@ -1216,7 +1227,7 @@ static AstNode *ast_parse_root_export_decl(ParseContext *pc, int *token_index, b |
| 1216 | | 1227 | |
| 1217 | *token_index += 2; | 1228 | *token_index += 2; |
| 1218 | | 1229 | |
| 1219 | AstNode *node = ast_create_node(NodeTypeRootExportDecl, export_kw); | 1230 | AstNode *node = ast_create_node(pc, NodeTypeRootExportDecl, export_kw); |
| 1220 | node->data.root_export_decl.directives = pc->directive_list; | 1231 | node->data.root_export_decl.directives = pc->directive_list; |
| 1221 | pc->directive_list = nullptr; | 1232 | pc->directive_list = nullptr; |
| 1222 | | 1233 | |
| ... | @@ -1254,7 +1265,7 @@ static AstNode *ast_parse_use(ParseContext *pc, int *token_index, bool mandatory | ... | @@ -1254,7 +1265,7 @@ static AstNode *ast_parse_use(ParseContext *pc, int *token_index, bool mandatory |
| 1254 | *token_index += 1; | 1265 | *token_index += 1; |
| 1255 | ast_expect_token(pc, semicolon, TokenIdSemicolon); | 1266 | ast_expect_token(pc, semicolon, TokenIdSemicolon); |
| 1256 | | 1267 | |
| 1257 | AstNode *node = ast_create_node(NodeTypeUse, use_kw); | 1268 | AstNode *node = ast_create_node(pc, NodeTypeUse, use_kw); |
| 1258 | | 1269 | |
| 1259 | parse_string_literal(pc, use_name, &node->data.use.path); | 1270 | parse_string_literal(pc, use_name, &node->data.use.path); |
| 1260 | | 1271 | |
| ... | @@ -1299,7 +1310,7 @@ static void ast_parse_top_level_decls(ParseContext *pc, int *token_index, ZigLis | ... | @@ -1299,7 +1310,7 @@ static void ast_parse_top_level_decls(ParseContext *pc, int *token_index, ZigLis |
| 1299 | } | 1310 | } |
| 1300 | | 1311 | |
| 1301 | if (pc->directive_list->length > 0) { | 1312 | if (pc->directive_list->length > 0) { |
| 1302 | ast_error(directive_token, "invalid directive"); | 1313 | ast_error(pc, directive_token, "invalid directive"); |
| 1303 | } | 1314 | } |
| 1304 | pc->directive_list = nullptr; | 1315 | pc->directive_list = nullptr; |
| 1305 | | 1316 | |
| ... | @@ -1312,7 +1323,7 @@ static void ast_parse_top_level_decls(ParseContext *pc, int *token_index, ZigLis | ... | @@ -1312,7 +1323,7 @@ static void ast_parse_top_level_decls(ParseContext *pc, int *token_index, ZigLis |
| 1312 | Root : many(TopLevelDecl) token(EOF) | 1323 | Root : many(TopLevelDecl) token(EOF) |
| 1313 | */ | 1324 | */ |
| 1314 | static AstNode *ast_parse_root(ParseContext *pc, int *token_index) { | 1325 | static AstNode *ast_parse_root(ParseContext *pc, int *token_index) { |
| 1315 | AstNode *node = ast_create_node(NodeTypeRoot, &pc->tokens->at(*token_index)); | 1326 | AstNode *node = ast_create_node(pc, NodeTypeRoot, &pc->tokens->at(*token_index)); |
| 1316 | | 1327 | |
| 1317 | ast_parse_top_level_decls(pc, token_index, &node->data.root.top_level_decls); | 1328 | ast_parse_top_level_decls(pc, token_index, &node->data.root.top_level_decls); |
| 1318 | | 1329 | |
| ... | @@ -1323,8 +1334,9 @@ static AstNode *ast_parse_root(ParseContext *pc, int *token_index) { | ... | @@ -1323,8 +1334,9 @@ static AstNode *ast_parse_root(ParseContext *pc, int *token_index) { |
| 1323 | return node; | 1334 | return node; |
| 1324 | } | 1335 | } |
| 1325 | | 1336 | |
| 1326 | AstNode *ast_parse(Buf *buf, ZigList<Token> *tokens) { | 1337 | AstNode *ast_parse(Buf *buf, ZigList<Token> *tokens, ImportTableEntry *owner) { |
| 1327 | ParseContext pc = {0}; | 1338 | ParseContext pc = {0}; |
| | 1339 | pc.owner = owner; |
| 1328 | pc.buf = buf; | 1340 | pc.buf = buf; |
| 1329 | pc.tokens = tokens; | 1341 | pc.tokens = tokens; |
| 1330 | int token_index = 0; | 1342 | int token_index = 0; |