| author | |
| committer | |
| log | f4721857ed140add1f57badd1dc284fb24021ae0 |
| tree | 5536ef9af371ce17bf7a32f58836256273fa9413 |
| parent | 63d4e3ce1eefa8fe150c1cfddbac3cd6bd361862 |
3 files changed, 75 insertions(+), 149 deletions(-)
src/codegen.cpp+34-67| ... | ... | @@ -308,10 +308,12 @@ static void find_declarations(CodeGen *g, AstNode *node) { |
| 308 | 308 | case NodeTypeBinOpExpr: |
| 309 | 309 | case NodeTypeFnCallExpr: |
| 310 | 310 | case NodeTypeRootExportDecl: |
| 311 | case NodeTypeNumberLiteral: | |
| 312 | case NodeTypeStringLiteral: | |
| 313 | case NodeTypeUnreachable: | |
| 314 | case NodeTypeSymbol: | |
| 311 | 315 | case NodeTypeCastExpr: |
| 312 | 316 | case NodeTypePrefixOpExpr: |
| 313 | case NodeTypePrimaryExpr: | |
| 314 | case NodeTypeGroupedExpr: | |
| 315 | 317 | zig_unreachable(); |
| 316 | 318 | } |
| 317 | 319 | } |
| ... | ... | @@ -373,9 +375,8 @@ static void check_fn_def_control_flow(CodeGen *g, AstNode *node) { |
| 373 | 375 | static Buf *hack_get_fn_call_name(CodeGen *g, AstNode *node) { |
| 374 | 376 | // Assume that the expression evaluates to a simple name and return the buf |
| 375 | 377 | // TODO after type checking works we should be able to remove this hack |
| 376 | assert(node->type == NodeTypePrimaryExpr); | |
| 377 | assert(node->data.primary_expr.type == PrimaryExprTypeSymbol); | |
| 378 | return &node->data.primary_expr.data.symbol; | |
| 378 | assert(node->type == NodeTypeSymbol); | |
| 379 | return &node->data.symbol; | |
| 379 | 380 | } |
| 380 | 381 | |
| 381 | 382 | static void analyze_node(CodeGen *g, AstNode *node) { |
| ... | ... | @@ -521,24 +522,11 @@ static void analyze_node(CodeGen *g, AstNode *node) { |
| 521 | 522 | case NodeTypePrefixOpExpr: |
| 522 | 523 | zig_panic("TODO"); |
| 523 | 524 | break; |
| 524 | case NodeTypePrimaryExpr: | |
| 525 | switch (node->data.primary_expr.type) { | |
| 526 | case PrimaryExprTypeNumber: | |
| 527 | case PrimaryExprTypeString: | |
| 528 | case PrimaryExprTypeUnreachable: | |
| 529 | case PrimaryExprTypeSymbol: | |
| 530 | // nothing to do | |
| 531 | break; | |
| 532 | case PrimaryExprTypeGroupedExpr: | |
| 533 | analyze_node(g, node->data.primary_expr.data.grouped_expr); | |
| 534 | break; | |
| 535 | case PrimaryExprTypeBlock: | |
| 536 | analyze_node(g, node->data.primary_expr.data.block); | |
| 537 | break; | |
| 538 | } | |
| 539 | break; | |
| 540 | case NodeTypeGroupedExpr: | |
| 541 | zig_panic("TODO"); | |
| 525 | case NodeTypeNumberLiteral: | |
| 526 | case NodeTypeStringLiteral: | |
| 527 | case NodeTypeUnreachable: | |
| 528 | case NodeTypeSymbol: | |
| 529 | // nothing to do | |
| 542 | 530 | break; |
| 543 | 531 | } |
| 544 | 532 | } |
| ... | ... | @@ -651,47 +639,6 @@ static LLVMValueRef find_or_create_string(CodeGen *g, Buf *str) { |
| 651 | 639 | return global_value; |
| 652 | 640 | } |
| 653 | 641 | |
| 654 | static LLVMValueRef gen_primary_expr(CodeGen *g, AstNode *node) { | |
| 655 | assert(node->type == NodeTypePrimaryExpr); | |
| 656 | ||
| 657 | AstNodePrimaryExpr *prim_expr = &node->data.primary_expr; | |
| 658 | ||
| 659 | switch (node->data.primary_expr.type) { | |
| 660 | case PrimaryExprTypeNumber: | |
| 661 | { | |
| 662 | Buf *number_str = &prim_expr->data.number; | |
| 663 | LLVMTypeRef number_type = LLVMInt32Type(); | |
| 664 | LLVMValueRef number_val = LLVMConstIntOfStringAndSize(number_type, | |
| 665 | buf_ptr(number_str), buf_len(number_str), 10); | |
| 666 | return number_val; | |
| 667 | } | |
| 668 | case PrimaryExprTypeString: | |
| 669 | { | |
| 670 | Buf *str = &prim_expr->data.string; | |
| 671 | LLVMValueRef str_val = find_or_create_string(g, str); | |
| 672 | LLVMValueRef indices[] = { | |
| 673 | LLVMConstInt(LLVMInt32Type(), 0, false), | |
| 674 | LLVMConstInt(LLVMInt32Type(), 0, false) | |
| 675 | }; | |
| 676 | LLVMValueRef ptr_val = LLVMBuildInBoundsGEP(g->builder, str_val, indices, 2, ""); | |
| 677 | return ptr_val; | |
| 678 | } | |
| 679 | case PrimaryExprTypeUnreachable: | |
| 680 | add_debug_source_node(g, node); | |
| 681 | return LLVMBuildUnreachable(g->builder); | |
| 682 | case PrimaryExprTypeGroupedExpr: | |
| 683 | return gen_expr(g, prim_expr->data.grouped_expr); | |
| 684 | case PrimaryExprTypeBlock: | |
| 685 | zig_panic("TODO block in expression"); | |
| 686 | break; | |
| 687 | case PrimaryExprTypeSymbol: | |
| 688 | zig_panic("TODO variable reference"); | |
| 689 | break; | |
| 690 | } | |
| 691 | ||
| 692 | zig_unreachable(); | |
| 693 | } | |
| 694 | ||
| 695 | 642 | static LLVMValueRef gen_fn_call_expr(CodeGen *g, AstNode *node) { |
| 696 | 643 | assert(node->type == NodeTypeFnCallExpr); |
| 697 | 644 | |
| ... | ... | @@ -964,8 +911,28 @@ static LLVMValueRef gen_expr(CodeGen *g, AstNode *node) { |
| 964 | 911 | return gen_prefix_op_expr(g, node); |
| 965 | 912 | case NodeTypeFnCallExpr: |
| 966 | 913 | return gen_fn_call_expr(g, node); |
| 967 | case NodeTypePrimaryExpr: | |
| 968 | return gen_primary_expr(g, node); | |
| 914 | case NodeTypeUnreachable: | |
| 915 | add_debug_source_node(g, node); | |
| 916 | return LLVMBuildUnreachable(g->builder); | |
| 917 | case NodeTypeNumberLiteral: | |
| 918 | { | |
| 919 | Buf *number_str = &node->data.number; | |
| 920 | LLVMTypeRef number_type = LLVMInt32Type(); | |
| 921 | LLVMValueRef number_val = LLVMConstIntOfStringAndSize(number_type, | |
| 922 | buf_ptr(number_str), buf_len(number_str), 10); | |
| 923 | return number_val; | |
| 924 | } | |
| 925 | case NodeTypeStringLiteral: | |
| 926 | { | |
| 927 | Buf *str = &node->data.string; | |
| 928 | LLVMValueRef str_val = find_or_create_string(g, str); | |
| 929 | LLVMValueRef indices[] = { | |
| 930 | LLVMConstInt(LLVMInt32Type(), 0, false), | |
| 931 | LLVMConstInt(LLVMInt32Type(), 0, false) | |
| 932 | }; | |
| 933 | LLVMValueRef ptr_val = LLVMBuildInBoundsGEP(g->builder, str_val, indices, 2, ""); | |
| 934 | return ptr_val; | |
| 935 | } | |
| 969 | 936 | case NodeTypeRoot: |
| 970 | 937 | case NodeTypeRootExportDecl: |
| 971 | 938 | case NodeTypeFnProto: |
| ... | ... | @@ -976,7 +943,7 @@ static LLVMValueRef gen_expr(CodeGen *g, AstNode *node) { |
| 976 | 943 | case NodeTypeBlock: |
| 977 | 944 | case NodeTypeExternBlock: |
| 978 | 945 | case NodeTypeDirective: |
| 979 | case NodeTypeGroupedExpr: | |
| 946 | case NodeTypeSymbol: | |
| 980 | 947 | zig_unreachable(); |
| 981 | 948 | } |
| 982 | 949 | zig_unreachable(); |
src/parser.cpp+34-54| ... | ... | @@ -90,10 +90,14 @@ const char *node_type_str(NodeType node_type) { |
| 90 | 90 | return "ReturnExpr"; |
| 91 | 91 | case NodeTypeCastExpr: |
| 92 | 92 | return "CastExpr"; |
| 93 | case NodeTypePrimaryExpr: | |
| 94 | return "PrimaryExpr"; | |
| 95 | case NodeTypeGroupedExpr: | |
| 96 | return "GroupedExpr"; | |
| 93 | case NodeTypeNumberLiteral: | |
| 94 | return "NumberLiteral"; | |
| 95 | case NodeTypeStringLiteral: | |
| 96 | return "StringLiteral"; | |
| 97 | case NodeTypeUnreachable: | |
| 98 | return "Unreachable"; | |
| 99 | case NodeTypeSymbol: | |
| 100 | return "Symbol"; | |
| 97 | 101 | case NodeTypePrefixOpExpr: |
| 98 | 102 | return "PrefixOpExpr"; |
| 99 | 103 | } |
| ... | ... | @@ -222,36 +226,20 @@ void ast_print(AstNode *node, int indent) { |
| 222 | 226 | prefix_op_str(node->data.prefix_op_expr.prefix_op)); |
| 223 | 227 | ast_print(node->data.prefix_op_expr.primary_expr, indent + 2); |
| 224 | 228 | break; |
| 225 | case NodeTypePrimaryExpr: | |
| 226 | switch (node->data.primary_expr.type) { | |
| 227 | case PrimaryExprTypeNumber: | |
| 228 | fprintf(stderr, "PrimaryExpr Number %s\n", | |
| 229 | buf_ptr(&node->data.primary_expr.data.number)); | |
| 230 | break; | |
| 231 | case PrimaryExprTypeString: | |
| 232 | fprintf(stderr, "PrimaryExpr String '%s'\n", | |
| 233 | buf_ptr(&node->data.primary_expr.data.string)); | |
| 234 | break; | |
| 235 | case PrimaryExprTypeUnreachable: | |
| 236 | fprintf(stderr, "PrimaryExpr Unreachable\n"); | |
| 237 | break; | |
| 238 | case PrimaryExprTypeGroupedExpr: | |
| 239 | fprintf(stderr, "PrimaryExpr GroupedExpr\n"); | |
| 240 | ast_print(node->data.primary_expr.data.grouped_expr, indent + 2); | |
| 241 | break; | |
| 242 | case PrimaryExprTypeBlock: | |
| 243 | fprintf(stderr, "PrimaryExpr Block\n"); | |
| 244 | ast_print(node->data.primary_expr.data.block, indent + 2); | |
| 245 | break; | |
| 246 | case PrimaryExprTypeSymbol: | |
| 247 | fprintf(stderr, "PrimaryExpr Symbol %s\n", | |
| 248 | buf_ptr(&node->data.primary_expr.data.symbol)); | |
| 249 | break; | |
| 250 | } | |
| 229 | case NodeTypeNumberLiteral: | |
| 230 | fprintf(stderr, "PrimaryExpr Number %s\n", | |
| 231 | buf_ptr(&node->data.number)); | |
| 251 | 232 | break; |
| 252 | case NodeTypeGroupedExpr: | |
| 253 | fprintf(stderr, "%s\n", node_type_str(node->type)); | |
| 254 | ast_print(node->data.grouped_expr.expr, indent + 2); | |
| 233 | case NodeTypeStringLiteral: | |
| 234 | fprintf(stderr, "PrimaryExpr String '%s'\n", | |
| 235 | buf_ptr(&node->data.string)); | |
| 236 | break; | |
| 237 | case NodeTypeUnreachable: | |
| 238 | fprintf(stderr, "PrimaryExpr Unreachable\n"); | |
| 239 | break; | |
| 240 | case NodeTypeSymbol: | |
| 241 | fprintf(stderr, "PrimaryExpr Symbol %s\n", | |
| 242 | buf_ptr(&node->data.symbol)); | |
| 255 | 243 | break; |
| 256 | 244 | } |
| 257 | 245 | } |
| ... | ... | @@ -535,9 +523,11 @@ static AstNode *ast_parse_grouped_expr(ParseContext *pc, int *token_index, bool |
| 535 | 523 | |
| 536 | 524 | *token_index += 1; |
| 537 | 525 | |
| 538 | AstNode *node = ast_create_node(NodeTypeGroupedExpr, l_paren); | |
| 526 | AstNode *node = ast_parse_expression(pc, token_index, true); | |
| 539 | 527 | |
| 540 | node->data.grouped_expr.expr = ast_parse_expression(pc, token_index, true); | |
| 528 | Token *r_paren = &pc->tokens->at(*token_index); | |
| 529 | *token_index += 1; | |
| 530 | ast_expect_token(pc, r_paren, TokenIdRParen); | |
| 541 | 531 | |
| 542 | 532 | return node; |
| 543 | 533 | } |
| ... | ... | @@ -549,44 +539,34 @@ static AstNode *ast_parse_primary_expr(ParseContext *pc, int *token_index, bool |
| 549 | 539 | Token *token = &pc->tokens->at(*token_index); |
| 550 | 540 | |
| 551 | 541 | if (token->id == TokenIdNumberLiteral) { |
| 552 | AstNode *node = ast_create_node(NodeTypePrimaryExpr, token); | |
| 553 | node->data.primary_expr.type = PrimaryExprTypeNumber; | |
| 554 | ast_buf_from_token(pc, token, &node->data.primary_expr.data.number); | |
| 542 | AstNode *node = ast_create_node(NodeTypeNumberLiteral, token); | |
| 543 | ast_buf_from_token(pc, token, &node->data.number); | |
| 555 | 544 | *token_index += 1; |
| 556 | 545 | return node; |
| 557 | 546 | } else if (token->id == TokenIdStringLiteral) { |
| 558 | AstNode *node = ast_create_node(NodeTypePrimaryExpr, token); | |
| 559 | node->data.primary_expr.type = PrimaryExprTypeString; | |
| 560 | parse_string_literal(pc, token, &node->data.primary_expr.data.string); | |
| 547 | AstNode *node = ast_create_node(NodeTypeStringLiteral, token); | |
| 548 | parse_string_literal(pc, token, &node->data.string); | |
| 561 | 549 | *token_index += 1; |
| 562 | 550 | return node; |
| 563 | 551 | } else if (token->id == TokenIdKeywordUnreachable) { |
| 564 | AstNode *node = ast_create_node(NodeTypePrimaryExpr, token); | |
| 565 | node->data.primary_expr.type = PrimaryExprTypeUnreachable; | |
| 552 | AstNode *node = ast_create_node(NodeTypeUnreachable, token); | |
| 566 | 553 | *token_index += 1; |
| 567 | 554 | return node; |
| 568 | 555 | } else if (token->id == TokenIdSymbol) { |
| 569 | AstNode *node = ast_create_node(NodeTypePrimaryExpr, token); | |
| 570 | node->data.primary_expr.type = PrimaryExprTypeSymbol; | |
| 571 | ast_buf_from_token(pc, token, &node->data.primary_expr.data.symbol); | |
| 556 | AstNode *node = ast_create_node(NodeTypeSymbol, token); | |
| 557 | ast_buf_from_token(pc, token, &node->data.symbol); | |
| 572 | 558 | *token_index += 1; |
| 573 | 559 | return node; |
| 574 | 560 | } |
| 575 | 561 | |
| 576 | 562 | AstNode *block_node = ast_parse_block(pc, token_index, false); |
| 577 | 563 | if (block_node) { |
| 578 | AstNode *node = ast_create_node(NodeTypePrimaryExpr, token); | |
| 579 | node->data.primary_expr.type = PrimaryExprTypeBlock; | |
| 580 | node->data.primary_expr.data.block = block_node; | |
| 581 | return node; | |
| 564 | return block_node; | |
| 582 | 565 | } |
| 583 | 566 | |
| 584 | 567 | AstNode *grouped_expr_node = ast_parse_grouped_expr(pc, token_index, false); |
| 585 | 568 | if (grouped_expr_node) { |
| 586 | AstNode *node = ast_create_node(NodeTypePrimaryExpr, token); | |
| 587 | node->data.primary_expr.type = PrimaryExprTypeGroupedExpr; | |
| 588 | node->data.primary_expr.data.grouped_expr = grouped_expr_node; | |
| 589 | return node; | |
| 569 | return grouped_expr_node; | |
| 590 | 570 | } |
| 591 | 571 | |
| 592 | 572 | if (!mandatory) |
src/parser.hpp+7-28| ... | ... | @@ -29,8 +29,10 @@ enum NodeType { |
| 29 | 29 | NodeTypeReturnExpr, |
| 30 | 30 | NodeTypeBinOpExpr, |
| 31 | 31 | NodeTypeCastExpr, |
| 32 | NodeTypePrimaryExpr, | |
| 33 | NodeTypeGroupedExpr, | |
| 32 | NodeTypeNumberLiteral, | |
| 33 | NodeTypeStringLiteral, | |
| 34 | NodeTypeUnreachable, | |
| 35 | NodeTypeSymbol, | |
| 34 | 36 | NodeTypePrefixOpExpr, |
| 35 | 37 | NodeTypeFnCallExpr, |
| 36 | 38 | }; |
| ... | ... | @@ -144,30 +146,6 @@ struct AstNodeCastExpr { |
| 144 | 146 | AstNode *type; |
| 145 | 147 | }; |
| 146 | 148 | |
| 147 | enum PrimaryExprType { | |
| 148 | PrimaryExprTypeNumber, | |
| 149 | PrimaryExprTypeString, | |
| 150 | PrimaryExprTypeUnreachable, | |
| 151 | PrimaryExprTypeGroupedExpr, | |
| 152 | PrimaryExprTypeBlock, | |
| 153 | PrimaryExprTypeSymbol, | |
| 154 | }; | |
| 155 | ||
| 156 | struct AstNodePrimaryExpr { | |
| 157 | PrimaryExprType type; | |
| 158 | union { | |
| 159 | Buf number; | |
| 160 | Buf string; | |
| 161 | Buf symbol; | |
| 162 | AstNode *grouped_expr; | |
| 163 | AstNode *block; | |
| 164 | } data; | |
| 165 | }; | |
| 166 | ||
| 167 | struct AstNodeGroupedExpr { | |
| 168 | AstNode *expr; | |
| 169 | }; | |
| 170 | ||
| 171 | 149 | enum PrefixOp { |
| 172 | 150 | PrefixOpInvalid, |
| 173 | 151 | PrefixOpBoolNot, |
| ... | ... | @@ -200,10 +178,11 @@ struct AstNode { |
| 200 | 178 | AstNodeExternBlock extern_block; |
| 201 | 179 | AstNodeDirective directive; |
| 202 | 180 | AstNodeCastExpr cast_expr; |
| 203 | AstNodePrimaryExpr primary_expr; | |
| 204 | AstNodeGroupedExpr grouped_expr; | |
| 205 | 181 | AstNodePrefixOpExpr prefix_op_expr; |
| 206 | 182 | AstNodeFnCallExpr fn_call_expr; |
| 183 | Buf number; | |
| 184 | Buf string; | |
| 185 | Buf symbol; | |
| 207 | 186 | } data; |
| 208 | 187 | }; |
| 209 | 188 |