authorgravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2015-11-25 15:44:05-07:00
committergravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2015-11-25 15:45:10-07:00
loge579011a6e6311be9b854e17c3a6583b72126b1b
treecaaf3903dfbd34ab02665cb07c92d751ee61abc8
parent079ed9e3569b60f45f5a0362a67c1d3a8b2d3665

inline AstNodeStatement


4 files changed, 50 insertions(+), 60 deletions(-)

README.md+2-2
......@@ -80,11 +80,11 @@ ParamDecl : token(Symbol) token(Colon) Type
8080
8181Type : token(Symbol) | PointerType | token(Unreachable)
8282
83PointerType : token(Star) token(Const) Type | token(Star) token(Mut) Type
83PointerType : token(Star) token(Const) Type | token(Star) token(Mut) Type
8484
8585Block : token(LBrace) many(Statement) token(RBrace)
8686
87Statement : ExpressionStatement | ReturnStatement
87Statement : ExpressionStatement | ReturnStatement
8888
8989ExpressionStatement : Expression token(Semicolon)
9090
src/codegen.cpp+22-15
......@@ -292,15 +292,11 @@ static void analyze_node(CodeGen *g, AstNode *node) {
292292 analyze_node(g, child);
293293 }
294294 break;
295 case NodeTypeStatement:
296 switch (node->data.statement.type) {
297 case AstNodeStatementTypeExpression:
298 analyze_node(g, node->data.statement.data.expr.expression);
299 break;
300 case AstNodeStatementTypeReturn:
301 analyze_node(g, node->data.statement.data.retrn.expression);
302 break;
303 }
295 case NodeTypeStatementExpression:
296 analyze_node(g, node->data.statement_expression.expression);
297 break;
298 case NodeTypeStatementReturn:
299 analyze_node(g, node->data.statement_return.expression);
304300 break;
305301 case NodeTypeExpression:
306302 switch (node->data.expression.type) {
......@@ -514,23 +510,34 @@ static void gen_block(CodeGen *g, AstNode *block_node) {
514510
515511 for (int i = 0; i < block_node->data.block.statements.length; i += 1) {
516512 AstNode *statement_node = block_node->data.block.statements.at(i);
517 assert(statement_node->type == NodeTypeStatement);
518 switch (statement_node->data.statement.type) {
519 case AstNodeStatementTypeReturn:
513 switch (statement_node->type) {
514 case NodeTypeStatementReturn:
520515 {
521 AstNode *expr_node = statement_node->data.statement.data.retrn.expression;
516 AstNode *expr_node = statement_node->data.statement_return.expression;
522517 LLVMValueRef value = gen_expr(g, expr_node);
523518
524519 add_debug_source_node(g, statement_node);
525520 LLVMBuildRet(g->builder, value);
526521 break;
527522 }
528 case AstNodeStatementTypeExpression:
523 case NodeTypeStatementExpression:
529524 {
530 AstNode *expr_node = statement_node->data.statement.data.expr.expression;
525 AstNode *expr_node = statement_node->data.statement_expression.expression;
531526 gen_expr(g, expr_node);
532527 break;
533528 }
529 case NodeTypeRoot:
530 case NodeTypeFnProto:
531 case NodeTypeFnDef:
532 case NodeTypeFnDecl:
533 case NodeTypeParamDecl:
534 case NodeTypeType:
535 case NodeTypeBlock:
536 case NodeTypeExpression:
537 case NodeTypeFnCall:
538 case NodeTypeExternBlock:
539 case NodeTypeDirective:
540 assert(false);
534541 }
535542 }
536543
src/parser.cpp+22-27
......@@ -10,6 +10,7 @@
1010#include <stdarg.h>
1111#include <stdio.h>
1212
13static void ast_error(Token *token, const char *format, ...) __attribute__ ((noreturn));
1314__attribute__ ((format (printf, 2, 3)))
1415static void ast_error(Token *token, const char *format, ...) {
1516 int line = token->start_line + 1;
......@@ -40,8 +41,10 @@ const char *node_type_str(NodeType node_type) {
4041 return "Type";
4142 case NodeTypeBlock:
4243 return "Block";
43 case NodeTypeStatement:
44 return "Statement";
44 case NodeTypeStatementExpression:
45 return "StatementExpression";
46 case NodeTypeStatementReturn:
47 return "StatementReturn";
4548 case NodeTypeExpression:
4649 return "Expression";
4750 case NodeTypeFnCall:
......@@ -125,17 +128,13 @@ void ast_print(AstNode *node, int indent) {
125128 }
126129 }
127130 break;
128 case NodeTypeStatement:
129 switch (node->data.statement.type) {
130 case AstNodeStatementTypeReturn:
131 fprintf(stderr, "ReturnStatement\n");
132 ast_print(node->data.statement.data.retrn.expression, indent + 2);
133 break;
134 case AstNodeStatementTypeExpression:
135 fprintf(stderr, "ExpressionStatement\n");
136 ast_print(node->data.statement.data.expr.expression, indent + 2);
137 break;
138 }
131 case NodeTypeStatementReturn:
132 fprintf(stderr, "ReturnStatement\n");
133 ast_print(node->data.statement_return.expression, indent + 2);
134 break;
135 case NodeTypeStatementExpression:
136 fprintf(stderr, "ExpressionStatement\n");
137 ast_print(node->data.statement_expression.expression, indent + 2);
139138 break;
140139 case NodeTypeExternBlock:
141140 {
......@@ -258,7 +257,8 @@ static void parse_string_literal(ParseContext *pc, Token *token, Buf *buf) {
258257 assert(!escape);
259258}
260259
261static void ast_invalid_token_error(ParseContext *pc, Token *token) {
260void ast_invalid_token_error(ParseContext *pc, Token *token) __attribute__ ((noreturn));
261void ast_invalid_token_error(ParseContext *pc, Token *token) {
262262 Buf token_value = BUF_INIT;
263263 ast_buf_from_token(pc, token, &token_value);
264264 ast_error(token, "invalid token: '%s'", buf_ptr(&token_value));
......@@ -448,40 +448,35 @@ Statement : ExpressionStatement | ReturnStatement ;
448448ExpressionStatement : Expression token(Semicolon) ;
449449
450450ReturnStatement : token(Return) Expression token(Semicolon) ;
451
452Expression : token(Number) | token(String) | token(Unreachable) | FnCall
453
454FnCall : token(Symbol) token(LParen) list(Expression, token(Comma)) token(RParen) ;
455451*/
456452static AstNode *ast_parse_statement(ParseContext *pc, int token_index, int *new_token_index) {
457453 Token *token = &pc->tokens->at(token_index);
458 AstNode *node = ast_create_node(NodeTypeStatement, token);
459
460454 if (token->id == TokenIdKeywordReturn) {
455 AstNode *node = ast_create_node(NodeTypeStatementReturn, token);
461456 token_index += 1;
462 node->data.statement.type = AstNodeStatementTypeReturn;
463 node->data.statement.data.retrn.expression = ast_parse_expression(pc, token_index, &token_index);
457 node->data.statement_return.expression = ast_parse_expression(pc, token_index, &token_index);
464458
465459 Token *semicolon = &pc->tokens->at(token_index);
466460 token_index += 1;
467461 ast_expect_token(pc, semicolon, TokenIdSemicolon);
462 *new_token_index = token_index;
463 return node;
468464 } else if (token->id == TokenIdSymbol ||
469465 token->id == TokenIdStringLiteral ||
470466 token->id == TokenIdKeywordUnreachable ||
471467 token->id == TokenIdNumberLiteral)
472468 {
473 node->data.statement.type = AstNodeStatementTypeExpression;
474 node->data.statement.data.expr.expression = ast_parse_expression(pc, token_index, &token_index);
469 AstNode *node = ast_create_node(NodeTypeStatementExpression, token);
470 node->data.statement_expression.expression = ast_parse_expression(pc, token_index, &token_index);
475471
476472 Token *semicolon = &pc->tokens->at(token_index);
477473 token_index += 1;
478474 ast_expect_token(pc, semicolon, TokenIdSemicolon);
475 *new_token_index = token_index;
476 return node;
479477 } else {
480478 ast_invalid_token_error(pc, token);
481479 }
482
483 *new_token_index = token_index;
484 return node;
485480}
486481
487482/*
src/parser.hpp+4-16
......@@ -23,11 +23,12 @@ enum NodeType {
2323 NodeTypeParamDecl,
2424 NodeTypeType,
2525 NodeTypeBlock,
26 NodeTypeStatement,
2726 NodeTypeExpression,
2827 NodeTypeFnCall,
2928 NodeTypeExternBlock,
3029 NodeTypeDirective,
30 NodeTypeStatementExpression,
31 NodeTypeStatementReturn,
3132};
3233
3334struct AstNodeRoot {
......@@ -70,11 +71,6 @@ struct AstNodeBlock {
7071 ZigList<AstNode *> statements;
7172};
7273
73enum AstNodeStatementType {
74 AstNodeStatementTypeExpression,
75 AstNodeStatementTypeReturn,
76};
77
7874struct AstNodeStatementExpression {
7975 AstNode *expression;
8076};
......@@ -83,14 +79,6 @@ struct AstNodeStatementReturn {
8379 AstNode *expression;
8480};
8581
86struct AstNodeStatement {
87 AstNodeStatementType type;
88 union {
89 AstNodeStatementExpression expr;
90 AstNodeStatementReturn retrn;
91 } data;
92};
93
9482enum AstNodeExpressionType {
9583 AstNodeExpressionTypeNumber,
9684 AstNodeExpressionTypeString,
......@@ -136,7 +124,8 @@ struct AstNode {
136124 AstNodeType type;
137125 AstNodeParamDecl param_decl;
138126 AstNodeBlock block;
139 AstNodeStatement statement;
127 AstNodeStatementExpression statement_expression;
128 AstNodeStatementReturn statement_return;
140129 AstNodeExpression expression;
141130 AstNodeFnCall fn_call;
142131 AstNodeExternBlock extern_block;
......@@ -146,7 +135,6 @@ struct AstNode {
146135
147136__attribute__ ((format (printf, 2, 3)))
148137void ast_token_error(Token *token, const char *format, ...);
149void ast_invalid_token_error(Buf *buf, Token *token);
150138
151139
152140// This function is provided by generated code, generated by parsergen.cpp