aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2024-04-11 15:19:10 +0200
committerGitHub <noreply@github.com>2024-04-11 15:19:10 +0200
commit532d477705a141b4e096df0d45f7178e2ebd3981 (patch)
tree4b7452cf9542c5988d1e9b7c2301e8b2c60a8bd9
parent0abbf3ba0a9ea53aa9276dfb43bbf95d949c2d91 (diff)
parent330c1616255e2f22b8c4dfde57d6a3b17d038a15 (diff)
Merge pull request #3121 from RilleP/parsing-package-fixes
core:odin parsing fixes
-rw-r--r--core/odin/parser/parser.odin21
-rw-r--r--core/odin/tokenizer/tokenizer.odin1
2 files changed, 14 insertions, 8 deletions
diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin
index 9eaef4655..b2ffd3888 100644
--- a/core/odin/parser/parser.odin
+++ b/core/odin/parser/parser.odin
@@ -416,24 +416,28 @@ end_of_line_pos :: proc(p: ^Parser, tok: tokenizer.Token) -> tokenizer.Pos {
}
expect_closing_brace_of_field_list :: proc(p: ^Parser) -> tokenizer.Token {
+ return expect_closing_token_of_field_list(p, .Close_Brace, "field list")
+}
+
+expect_closing_token_of_field_list :: proc(p: ^Parser, closing_kind: tokenizer.Token_Kind, msg: string) -> tokenizer.Token {
token := p.curr_tok
- if allow_token(p, .Close_Brace) {
+ if allow_token(p, closing_kind) {
return token
}
if allow_token(p, .Semicolon) && !tokenizer.is_newline(token) {
str := tokenizer.token_to_string(token)
error(p, end_of_line_pos(p, p.prev_tok), "expected a comma, got %s", str)
}
- expect_brace := expect_token(p, .Close_Brace)
+ expect_closing := expect_token_after(p, closing_kind, msg)
- if expect_brace.kind != .Close_Brace {
- for p.curr_tok.kind != .Close_Brace && p.curr_tok.kind != .EOF && !is_non_inserted_semicolon(p.curr_tok) {
+ if expect_closing.kind != closing_kind {
+ for p.curr_tok.kind != closing_kind && p.curr_tok.kind != .EOF && !is_non_inserted_semicolon(p.curr_tok) {
advance_token(p)
}
return p.curr_tok
}
- return expect_brace
+ return expect_closing
}
expect_closing_parentheses_of_field_list :: proc(p: ^Parser) -> tokenizer.Token {
@@ -1354,6 +1358,7 @@ parse_stmt :: proc(p: ^Parser) -> ^ast.Stmt {
rs := ast.new(ast.Return_Stmt, tok.pos, end)
rs.results = results[:]
+ expect_semicolon(p, rs)
return rs
case .Break, .Continue, .Fallthrough:
@@ -2990,8 +2995,8 @@ parse_literal_value :: proc(p: ^Parser, type: ^ast.Expr) -> ^ast.Comp_Lit {
}
p.expr_level -= 1
- skip_possible_newline(p)
- close := expect_token_after(p, .Close_Brace, "compound literal")
+ skip_possible_newline(p)
+ close := expect_closing_brace_of_field_list(p)
pos := type.pos if type != nil else open.pos
lit := ast.new(ast.Comp_Lit, pos, end_pos(close))
@@ -3054,7 +3059,7 @@ parse_call_expr :: proc(p: ^Parser, operand: ^ast.Expr) -> ^ast.Expr {
allow_token(p, .Comma) or_break
}
- close := expect_token_after(p, .Close_Paren, "argument list")
+ close := expect_closing_token_of_field_list(p, .Close_Paren, "argument list")
p.expr_level -= 1
ce := ast.new(ast.Call_Expr, operand.pos, end_pos(close))
diff --git a/core/odin/tokenizer/tokenizer.odin b/core/odin/tokenizer/tokenizer.odin
index 41de3ac8b..62170aa10 100644
--- a/core/odin/tokenizer/tokenizer.odin
+++ b/core/odin/tokenizer/tokenizer.odin
@@ -39,6 +39,7 @@ init :: proc(t: ^Tokenizer, src: string, path: string, err: Error_Handler = defa
t.read_offset = 0
t.line_offset = 0
t.line_count = len(src) > 0 ? 1 : 0
+ t.insert_semicolon = false
t.error_count = 0
t.path = path