diff options
| author | Josh Wolfe <thejoshwolfe@gmail.com> | 2015-11-25 15:44:05 -0700 |
|---|---|---|
| committer | Josh Wolfe <thejoshwolfe@gmail.com> | 2015-11-25 15:45:10 -0700 |
| commit | e579011a6e6311be9b854e17c3a6583b72126b1b (patch) | |
| tree | caaf3903dfbd34ab02665cb07c92d751ee61abc8 /src/parser.cpp | |
| parent | 079ed9e3569b60f45f5a0362a67c1d3a8b2d3665 (diff) | |
| download | zig-e579011a6e6311be9b854e17c3a6583b72126b1b.tar.gz zig-e579011a6e6311be9b854e17c3a6583b72126b1b.zip | |
inline AstNodeStatement
Diffstat (limited to 'src/parser.cpp')
| -rw-r--r-- | src/parser.cpp | 49 |
1 files changed, 22 insertions, 27 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index c2ea75f381..e24041538e 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -10,6 +10,7 @@ #include <stdarg.h> #include <stdio.h> +static void ast_error(Token *token, const char *format, ...) __attribute__ ((noreturn)); __attribute__ ((format (printf, 2, 3))) static void ast_error(Token *token, const char *format, ...) { int line = token->start_line + 1; @@ -40,8 +41,10 @@ const char *node_type_str(NodeType node_type) { return "Type"; case NodeTypeBlock: return "Block"; - case NodeTypeStatement: - return "Statement"; + case NodeTypeStatementExpression: + return "StatementExpression"; + case NodeTypeStatementReturn: + return "StatementReturn"; case NodeTypeExpression: return "Expression"; case NodeTypeFnCall: @@ -125,17 +128,13 @@ void ast_print(AstNode *node, int indent) { } } break; - case NodeTypeStatement: - switch (node->data.statement.type) { - case AstNodeStatementTypeReturn: - fprintf(stderr, "ReturnStatement\n"); - ast_print(node->data.statement.data.retrn.expression, indent + 2); - break; - case AstNodeStatementTypeExpression: - fprintf(stderr, "ExpressionStatement\n"); - ast_print(node->data.statement.data.expr.expression, indent + 2); - break; - } + case NodeTypeStatementReturn: + fprintf(stderr, "ReturnStatement\n"); + ast_print(node->data.statement_return.expression, indent + 2); + break; + case NodeTypeStatementExpression: + fprintf(stderr, "ExpressionStatement\n"); + ast_print(node->data.statement_expression.expression, indent + 2); break; case NodeTypeExternBlock: { @@ -258,7 +257,8 @@ static void parse_string_literal(ParseContext *pc, Token *token, Buf *buf) { assert(!escape); } -static void ast_invalid_token_error(ParseContext *pc, Token *token) { +void ast_invalid_token_error(ParseContext *pc, Token *token) __attribute__ ((noreturn)); +void ast_invalid_token_error(ParseContext *pc, Token *token) { Buf token_value = BUF_INIT; ast_buf_from_token(pc, token, &token_value); ast_error(token, "invalid token: '%s'", buf_ptr(&token_value)); @@ -448,40 +448,35 @@ Statement : ExpressionStatement | ReturnStatement ; ExpressionStatement : Expression token(Semicolon) ; ReturnStatement : token(Return) Expression token(Semicolon) ; - -Expression : token(Number) | token(String) | token(Unreachable) | FnCall - -FnCall : token(Symbol) token(LParen) list(Expression, token(Comma)) token(RParen) ; */ static AstNode *ast_parse_statement(ParseContext *pc, int token_index, int *new_token_index) { Token *token = &pc->tokens->at(token_index); - AstNode *node = ast_create_node(NodeTypeStatement, token); - if (token->id == TokenIdKeywordReturn) { + AstNode *node = ast_create_node(NodeTypeStatementReturn, token); token_index += 1; - node->data.statement.type = AstNodeStatementTypeReturn; - node->data.statement.data.retrn.expression = ast_parse_expression(pc, token_index, &token_index); + node->data.statement_return.expression = ast_parse_expression(pc, token_index, &token_index); Token *semicolon = &pc->tokens->at(token_index); token_index += 1; ast_expect_token(pc, semicolon, TokenIdSemicolon); + *new_token_index = token_index; + return node; } else if (token->id == TokenIdSymbol || token->id == TokenIdStringLiteral || token->id == TokenIdKeywordUnreachable || token->id == TokenIdNumberLiteral) { - node->data.statement.type = AstNodeStatementTypeExpression; - node->data.statement.data.expr.expression = ast_parse_expression(pc, token_index, &token_index); + AstNode *node = ast_create_node(NodeTypeStatementExpression, token); + node->data.statement_expression.expression = ast_parse_expression(pc, token_index, &token_index); Token *semicolon = &pc->tokens->at(token_index); token_index += 1; ast_expect_token(pc, semicolon, TokenIdSemicolon); + *new_token_index = token_index; + return node; } else { ast_invalid_token_error(pc, token); } - - *new_token_index = token_index; - return node; } /* |
