mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 07:38:48 +00:00
Add extra error handling for parsing slices
This commit is contained in:
@@ -2482,11 +2482,19 @@ parse_atom_expr :: proc(p: ^Parser, operand: ^ast.Expr, lhs: bool) -> ^ast.Expr
|
|||||||
p.expr_level += 1;
|
p.expr_level += 1;
|
||||||
open := expect_token(p, token.Open_Bracket);
|
open := expect_token(p, token.Open_Bracket);
|
||||||
|
|
||||||
if p.curr_tok.kind != token.Colon {
|
switch p.curr_tok.kind {
|
||||||
|
case token.Colon, token.Ellipsis, token.Range_Half:
|
||||||
|
// NOTE(bill): Do not err yet
|
||||||
|
break;
|
||||||
|
case:
|
||||||
indicies[0] = parse_expr(p, false);
|
indicies[0] = parse_expr(p, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if p.curr_tok.kind == token.Colon {
|
switch p.curr.tok.kind {
|
||||||
|
case token.Ellipsis, token.Range_Half:
|
||||||
|
error(p, p.curr_tok.pos, "expected a colon, not a range");
|
||||||
|
fallthrough;
|
||||||
|
case token.Colon:
|
||||||
interval = advance_token(p);
|
interval = advance_token(p);
|
||||||
is_slice_op = true;
|
is_slice_op = true;
|
||||||
if (p.curr_tok.kind != token.Close_Bracket && p.curr_tok.kind != token.EOF) {
|
if (p.curr_tok.kind != token.Close_Bracket && p.curr_tok.kind != token.EOF) {
|
||||||
|
|||||||
+20
-8
@@ -2245,31 +2245,43 @@ Ast *parse_atom_expr(AstFile *f, Ast *operand, bool lhs) {
|
|||||||
|
|
||||||
Token open = {}, close = {}, interval = {};
|
Token open = {}, close = {}, interval = {};
|
||||||
Ast *indices[2] = {};
|
Ast *indices[2] = {};
|
||||||
Token ellipsis = {};
|
bool is_interval = false;
|
||||||
bool is_ellipsis = false;
|
|
||||||
|
|
||||||
f->expr_level++;
|
f->expr_level++;
|
||||||
open = expect_token(f, Token_OpenBracket);
|
open = expect_token(f, Token_OpenBracket);
|
||||||
|
|
||||||
if (f->curr_token.kind != Token_Colon) {
|
switch (f->curr_token.kind) {
|
||||||
|
case Token_Ellipsis:
|
||||||
|
case Token_RangeHalf:
|
||||||
|
// NOTE(bill): Do not err yet
|
||||||
|
case Token_Colon:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
indices[0] = parse_expr(f, false);
|
indices[0] = parse_expr(f, false);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (f->curr_token.kind == Token_Colon) {
|
switch (f->curr_token.kind) {
|
||||||
ellipsis = advance_token(f);
|
case Token_Ellipsis:
|
||||||
is_ellipsis = true;
|
case Token_RangeHalf:
|
||||||
|
syntax_error(f->curr_token, "Expected a colon, not a range");
|
||||||
|
/* fallthrough */
|
||||||
|
case Token_Colon:
|
||||||
|
interval = advance_token(f);
|
||||||
|
is_interval = true;
|
||||||
if (f->curr_token.kind != Token_CloseBracket &&
|
if (f->curr_token.kind != Token_CloseBracket &&
|
||||||
f->curr_token.kind != Token_EOF) {
|
f->curr_token.kind != Token_EOF) {
|
||||||
indices[1] = parse_expr(f, false);
|
indices[1] = parse_expr(f, false);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
f->expr_level--;
|
f->expr_level--;
|
||||||
close = expect_token(f, Token_CloseBracket);
|
close = expect_token(f, Token_CloseBracket);
|
||||||
|
|
||||||
if (is_ellipsis) {
|
if (is_interval) {
|
||||||
operand = ast_slice_expr(f, operand, open, close, ellipsis, indices[0], indices[1]);
|
operand = ast_slice_expr(f, operand, open, close, interval, indices[0], indices[1]);
|
||||||
} else {
|
} else {
|
||||||
operand = ast_index_expr(f, operand, indices[0], open, close);
|
operand = ast_index_expr(f, operand, indices[0], open, close);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user