Commit f4721857ed

Josh Wolfe <thejoshwolfe@gmail.com>
2015-11-30 01:16:32
inline PrimaryExpr ast node
1 parent 63d4e3c
Changed files (3)
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();
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)
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;
 };