From 6a14e5e0683a24c0fe2e6fc826fa04d9b109bc70 Mon Sep 17 00:00:00 2001 From: George Potoshin Date: Thu, 30 Jul 2026 19:24:36 +0200 Subject: [PATCH] #7153 --- core/text/scanner/scanner.odin | 7 ++++++- .../text/scanner/test_core_text_scanner.odin | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 tests/core/text/scanner/test_core_text_scanner.odin diff --git a/core/text/scanner/scanner.odin b/core/text/scanner/scanner.odin index 9445df58c..77e3a1b84 100644 --- a/core/text/scanner/scanner.odin +++ b/core/text/scanner/scanner.odin @@ -377,8 +377,13 @@ scan_number :: proc(s: ^Scanner, ch: rune, seen_dot: bool) -> (rune, rune) { ch, ds = digits(s, ch, base, &invalid) digsep |= ds if ch == '.' && .Scan_Floats in s.flags { + prev_s := s^ ch = advance(s) - seen_dot = true + if ch == '.' { + s^ = prev_s + } else { + seen_dot = true + } } } diff --git a/tests/core/text/scanner/test_core_text_scanner.odin b/tests/core/text/scanner/test_core_text_scanner.odin new file mode 100644 index 000000000..320eb86b7 --- /dev/null +++ b/tests/core/text/scanner/test_core_text_scanner.odin @@ -0,0 +1,18 @@ +package test_core_text_scanner + +import "core:testing" +import s "core:text/scanner" + +@test +range_operator :: proc(t: ^testing.T) { + data := "0x00..=0xff" + h: s.Scanner + s.init(&h, data, "string") + h.flags = s.Odin_Like_Tokens - {.Skip_Comments} + testing.expect(t, s.Int == s.scan(&h), "token should be Int") + testing.expect(t, '.' == s.scan(&h), "token should be '.'") + testing.expect(t, '.' == s.scan(&h), "token should be '.'") + testing.expect(t, '=' == s.scan(&h), "token should be '='") + testing.expect(t, s.Int == s.scan(&h), "token should be Int") + testing.expect(t, s.EOF == s.scan(&h), "token should be EOF") +}