authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2015-11-29 14:00:34-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2015-11-29 14:00:34-07:00
log918e7641fcaa79f75a365751de571807578ae503
tree83c58b7b2c8f4141935beb9612d4fd7f0b26fc49
parenta7555c58d97480e439d1543cc0d4e001b23e4dd1

rename unary expression to prefix op expression


5 files changed, 64 insertions(+), 65 deletions(-)

README.md+6-6
...@@ -138,17 +138,17 @@ MultiplyExpression : CastExpression MultiplyOperator CastExpression | CastExpres...@@ -138,17 +138,17 @@ MultiplyExpression : CastExpression MultiplyOperator CastExpression | CastExpres
138138
139MultiplyOperator : token(Star) | token(Slash) | token(Percent)139MultiplyOperator : token(Star) | token(Slash) | token(Percent)
140140
141CastExpression : UnaryExpression token(as) Type | UnaryExpression141CastExpression : PrefixOpExpression token(as) Type | PrefixOpExpression
142142
143UnaryExpression : UnaryOp PrimaryExpression | PrimaryExpression143PrefixOpExpression : PrefixOp FnCallExpression | FnCallExpression
144144
145UnaryOp : token(Not) | token(Dash) | token(Tilde)145FnCallExpression : PrimaryExpression token(LParen) list(Expression, token(Comma)) token(RParen)
146146
147PrimaryExpression : token(Number) | token(String) | token(Unreachable) | FnCall | GroupedExpression | Block147PrefixOp : token(Not) | token(Dash) | token(Tilde)
148148
149GroupedExpression : token(LParen) Expression token(RParen)149PrimaryExpression : token(Number) | token(String) | token(Unreachable) | GroupedExpression | Block
150150
151FnCall : token(Symbol) token(LParen) list(Expression, token(Comma)) token(RParen)151GroupedExpression : token(LParen) Expression token(RParen)
152152
153Directive : token(NumberSign) token(Symbol) token(LParen) token(String) token(RParen)153Directive : token(NumberSign) token(Symbol) token(LParen) token(String) token(RParen)
154```154```
example/math.zig-1
...@@ -3,4 +3,3 @@ export library "math";...@@ -3,4 +3,3 @@ export library "math";
3export fn add(a: i32, b: i32) -> i32 {3export fn add(a: i32, b: i32) -> i32 {
4 return a + b;4 return a + b;
5}5}
6
src/codegen.cpp+14-14
...@@ -317,7 +317,7 @@ static void find_declarations(CodeGen *g, AstNode *node) {...@@ -317,7 +317,7 @@ static void find_declarations(CodeGen *g, AstNode *node) {
317 case NodeTypeAddExpr:317 case NodeTypeAddExpr:
318 case NodeTypeMultExpr:318 case NodeTypeMultExpr:
319 case NodeTypeCastExpr:319 case NodeTypeCastExpr:
320 case NodeTypeUnaryExpr:320 case NodeTypePrefixOpExpr:
321 case NodeTypePrimaryExpr:321 case NodeTypePrimaryExpr:
322 case NodeTypeGroupedExpr:322 case NodeTypeGroupedExpr:
323 zig_unreachable();323 zig_unreachable();
...@@ -543,7 +543,7 @@ static void analyze_node(CodeGen *g, AstNode *node) {...@@ -543,7 +543,7 @@ static void analyze_node(CodeGen *g, AstNode *node) {
543 case NodeTypeCastExpr:543 case NodeTypeCastExpr:
544 zig_panic("TODO");544 zig_panic("TODO");
545 break;545 break;
546 case NodeTypeUnaryExpr:546 case NodeTypePrefixOpExpr:
547 zig_panic("TODO");547 zig_panic("TODO");
548 break;548 break;
549 case NodeTypePrimaryExpr:549 case NodeTypePrimaryExpr:
...@@ -744,26 +744,26 @@ static LLVMValueRef gen_primary_expr(CodeGen *g, AstNode *node) {...@@ -744,26 +744,26 @@ static LLVMValueRef gen_primary_expr(CodeGen *g, AstNode *node) {
744 zig_unreachable();744 zig_unreachable();
745}745}
746746
747static LLVMValueRef gen_unary_expr(CodeGen *g, AstNode *node) {747static LLVMValueRef gen_prefix_op_expr(CodeGen *g, AstNode *node) {
748 assert(node->type == NodeTypeUnaryExpr);748 assert(node->type == NodeTypePrefixOpExpr);
749 assert(node->data.unary_expr.primary_expr);749 assert(node->data.prefix_op_expr.primary_expr);
750750
751 LLVMValueRef expr = gen_expr(g, node->data.unary_expr.primary_expr);751 LLVMValueRef expr = gen_expr(g, node->data.prefix_op_expr.primary_expr);
752752
753 switch (node->data.unary_expr.unary_op) {753 switch (node->data.prefix_op_expr.prefix_op) {
754 case UnaryOpNegation:754 case PrefixOpNegation:
755 add_debug_source_node(g, node);755 add_debug_source_node(g, node);
756 return LLVMBuildNeg(g->builder, expr, "");756 return LLVMBuildNeg(g->builder, expr, "");
757 case UnaryOpBoolNot:757 case PrefixOpBoolNot:
758 {758 {
759 LLVMValueRef zero = LLVMConstNull(LLVMTypeOf(expr));759 LLVMValueRef zero = LLVMConstNull(LLVMTypeOf(expr));
760 add_debug_source_node(g, node);760 add_debug_source_node(g, node);
761 return LLVMBuildICmp(g->builder, LLVMIntEQ, expr, zero, "");761 return LLVMBuildICmp(g->builder, LLVMIntEQ, expr, zero, "");
762 }762 }
763 case UnaryOpBinNot:763 case PrefixOpBinNot:
764 add_debug_source_node(g, node);764 add_debug_source_node(g, node);
765 return LLVMBuildNot(g->builder, expr, "");765 return LLVMBuildNot(g->builder, expr, "");
766 case UnaryOpInvalid:766 case PrefixOpInvalid:
767 zig_unreachable();767 zig_unreachable();
768 }768 }
769769
...@@ -772,7 +772,7 @@ static LLVMValueRef gen_unary_expr(CodeGen *g, AstNode *node) {...@@ -772,7 +772,7 @@ static LLVMValueRef gen_unary_expr(CodeGen *g, AstNode *node) {
772static LLVMValueRef gen_cast_expr(CodeGen *g, AstNode *node) {772static LLVMValueRef gen_cast_expr(CodeGen *g, AstNode *node) {
773 assert(node->type == NodeTypeCastExpr);773 assert(node->type == NodeTypeCastExpr);
774774
775 LLVMValueRef expr = gen_expr(g, node->data.cast_expr.unary_expr);775 LLVMValueRef expr = gen_expr(g, node->data.cast_expr.prefix_op_expr);
776776
777 if (!node->data.cast_expr.type)777 if (!node->data.cast_expr.type)
778 return expr;778 return expr;
...@@ -1026,8 +1026,8 @@ static LLVMValueRef gen_expr(CodeGen *g, AstNode *node) {...@@ -1026,8 +1026,8 @@ static LLVMValueRef gen_expr(CodeGen *g, AstNode *node) {
1026 return gen_bool_or_expr(g, node);1026 return gen_bool_or_expr(g, node);
1027 case NodeTypeReturnExpr:1027 case NodeTypeReturnExpr:
1028 return gen_return_expr(g, node);1028 return gen_return_expr(g, node);
1029 case NodeTypeUnaryExpr:1029 case NodeTypePrefixOpExpr:
1030 return gen_unary_expr(g, node);1030 return gen_prefix_op_expr(g, node);
1031 case NodeTypeRoot:1031 case NodeTypeRoot:
1032 case NodeTypeRootExportDecl:1032 case NodeTypeRootExportDecl:
1033 case NodeTypeFnProto:1033 case NodeTypeFnProto:
src/parser.cpp+34-34
...@@ -10,12 +10,12 @@...@@ -10,12 +10,12 @@
10#include <stdarg.h>10#include <stdarg.h>
11#include <stdio.h>11#include <stdio.h>
1212
13static const char *unary_op_str(UnaryOp unary_op) {13static const char *prefix_op_str(PrefixOp prefix_op) {
14 switch (unary_op) {14 switch (prefix_op) {
15 case UnaryOpInvalid: return "(invalid)";15 case PrefixOpInvalid: return "(invalid)";
16 case UnaryOpNegation: return "-";16 case PrefixOpNegation: return "-";
17 case UnaryOpBoolNot: return "!";17 case PrefixOpBoolNot: return "!";
18 case UnaryOpBinNot: return "~";18 case PrefixOpBinNot: return "~";
19 }19 }
20 zig_unreachable();20 zig_unreachable();
21}21}
...@@ -126,8 +126,8 @@ const char *node_type_str(NodeType node_type) {...@@ -126,8 +126,8 @@ const char *node_type_str(NodeType node_type) {
126 return "PrimaryExpr";126 return "PrimaryExpr";
127 case NodeTypeGroupedExpr:127 case NodeTypeGroupedExpr:
128 return "GroupedExpr";128 return "GroupedExpr";
129 case NodeTypeUnaryExpr:129 case NodeTypePrefixOpExpr:
130 return "UnaryExpr";130 return "PrefixOpExpr";
131 }131 }
132 zig_unreachable();132 zig_unreachable();
133}133}
...@@ -296,14 +296,14 @@ void ast_print(AstNode *node, int indent) {...@@ -296,14 +296,14 @@ void ast_print(AstNode *node, int indent) {
296 break;296 break;
297 case NodeTypeCastExpr:297 case NodeTypeCastExpr:
298 fprintf(stderr, "%s\n", node_type_str(node->type));298 fprintf(stderr, "%s\n", node_type_str(node->type));
299 ast_print(node->data.cast_expr.unary_expr, indent + 2);299 ast_print(node->data.cast_expr.prefix_op_expr, indent + 2);
300 if (node->data.cast_expr.type)300 if (node->data.cast_expr.type)
301 ast_print(node->data.cast_expr.type, indent + 2);301 ast_print(node->data.cast_expr.type, indent + 2);
302 break;302 break;
303 case NodeTypeUnaryExpr:303 case NodeTypePrefixOpExpr:
304 fprintf(stderr, "%s %s\n", node_type_str(node->type),304 fprintf(stderr, "%s %s\n", node_type_str(node->type),
305 unary_op_str(node->data.unary_expr.unary_op));305 prefix_op_str(node->data.prefix_op_expr.prefix_op));
306 ast_print(node->data.unary_expr.primary_expr, indent + 2);306 ast_print(node->data.prefix_op_expr.primary_expr, indent + 2);
307 break;307 break;
308 case NodeTypePrimaryExpr:308 case NodeTypePrimaryExpr:
309 switch (node->data.primary_expr.type) {309 switch (node->data.primary_expr.type) {
...@@ -705,26 +705,26 @@ static AstNode *ast_parse_primary_expr(ParseContext *pc, int *token_index, bool...@@ -705,26 +705,26 @@ static AstNode *ast_parse_primary_expr(ParseContext *pc, int *token_index, bool
705 ast_invalid_token_error(pc, token);705 ast_invalid_token_error(pc, token);
706}706}
707707
708static UnaryOp tok_to_unary_op(Token *token) {708static PrefixOp tok_to_prefix_op(Token *token) {
709 switch (token->id) {709 switch (token->id) {
710 case TokenIdBang: return UnaryOpBoolNot;710 case TokenIdBang: return PrefixOpBoolNot;
711 case TokenIdDash: return UnaryOpNegation;711 case TokenIdDash: return PrefixOpNegation;
712 case TokenIdTilde: return UnaryOpBinNot;712 case TokenIdTilde: return PrefixOpBinNot;
713 default: return UnaryOpInvalid;713 default: return PrefixOpInvalid;
714 }714 }
715}715}
716716
717/*717/*
718UnaryOp : token(Not) | token(Dash) | token(Tilde)718PrefixOp : token(Not) | token(Dash) | token(Tilde)
719*/719*/
720static UnaryOp ast_parse_unary_op(ParseContext *pc, int *token_index, bool mandatory) {720static PrefixOp ast_parse_prefix_op(ParseContext *pc, int *token_index, bool mandatory) {
721 Token *token = &pc->tokens->at(*token_index);721 Token *token = &pc->tokens->at(*token_index);
722 UnaryOp result = tok_to_unary_op(token);722 PrefixOp result = tok_to_prefix_op(token);
723 if (result == UnaryOpInvalid) {723 if (result == PrefixOpInvalid) {
724 if (mandatory) {724 if (mandatory) {
725 ast_invalid_token_error(pc, token);725 ast_invalid_token_error(pc, token);
726 } else {726 } else {
727 return UnaryOpInvalid;727 return PrefixOpInvalid;
728 }728 }
729 }729 }
730 *token_index += 1;730 *token_index += 1;
...@@ -732,38 +732,38 @@ static UnaryOp ast_parse_unary_op(ParseContext *pc, int *token_index, bool manda...@@ -732,38 +732,38 @@ static UnaryOp ast_parse_unary_op(ParseContext *pc, int *token_index, bool manda
732}732}
733733
734/*734/*
735UnaryExpression : UnaryOp PrimaryExpression | PrimaryExpression735PrefixOpExpression : PrefixOp PrimaryExpression | PrimaryExpression
736*/736*/
737static AstNode *ast_parse_unary_expr(ParseContext *pc, int *token_index, bool mandatory) {737static AstNode *ast_parse_prefix_op_expr(ParseContext *pc, int *token_index, bool mandatory) {
738 Token *token = &pc->tokens->at(*token_index);738 Token *token = &pc->tokens->at(*token_index);
739 UnaryOp unary_op = ast_parse_unary_op(pc, token_index, false);739 PrefixOp prefix_op = ast_parse_prefix_op(pc, token_index, false);
740 if (unary_op == UnaryOpInvalid)740 if (prefix_op == PrefixOpInvalid)
741 return ast_parse_primary_expr(pc, token_index, mandatory);741 return ast_parse_primary_expr(pc, token_index, mandatory);
742742
743 AstNode *primary_expr = ast_parse_primary_expr(pc, token_index, true);743 AstNode *primary_expr = ast_parse_primary_expr(pc, token_index, true);
744 AstNode *node = ast_create_node(NodeTypeUnaryExpr, token);744 AstNode *node = ast_create_node(NodeTypePrefixOpExpr, token);
745 node->data.unary_expr.primary_expr = primary_expr;745 node->data.prefix_op_expr.primary_expr = primary_expr;
746 node->data.unary_expr.unary_op = unary_op;746 node->data.prefix_op_expr.prefix_op = prefix_op;
747747
748 return node;748 return node;
749}749}
750750
751751
752/*752/*
753CastExpression : UnaryExpression token(as) Type | UnaryExpression753CastExpression : PrefixOpExpression token(as) Type | PrefixOpExpression
754*/754*/
755static AstNode *ast_parse_cast_expression(ParseContext *pc, int *token_index, bool mandatory) {755static AstNode *ast_parse_cast_expression(ParseContext *pc, int *token_index, bool mandatory) {
756 AstNode *unary_expr = ast_parse_unary_expr(pc, token_index, mandatory);756 AstNode *prefix_op_expr = ast_parse_prefix_op_expr(pc, token_index, mandatory);
757 if (!unary_expr)757 if (!prefix_op_expr)
758 return nullptr;758 return nullptr;
759759
760 Token *as_kw = &pc->tokens->at(*token_index);760 Token *as_kw = &pc->tokens->at(*token_index);
761 if (as_kw->id != TokenIdKeywordAs)761 if (as_kw->id != TokenIdKeywordAs)
762 return unary_expr;762 return prefix_op_expr;
763 *token_index += 1;763 *token_index += 1;
764764
765 AstNode *node = ast_create_node(NodeTypeCastExpr, as_kw);765 AstNode *node = ast_create_node(NodeTypeCastExpr, as_kw);
766 node->data.cast_expr.unary_expr = unary_expr;766 node->data.cast_expr.prefix_op_expr = prefix_op_expr;
767767
768 node->data.cast_expr.type = ast_parse_type(pc, *token_index, token_index);768 node->data.cast_expr.type = ast_parse_type(pc, *token_index, token_index);
769769
src/parser.hpp+10-10
...@@ -40,7 +40,7 @@ enum NodeType {...@@ -40,7 +40,7 @@ enum NodeType {
40 NodeTypeCastExpr,40 NodeTypeCastExpr,
41 NodeTypePrimaryExpr,41 NodeTypePrimaryExpr,
42 NodeTypeGroupedExpr,42 NodeTypeGroupedExpr,
43 NodeTypeUnaryExpr,43 NodeTypePrefixOpExpr,
44};44};
4545
46struct AstNodeRoot {46struct AstNodeRoot {
...@@ -205,7 +205,7 @@ struct AstNodeMultExpr {...@@ -205,7 +205,7 @@ struct AstNodeMultExpr {
205};205};
206206
207struct AstNodeCastExpr {207struct AstNodeCastExpr {
208 AstNode *unary_expr;208 AstNode *prefix_op_expr;
209 // if type is non-null, do cast, otherwise nothing209 // if type is non-null, do cast, otherwise nothing
210 AstNode *type;210 AstNode *type;
211};211};
...@@ -234,15 +234,15 @@ struct AstNodeGroupedExpr {...@@ -234,15 +234,15 @@ struct AstNodeGroupedExpr {
234 AstNode *expr;234 AstNode *expr;
235};235};
236236
237enum UnaryOp {237enum PrefixOp {
238 UnaryOpInvalid,238 PrefixOpInvalid,
239 UnaryOpBoolNot,239 PrefixOpBoolNot,
240 UnaryOpBinNot,240 PrefixOpBinNot,
241 UnaryOpNegation,241 PrefixOpNegation,
242};242};
243243
244struct AstNodeUnaryExpr {244struct AstNodePrefixOpExpr {
245 UnaryOp unary_op;245 PrefixOp prefix_op;
246 AstNode *primary_expr;246 AstNode *primary_expr;
247};247};
248248
...@@ -277,7 +277,7 @@ struct AstNode {...@@ -277,7 +277,7 @@ struct AstNode {
277 AstNodeCastExpr cast_expr;277 AstNodeCastExpr cast_expr;
278 AstNodePrimaryExpr primary_expr;278 AstNodePrimaryExpr primary_expr;
279 AstNodeGroupedExpr grouped_expr;279 AstNodeGroupedExpr grouped_expr;
280 AstNodeUnaryExpr unary_expr;280 AstNodePrefixOpExpr prefix_op_expr;
281 } data;281 } data;
282};282};
283283