From 3bb32d6a673246cbbf650b2c0e38d0f2fdcb7707 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Domas=20Tama=C5=A1auskas?= Date: Sun, 19 Jul 2026 22:02:51 +0300 Subject: [PATCH] Handle whitespace --- tests/token.odin | 4 ++++ token/parser.odin | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/tests/token.odin b/tests/token.odin index d487005..736e639 100644 --- a/tests/token.odin +++ b/tests/token.odin @@ -14,6 +14,10 @@ single_token :: proc(t: ^testing.T) { {source = "~", token = {type = .Illegal, literal = "~"}}, {source = "x", token = {type = .Identifier, literal = "x"}}, {source = "0", token = {type = .Integer, literal = "0"}}, + {source = " 1", token = {type = .Integer, literal = "1"}}, + {source = "\n2", token = {type = .Integer, literal = "2"}}, + {source = "\r3", token = {type = .Integer, literal = "3"}}, + {source = "\t4", token = {type = .Integer, literal = "4"}}, {source = "=", token = {type = .Assignment}}, {source = "+", token = {type = .Plus}}, {source = "(", token = {type = .LeftParenthesis}}, diff --git a/token/parser.odin b/token/parser.odin index 319d5a6..3042391 100644 --- a/token/parser.odin +++ b/token/parser.odin @@ -33,6 +33,10 @@ read_number :: proc(p: ^Parser) -> string { return p.input[left:p.left] } +read_whitespace :: proc(p: ^Parser) { + for is_whitespace(p.value) do read_symbol(p) +} + next :: proc(p: ^Parser, allocator := context.allocator) -> (token: Token, ok: bool) { read_symbol(p) or_return @@ -55,6 +59,8 @@ next :: proc(p: ^Parser, allocator := context.allocator) -> (token: Token, ok: b return {type = .Semicolon}, true } + read_whitespace(p) + if is_digit(p.value) do return {type = .Integer, literal = read_number(p)}, true if is_letter(p.value) { @@ -84,6 +90,15 @@ is_letter :: proc(symbol: u8) -> bool { return false } +is_whitespace :: proc(symbol: u8) -> bool { + switch symbol { + case ' ', '\n', '\r', '\t': + return true + } + + return false +} + symbol_to_string :: proc(symbol: u8, allocator := context.allocator) -> string { str := [1]u8{symbol} // fixed size forces stack allocation and thus a copy return strings.clone(string(str[:]), allocator) -- 2.51.2