From 9ccdc40f65542702d5a4603f34a468435d97c352 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 16 May 2021 12:43:35 +0100 Subject: [PATCH] Make `.Optional_Semicolons` a flag for the parser --- core/odin/parser/parser.odin | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index 661c46751..f8373eabe 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -8,13 +8,20 @@ import "core:fmt" Warning_Handler :: #type proc(pos: tokenizer.Pos, fmt: string, args: ..any); Error_Handler :: #type proc(pos: tokenizer.Pos, fmt: string, args: ..any); +Flag :: enum u32 { + Optional_Semicolons, +} + +Flags :: distinct bit_set[Flag; u32]; + + Parser :: struct { file: ^ast.File, tok: tokenizer.Tokenizer, - // If optional_semicolons is true, semicolons are completely as statement terminators + // If .Optional_Semicolons is true, semicolons are completely as statement terminators // different to .Insert_Semicolon in tok.flags - optional_semicolons: bool, + flags: Flags, warn: Warning_Handler, err: Error_Handler, @@ -104,8 +111,9 @@ end_pos :: proc(tok: tokenizer.Token) -> tokenizer.Pos { return pos; } -default_parser :: proc() -> Parser { +default_parser :: proc(flags := Flags{}) -> Parser { return Parser { + flags = flags, err = default_error_handler, warn = default_warning_handler, }; @@ -132,7 +140,7 @@ parse_file :: proc(p: ^Parser, file: ^ast.File) -> bool { p.line_comment = nil; } - if p.optional_semicolons { + if .Optional_Semicolons in p.flags { p.tok.flags += {.Insert_Semicolon}; } @@ -409,7 +417,7 @@ is_semicolon_optional_for_node :: proc(p: ^Parser, node: ^ast.Node) -> bool { return false; } - if p.optional_semicolons { + if .Optional_Semicolons in p.flags { return true; } @@ -453,7 +461,7 @@ is_semicolon_optional_for_node :: proc(p: ^Parser, node: ^ast.Node) -> bool { } expect_semicolon_newline_error :: proc(p: ^Parser, token: tokenizer.Token, s: ^ast.Node) { - if !p.optional_semicolons && .Insert_Semicolon in p.tok.flags && token.text == "\n" { + if .Optional_Semicolons not_in p.flags && .Insert_Semicolon in p.tok.flags && token.text == "\n" { #partial switch token.kind { case .Close_Brace: case .Close_Paren: