Commit f4721857ed
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;
};