aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2017-11-26 18:36:46 +0000
committergingerBill <bill@gingerbill.org>2017-11-26 18:36:46 +0000
commit74fa7ca25ddb4c2fc7a600d0089b1a18f6465b69 (patch)
tree4814e2e3a8366c388ef867848bfe05a0346d4121 /src/parser.cpp
parent5a9223afdac7b97355be6c0441978f12175ede77 (diff)
New slice memory layout (ptr+len); `byte`
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp47
1 files changed, 14 insertions, 33 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index fc0dd13a0..d513bd79c 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -192,10 +192,8 @@ AST_NODE_KIND(_ExprBegin, "", i32) \
AST_NODE_KIND(SliceExpr, "slice expression", struct { \
AstNode *expr; \
Token open, close; \
- Token interval0; \
- Token interval1; \
- bool index3; \
- AstNode *low, *high, *max; \
+ Token interval; \
+ AstNode *low, *high; \
}) \
AST_NODE_KIND(CallExpr, "call expression", struct { \
AstNode * proc; \
@@ -714,7 +712,6 @@ AstNode *clone_ast_node(gbAllocator a, AstNode *node) {
n->SliceExpr.expr = clone_ast_node(a, n->SliceExpr.expr);
n->SliceExpr.low = clone_ast_node(a, n->SliceExpr.low);
n->SliceExpr.high = clone_ast_node(a, n->SliceExpr.high);
- n->SliceExpr.max = clone_ast_node(a, n->SliceExpr.max);
break;
case AstNode_CallExpr:
n->CallExpr.proc = clone_ast_node(a, n->CallExpr.proc);
@@ -1064,17 +1061,14 @@ AstNode *ast_index_expr(AstFile *f, AstNode *expr, AstNode *index, Token open, T
}
-AstNode *ast_slice_expr(AstFile *f, AstNode *expr, Token open, Token close, Token interval0, Token interval1, bool index3, AstNode *low, AstNode *high, AstNode *max) {
+AstNode *ast_slice_expr(AstFile *f, AstNode *expr, Token open, Token close, Token interval, AstNode *low, AstNode *high) {
AstNode *result = make_ast_node(f, AstNode_SliceExpr);
result->SliceExpr.expr = expr;
result->SliceExpr.open = open;
result->SliceExpr.close = close;
- result->SliceExpr.interval0 = interval0;
- result->SliceExpr.interval1 = interval1;
- result->SliceExpr.index3 = index3;
+ result->SliceExpr.interval = interval;
result->SliceExpr.low = low;
result->SliceExpr.high = high;
- result->SliceExpr.max = max;
return result;
}
@@ -2726,9 +2720,9 @@ AstNode *parse_atom_expr(AstFile *f, AstNode *operand, bool lhs) {
f->allow_range = false;
Token open = {}, close = {}, interval = {};
- AstNode *indices[3] = {};
- isize ellipsis_count = 0;
- Token ellipses[2] = {};
+ AstNode *indices[2] = {};
+ Token ellipsis = {};
+ bool is_ellipsis = false;
f->expr_level++;
open = expect_token(f, Token_OpenBracket);
@@ -2739,15 +2733,15 @@ AstNode *parse_atom_expr(AstFile *f, AstNode *operand, bool lhs) {
}
bool is_index = true;
- while ((f->curr_token.kind == Token_Ellipsis ||
- f->curr_token.kind == Token_HalfClosed)
- && ellipsis_count < gb_count_of(ellipses)) {
- ellipses[ellipsis_count++] = advance_token(f);
+ if ((f->curr_token.kind == Token_Ellipsis ||
+ f->curr_token.kind == Token_HalfClosed)) {
+ ellipsis = advance_token(f);
+ is_ellipsis = true;
if (f->curr_token.kind != Token_Ellipsis &&
f->curr_token.kind != Token_HalfClosed &&
f->curr_token.kind != Token_CloseBracket &&
f->curr_token.kind != Token_EOF) {
- indices[ellipsis_count] = parse_expr(f, false);
+ indices[1] = parse_expr(f, false);
}
}
@@ -2755,21 +2749,8 @@ AstNode *parse_atom_expr(AstFile *f, AstNode *operand, bool lhs) {
f->expr_level--;
close = expect_token(f, Token_CloseBracket);
- if (ellipsis_count > 0) {
- bool index3 = false;
- if (ellipsis_count == 2) {
- index3 = true;
- // 2nd and 3rd index must be present
- if (indices[1] == nullptr) {
- syntax_error(ellipses[0], "2nd index required in 3-index slice expression");
- indices[1] = ast_bad_expr(f, ellipses[0], ellipses[1]);
- }
- if (indices[2] == nullptr) {
- syntax_error(ellipses[1], "3rd index required in 3-index slice expression");
- indices[2] = ast_bad_expr(f, ellipses[1], close);
- }
- }
- operand = ast_slice_expr(f, operand, open, close, ellipses[0], ellipses[1], index3, indices[0], indices[1], indices[2]);
+ if (is_ellipsis) {
+ operand = ast_slice_expr(f, operand, open, close, ellipsis, indices[0], indices[1]);
} else {
operand = ast_index_expr(f, operand, indices[0], open, close);
}