mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 07:38:48 +00:00
Improve error cases in core:odin/parser
This commit is contained in:
@@ -392,6 +392,30 @@ allow_token :: proc(p: ^Parser, kind: tokenizer.Token_Kind) -> bool {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
end_of_line_pos :: proc(p: ^Parser, tok: tokenizer.Token) -> tokenizer.Pos {
|
||||||
|
offset := clamp(tok.pos.offset, 0, len(p.tok.src)-1);
|
||||||
|
s := p.tok.src[offset:];
|
||||||
|
pos := tok.pos;
|
||||||
|
pos.column -= 1;
|
||||||
|
for len(s) != 0 && s[0] != 0 && s[0] != '\n' {
|
||||||
|
s = s[1:];
|
||||||
|
pos.column += 1;
|
||||||
|
}
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
expect_closing_brace_of_field_list :: proc(p: ^Parser) -> tokenizer.Token {
|
||||||
|
token := p.curr_tok;
|
||||||
|
if allow_token(p, .Close_Brace) {
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
if allow_token(p, .Semicolon) {
|
||||||
|
str := tokenizer.token_to_string(token);
|
||||||
|
error(p, end_of_line_pos(p, p.prev_tok), "expected a comma, got %s", p);
|
||||||
|
}
|
||||||
|
return expect_token(p, .Close_Brace);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
is_blank_ident :: proc{
|
is_blank_ident :: proc{
|
||||||
is_blank_ident_string,
|
is_blank_ident_string,
|
||||||
@@ -2520,7 +2544,7 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr {
|
|||||||
skip_possible_newline_for_literal(p);
|
skip_possible_newline_for_literal(p);
|
||||||
expect_token(p, .Open_Brace);
|
expect_token(p, .Open_Brace);
|
||||||
fields, name_count = parse_field_list(p, .Close_Brace, ast.Field_Flags_Struct);
|
fields, name_count = parse_field_list(p, .Close_Brace, ast.Field_Flags_Struct);
|
||||||
close := expect_token(p, .Close_Brace);
|
close := expect_closing_brace_of_field_list(p);
|
||||||
|
|
||||||
st := ast.new(ast.Struct_Type, tok.pos, end_pos(close));
|
st := ast.new(ast.Struct_Type, tok.pos, end_pos(close));
|
||||||
st.poly_params = poly_params;
|
st.poly_params = poly_params;
|
||||||
@@ -2598,7 +2622,7 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
close := expect_token(p, .Close_Brace);
|
close := expect_closing_brace_of_field_list(p);
|
||||||
|
|
||||||
ut := ast.new(ast.Union_Type, tok.pos, end_pos(close));
|
ut := ast.new(ast.Union_Type, tok.pos, end_pos(close));
|
||||||
ut.poly_params = poly_params;
|
ut.poly_params = poly_params;
|
||||||
@@ -2620,7 +2644,7 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr {
|
|||||||
skip_possible_newline_for_literal(p);
|
skip_possible_newline_for_literal(p);
|
||||||
open := expect_token(p, .Open_Brace);
|
open := expect_token(p, .Open_Brace);
|
||||||
fields := parse_elem_list(p);
|
fields := parse_elem_list(p);
|
||||||
close := expect_token(p, .Close_Brace);
|
close := expect_closing_brace_of_field_list(p);
|
||||||
|
|
||||||
et := ast.new(ast.Enum_Type, tok.pos, end_pos(close));
|
et := ast.new(ast.Enum_Type, tok.pos, end_pos(close));
|
||||||
et.base_type = base_type;
|
et.base_type = base_type;
|
||||||
@@ -2722,7 +2746,7 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr {
|
|||||||
expect_token(p, .Comma);
|
expect_token(p, .Comma);
|
||||||
constraints_string := parse_expr(p, false);
|
constraints_string := parse_expr(p, false);
|
||||||
allow_token(p, .Comma);
|
allow_token(p, .Comma);
|
||||||
close := expect_token(p, .Close_Brace);
|
close := expect_closing_brace_of_field_list(p);
|
||||||
|
|
||||||
e := ast.new(ast.Inline_Asm_Expr, tok.pos, end_pos(close));
|
e := ast.new(ast.Inline_Asm_Expr, tok.pos, end_pos(close));
|
||||||
e.tok = tok;
|
e.tok = tok;
|
||||||
@@ -3047,6 +3071,13 @@ parse_atom_expr :: proc(p: ^Parser, value: ^ast.Expr, lhs: bool) -> (operand: ^a
|
|||||||
loop = false;
|
loop = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case .Increment, .Decrement:
|
||||||
|
if !lhs {
|
||||||
|
tok := advance_token(p);
|
||||||
|
error(p, tok.pos, "postfix '%s' operator is not supported", tok.text);
|
||||||
|
} else {
|
||||||
|
loop = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
is_lhs = false;
|
is_lhs = false;
|
||||||
@@ -3096,6 +3127,16 @@ parse_unary_expr :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr {
|
|||||||
ue.expr = expr;
|
ue.expr = expr;
|
||||||
return ue;
|
return ue;
|
||||||
|
|
||||||
|
case .Increment, .Decrement:
|
||||||
|
op := advance_token(p);
|
||||||
|
error(p, op.pos, "unary '%s' operator is not supported", op.text);
|
||||||
|
expr := parse_unary_expr(p, lhs);
|
||||||
|
|
||||||
|
ue := ast.new(ast.Unary_Expr, op.pos, expr.end);
|
||||||
|
ue.op = op;
|
||||||
|
ue.expr = expr;
|
||||||
|
return ue;
|
||||||
|
|
||||||
case .Period:
|
case .Period:
|
||||||
op := advance_token(p);
|
op := advance_token(p);
|
||||||
field := parse_ident(p);
|
field := parse_ident(p);
|
||||||
@@ -3281,6 +3322,12 @@ parse_simple_stmt :: proc(p: ^Parser, flags: Stmt_Allow_Flags) -> ^ast.Stmt {
|
|||||||
return ast.new(ast.Bad_Stmt, start_tok.pos, end_pos(p.curr_tok));
|
return ast.new(ast.Bad_Stmt, start_tok.pos, end_pos(p.curr_tok));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#partial switch op.kind {
|
||||||
|
case .Increment, .Decrement:
|
||||||
|
advance_token(p);
|
||||||
|
error(p, op.pos, "postfix '%s' statement is not supported", op.text);
|
||||||
|
}
|
||||||
|
|
||||||
es := ast.new(ast.Expr_Stmt, lhs[0].pos, lhs[0].end);
|
es := ast.new(ast.Expr_Stmt, lhs[0].pos, lhs[0].end);
|
||||||
es.expr = lhs[0];
|
es.expr = lhs[0];
|
||||||
return es;
|
return es;
|
||||||
|
|||||||
Reference in New Issue
Block a user