From e86c990b75bb30f0116430453b42a59317e3fead Mon Sep 17 00:00:00 2001 From: Ginger Bill Date: Sat, 28 Jan 2017 20:16:18 +0000 Subject: Overloaded `free`; 3 dotted ellipsis --- src/parser.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'src/parser.c') diff --git a/src/parser.c b/src/parser.c index eac6fbd68..e5d6205e7 100644 --- a/src/parser.c +++ b/src/parser.c @@ -149,7 +149,7 @@ AST_NODE_KIND(_ExprBegin, "", i32) \ AST_NODE_KIND(DemaybeExpr, "demaybe expression", struct { Token op; AstNode *expr; }) \ AST_NODE_KIND(SliceExpr, "slice expression", struct { \ AstNode *expr; \ - Token open, close; \ + Token open, close, interval; \ AstNode *low, *high; \ }) \ AST_NODE_KIND(CallExpr, "call expression", struct { \ @@ -716,11 +716,12 @@ AstNode *make_index_expr(AstFile *f, AstNode *expr, AstNode *index, Token open, } -AstNode *make_slice_expr(AstFile *f, AstNode *expr, Token open, Token close, AstNode *low, AstNode *high) { +AstNode *make_slice_expr(AstFile *f, AstNode *expr, Token open, Token close, Token interval, AstNode *low, AstNode *high) { AstNode *result = make_node(f, AstNode_SliceExpr); result->SliceExpr.expr = expr; result->SliceExpr.open = open; result->SliceExpr.close = close; + result->SliceExpr.interval = interval; result->SliceExpr.low = low; result->SliceExpr.high = high; return result; @@ -1970,19 +1971,25 @@ AstNode *parse_atom_expr(AstFile *f, bool lhs) { if (lhs) { // TODO(bill): Handle this } - Token open, close; + Token open = {0}, close = {0}, interval = {0}; AstNode *indices[2] = {0}; f->expr_level++; open = expect_token(f, Token_OpenBracket); + // if (f->curr_token.kind != Token_Ellipsis && + // f->curr_token.kind != Token_HalfOpenRange) { if (f->curr_token.kind != Token_Colon) { indices[0] = parse_expr(f, false); } bool is_index = true; - if (allow_token(f, Token_Colon)) { + // if (f->curr_token.kind == Token_Ellipsis || + // f->curr_token.kind == Token_HalfOpenRange) { + if (f->curr_token.kind == Token_Colon) { is_index = false; + interval = f->curr_token; + next_token(f); if (f->curr_token.kind != Token_CloseBracket && f->curr_token.kind != Token_EOF) { indices[1] = parse_expr(f, false); @@ -1995,7 +2002,7 @@ AstNode *parse_atom_expr(AstFile *f, bool lhs) { if (is_index) { operand = make_index_expr(f, operand, indices[0], open, close); } else { - operand = make_slice_expr(f, operand, open, close, indices[0], indices[1]); + operand = make_slice_expr(f, operand, open, close, interval, indices[0], indices[1]); } } break; -- cgit v1.2.3