aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-02-05 23:20:34 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-02-05 23:20:34 -0700
commit6a2ede5a6eb17d6b86e6636457710a3583376fa3 (patch)
tree5d0968960e8c37e325de3f78d7c1cb86533bdd05 /src/parser.cpp
parent4339d555626197f4b8c9598b602f098b76488c2d (diff)
downloadzig-6a2ede5a6eb17d6b86e6636457710a3583376fa3.tar.gz
zig-6a2ede5a6eb17d6b86e6636457710a3583376fa3.zip
parsing code for defer and more
* disable goto and label support see #44 * refactor the way block contexts work
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp35
1 files changed, 23 insertions, 12 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index 78481f61f0..8be98e6e29 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -1635,20 +1635,24 @@ static AstNode *ast_parse_if_expr(ParseContext *pc, int *token_index, bool manda
/*
ReturnExpression : option("%" | "?") "return" option(Expression)
+DeferExpression = option("%" | "?") "defer" option(Expression)
*/
-static AstNode *ast_parse_return_expr(ParseContext *pc, int *token_index, bool mandatory) {
+static AstNode *ast_parse_return_or_defer_expr(ParseContext *pc, int *token_index) {
Token *token = &pc->tokens->at(*token_index);
+ NodeType node_type;
ReturnKind kind;
if (token->id == TokenIdPercent) {
Token *next_token = &pc->tokens->at(*token_index + 1);
if (next_token->id == TokenIdKeywordReturn) {
kind = ReturnKindError;
+ node_type = NodeTypeReturnExpr;
+ *token_index += 2;
+ } else if (next_token->id == TokenIdKeywordDefer) {
+ kind = ReturnKindError;
+ node_type = NodeTypeDeferExpr;
*token_index += 2;
- } else if (mandatory) {
- ast_expect_token(pc, next_token, TokenIdKeywordReturn);
- zig_unreachable();
} else {
return nullptr;
}
@@ -1656,24 +1660,28 @@ static AstNode *ast_parse_return_expr(ParseContext *pc, int *token_index, bool m
Token *next_token = &pc->tokens->at(*token_index + 1);
if (next_token->id == TokenIdKeywordReturn) {
kind = ReturnKindMaybe;
+ node_type = NodeTypeReturnExpr;
+ *token_index += 2;
+ } else if (next_token->id == TokenIdKeywordDefer) {
+ kind = ReturnKindMaybe;
+ node_type = NodeTypeDeferExpr;
*token_index += 2;
- } else if (mandatory) {
- ast_expect_token(pc, next_token, TokenIdKeywordReturn);
- zig_unreachable();
} else {
return nullptr;
}
} else if (token->id == TokenIdKeywordReturn) {
kind = ReturnKindUnconditional;
+ node_type = NodeTypeReturnExpr;
+ *token_index += 1;
+ } else if (token->id == TokenIdKeywordDefer) {
+ kind = ReturnKindUnconditional;
+ node_type = NodeTypeDeferExpr;
*token_index += 1;
- } else if (mandatory) {
- ast_expect_token(pc, token, TokenIdKeywordReturn);
- zig_unreachable();
} else {
return nullptr;
}
- AstNode *node = ast_create_node(pc, NodeTypeReturnExpr, token);
+ AstNode *node = ast_create_node(pc, node_type, token);
node->data.return_expr.kind = kind;
node->data.return_expr.expr = ast_parse_expression(pc, token_index, false);
@@ -2060,7 +2068,7 @@ NonBlockExpression : ReturnExpression | AssignmentExpression
static AstNode *ast_parse_non_block_expr(ParseContext *pc, int *token_index, bool mandatory) {
Token *token = &pc->tokens->at(*token_index);
- AstNode *return_expr = ast_parse_return_expr(pc, token_index, false);
+ AstNode *return_expr = ast_parse_return_or_defer_expr(pc, token_index);
if (return_expr)
return return_expr;
@@ -2695,6 +2703,9 @@ void normalize_parent_ptrs(AstNode *node) {
case NodeTypeReturnExpr:
set_field(&node->data.return_expr.expr);
break;
+ case NodeTypeDeferExpr:
+ set_field(&node->data.defer_expr.expr);
+ break;
case NodeTypeVariableDeclaration:
set_list_fields(node->data.variable_declaration.directives);
set_field(&node->data.variable_declaration.type);