diff --git a/src/codegen.cpp b/src/codegen.cpp index 8f3c871968..35780efa4c 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -308,10 +308,12 @@ static void find_declarations(CodeGen *g, AstNode *node) { case NodeTypeBinOpExpr: case NodeTypeFnCallExpr: case NodeTypeRootExportDecl: + case NodeTypeNumberLiteral: + case NodeTypeStringLiteral: + case NodeTypeUnreachable: + case NodeTypeSymbol: case NodeTypeCastExpr: case NodeTypePrefixOpExpr: - case NodeTypePrimaryExpr: - case NodeTypeGroupedExpr: zig_unreachable(); } } @@ -373,9 +375,8 @@ static void check_fn_def_control_flow(CodeGen *g, AstNode *node) { static Buf *hack_get_fn_call_name(CodeGen *g, AstNode *node) { // Assume that the expression evaluates to a simple name and return the buf // TODO after type checking works we should be able to remove this hack - assert(node->type == NodeTypePrimaryExpr); - assert(node->data.primary_expr.type == PrimaryExprTypeSymbol); - return &node->data.primary_expr.data.symbol; + assert(node->type == NodeTypeSymbol); + return &node->data.symbol; } static void analyze_node(CodeGen *g, AstNode *node) { @@ -521,24 +522,11 @@ static void analyze_node(CodeGen *g, AstNode *node) { case NodeTypePrefixOpExpr: zig_panic("TODO"); break; - case NodeTypePrimaryExpr: - switch (node->data.primary_expr.type) { - case PrimaryExprTypeNumber: - case PrimaryExprTypeString: - case PrimaryExprTypeUnreachable: - case PrimaryExprTypeSymbol: - // nothing to do - break; - case PrimaryExprTypeGroupedExpr: - analyze_node(g, node->data.primary_expr.data.grouped_expr); - break; - case PrimaryExprTypeBlock: - analyze_node(g, node->data.primary_expr.data.block); - break; - } - break; - case NodeTypeGroupedExpr: - zig_panic("TODO"); + case NodeTypeNumberLiteral: + case NodeTypeStringLiteral: + case NodeTypeUnreachable: + case NodeTypeSymbol: + // nothing to do break; } } @@ -651,47 +639,6 @@ static LLVMValueRef find_or_create_string(CodeGen *g, Buf *str) { return global_value; } -static LLVMValueRef gen_primary_expr(CodeGen *g, AstNode *node) { - assert(node->type == NodeTypePrimaryExpr); - - AstNodePrimaryExpr *prim_expr = &node->data.primary_expr; - - switch (node->data.primary_expr.type) { - case PrimaryExprTypeNumber: - { - Buf *number_str = &prim_expr->data.number; - LLVMTypeRef number_type = LLVMInt32Type(); - LLVMValueRef number_val = LLVMConstIntOfStringAndSize(number_type, - buf_ptr(number_str), buf_len(number_str), 10); - return number_val; - } - case PrimaryExprTypeString: - { - Buf *str = &prim_expr->data.string; - LLVMValueRef str_val = find_or_create_string(g, str); - LLVMValueRef indices[] = { - LLVMConstInt(LLVMInt32Type(), 0, false), - LLVMConstInt(LLVMInt32Type(), 0, false) - }; - LLVMValueRef ptr_val = LLVMBuildInBoundsGEP(g->builder, str_val, indices, 2, ""); - return ptr_val; - } - case PrimaryExprTypeUnreachable: - add_debug_source_node(g, node); - return LLVMBuildUnreachable(g->builder); - case PrimaryExprTypeGroupedExpr: - return gen_expr(g, prim_expr->data.grouped_expr); - case PrimaryExprTypeBlock: - zig_panic("TODO block in expression"); - break; - case PrimaryExprTypeSymbol: - zig_panic("TODO variable reference"); - break; - } - - zig_unreachable(); -} - static LLVMValueRef gen_fn_call_expr(CodeGen *g, AstNode *node) { assert(node->type == NodeTypeFnCallExpr); @@ -964,8 +911,28 @@ static LLVMValueRef gen_expr(CodeGen *g, AstNode *node) { return gen_prefix_op_expr(g, node); case NodeTypeFnCallExpr: return gen_fn_call_expr(g, node); - case NodeTypePrimaryExpr: - return gen_primary_expr(g, node); + case NodeTypeUnreachable: + add_debug_source_node(g, node); + return LLVMBuildUnreachable(g->builder); + case NodeTypeNumberLiteral: + { + Buf *number_str = &node->data.number; + LLVMTypeRef number_type = LLVMInt32Type(); + LLVMValueRef number_val = LLVMConstIntOfStringAndSize(number_type, + buf_ptr(number_str), buf_len(number_str), 10); + return number_val; + } + case NodeTypeStringLiteral: + { + Buf *str = &node->data.string; + LLVMValueRef str_val = find_or_create_string(g, str); + LLVMValueRef indices[] = { + LLVMConstInt(LLVMInt32Type(), 0, false), + LLVMConstInt(LLVMInt32Type(), 0, false) + }; + LLVMValueRef ptr_val = LLVMBuildInBoundsGEP(g->builder, str_val, indices, 2, ""); + return ptr_val; + } case NodeTypeRoot: case NodeTypeRootExportDecl: case NodeTypeFnProto: @@ -976,7 +943,7 @@ static LLVMValueRef gen_expr(CodeGen *g, AstNode *node) { case NodeTypeBlock: case NodeTypeExternBlock: case NodeTypeDirective: - case NodeTypeGroupedExpr: + case NodeTypeSymbol: zig_unreachable(); } zig_unreachable(); diff --git a/src/parser.cpp b/src/parser.cpp index 34d7f4ae96..f88329b40f 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -90,10 +90,14 @@ const char *node_type_str(NodeType node_type) { return "ReturnExpr"; case NodeTypeCastExpr: return "CastExpr"; - case NodeTypePrimaryExpr: - return "PrimaryExpr"; - case NodeTypeGroupedExpr: - return "GroupedExpr"; + case NodeTypeNumberLiteral: + return "NumberLiteral"; + case NodeTypeStringLiteral: + return "StringLiteral"; + case NodeTypeUnreachable: + return "Unreachable"; + case NodeTypeSymbol: + return "Symbol"; case NodeTypePrefixOpExpr: return "PrefixOpExpr"; } @@ -222,36 +226,20 @@ void ast_print(AstNode *node, int indent) { prefix_op_str(node->data.prefix_op_expr.prefix_op)); ast_print(node->data.prefix_op_expr.primary_expr, indent + 2); break; - case NodeTypePrimaryExpr: - switch (node->data.primary_expr.type) { - case PrimaryExprTypeNumber: - fprintf(stderr, "PrimaryExpr Number %s\n", - buf_ptr(&node->data.primary_expr.data.number)); - break; - case PrimaryExprTypeString: - fprintf(stderr, "PrimaryExpr String '%s'\n", - buf_ptr(&node->data.primary_expr.data.string)); - break; - case PrimaryExprTypeUnreachable: - fprintf(stderr, "PrimaryExpr Unreachable\n"); - break; - case PrimaryExprTypeGroupedExpr: - fprintf(stderr, "PrimaryExpr GroupedExpr\n"); - ast_print(node->data.primary_expr.data.grouped_expr, indent + 2); - break; - case PrimaryExprTypeBlock: - fprintf(stderr, "PrimaryExpr Block\n"); - ast_print(node->data.primary_expr.data.block, indent + 2); - break; - case PrimaryExprTypeSymbol: - fprintf(stderr, "PrimaryExpr Symbol %s\n", - buf_ptr(&node->data.primary_expr.data.symbol)); - break; - } + case NodeTypeNumberLiteral: + fprintf(stderr, "PrimaryExpr Number %s\n", + buf_ptr(&node->data.number)); break; - case NodeTypeGroupedExpr: - fprintf(stderr, "%s\n", node_type_str(node->type)); - ast_print(node->data.grouped_expr.expr, indent + 2); + case NodeTypeStringLiteral: + fprintf(stderr, "PrimaryExpr String '%s'\n", + buf_ptr(&node->data.string)); + break; + case NodeTypeUnreachable: + fprintf(stderr, "PrimaryExpr Unreachable\n"); + break; + case NodeTypeSymbol: + fprintf(stderr, "PrimaryExpr Symbol %s\n", + buf_ptr(&node->data.symbol)); break; } } @@ -535,9 +523,11 @@ static AstNode *ast_parse_grouped_expr(ParseContext *pc, int *token_index, bool *token_index += 1; - AstNode *node = ast_create_node(NodeTypeGroupedExpr, l_paren); + AstNode *node = ast_parse_expression(pc, token_index, true); - node->data.grouped_expr.expr = ast_parse_expression(pc, token_index, true); + Token *r_paren = &pc->tokens->at(*token_index); + *token_index += 1; + ast_expect_token(pc, r_paren, TokenIdRParen); return node; } @@ -549,44 +539,34 @@ static AstNode *ast_parse_primary_expr(ParseContext *pc, int *token_index, bool Token *token = &pc->tokens->at(*token_index); if (token->id == TokenIdNumberLiteral) { - AstNode *node = ast_create_node(NodeTypePrimaryExpr, token); - node->data.primary_expr.type = PrimaryExprTypeNumber; - ast_buf_from_token(pc, token, &node->data.primary_expr.data.number); + AstNode *node = ast_create_node(NodeTypeNumberLiteral, token); + ast_buf_from_token(pc, token, &node->data.number); *token_index += 1; return node; } else if (token->id == TokenIdStringLiteral) { - AstNode *node = ast_create_node(NodeTypePrimaryExpr, token); - node->data.primary_expr.type = PrimaryExprTypeString; - parse_string_literal(pc, token, &node->data.primary_expr.data.string); + AstNode *node = ast_create_node(NodeTypeStringLiteral, token); + parse_string_literal(pc, token, &node->data.string); *token_index += 1; return node; } else if (token->id == TokenIdKeywordUnreachable) { - AstNode *node = ast_create_node(NodeTypePrimaryExpr, token); - node->data.primary_expr.type = PrimaryExprTypeUnreachable; + AstNode *node = ast_create_node(NodeTypeUnreachable, token); *token_index += 1; return node; } else if (token->id == TokenIdSymbol) { - AstNode *node = ast_create_node(NodeTypePrimaryExpr, token); - node->data.primary_expr.type = PrimaryExprTypeSymbol; - ast_buf_from_token(pc, token, &node->data.primary_expr.data.symbol); + AstNode *node = ast_create_node(NodeTypeSymbol, token); + ast_buf_from_token(pc, token, &node->data.symbol); *token_index += 1; return node; } AstNode *block_node = ast_parse_block(pc, token_index, false); if (block_node) { - AstNode *node = ast_create_node(NodeTypePrimaryExpr, token); - node->data.primary_expr.type = PrimaryExprTypeBlock; - node->data.primary_expr.data.block = block_node; - return node; + return block_node; } AstNode *grouped_expr_node = ast_parse_grouped_expr(pc, token_index, false); if (grouped_expr_node) { - AstNode *node = ast_create_node(NodeTypePrimaryExpr, token); - node->data.primary_expr.type = PrimaryExprTypeGroupedExpr; - node->data.primary_expr.data.grouped_expr = grouped_expr_node; - return node; + return grouped_expr_node; } if (!mandatory) diff --git a/src/parser.hpp b/src/parser.hpp index 1534e180e9..86b29870e5 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -29,8 +29,10 @@ enum NodeType { NodeTypeReturnExpr, NodeTypeBinOpExpr, NodeTypeCastExpr, - NodeTypePrimaryExpr, - NodeTypeGroupedExpr, + NodeTypeNumberLiteral, + NodeTypeStringLiteral, + NodeTypeUnreachable, + NodeTypeSymbol, NodeTypePrefixOpExpr, NodeTypeFnCallExpr, }; @@ -144,30 +146,6 @@ struct AstNodeCastExpr { AstNode *type; }; -enum PrimaryExprType { - PrimaryExprTypeNumber, - PrimaryExprTypeString, - PrimaryExprTypeUnreachable, - PrimaryExprTypeGroupedExpr, - PrimaryExprTypeBlock, - PrimaryExprTypeSymbol, -}; - -struct AstNodePrimaryExpr { - PrimaryExprType type; - union { - Buf number; - Buf string; - Buf symbol; - AstNode *grouped_expr; - AstNode *block; - } data; -}; - -struct AstNodeGroupedExpr { - AstNode *expr; -}; - enum PrefixOp { PrefixOpInvalid, PrefixOpBoolNot, @@ -200,10 +178,11 @@ struct AstNode { AstNodeExternBlock extern_block; AstNodeDirective directive; AstNodeCastExpr cast_expr; - AstNodePrimaryExpr primary_expr; - AstNodeGroupedExpr grouped_expr; AstNodePrefixOpExpr prefix_op_expr; AstNodeFnCallExpr fn_call_expr; + Buf number; + Buf string; + Buf symbol; } data; };