From db8756a1d5573da5814db5ea9e39e6b0c83add26 Mon Sep 17 00:00:00 2001 From: Fernando Araoz Date: Sun, 26 Jan 2025 21:12:58 -0500 Subject: [PATCH] fix: dont throw an error on a single 0 --- CHANGELOG.md | 4 ++-- src/01_lexic/number.zig | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70af27c..376517d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,10 @@ # Typed Hypertext Preprocessor -The latest rewrite of the THP programming language. +The latest & greatest rewrite of the THP programming language. Now in Zig! ## TODO -- [ ] Rewrite lexer - [ ] Rewrite parser - [ ] Rewrite semantic analyzer - [ ] Rewrite type checker @@ -37,4 +36,5 @@ Now in Zig! - [x] Parse minimal module - [x] Recover errors & generate error messages for the lexer - [x] Serialize lex errors/tokens into JSON +- [x] Rewrite lexer diff --git a/src/01_lexic/number.zig b/src/01_lexic/number.zig index 1267612..572ba48 100644 --- a/src/01_lexic/number.zig +++ b/src/01_lexic/number.zig @@ -123,8 +123,10 @@ fn integer( // if we hit eof, return the current integer if (last_pos >= cap) { - // leading zero on an integer, throw an error - if (first_char == '0') { + // if there is a leading zero, two possibilities: + // - a number with a leading zero. throw an error + // - a single zero. valid + if (first_char == '0' and last_pos > start + 1) { try err.init("Leading zero", start, start + 1, alloc); try err.add_label("This decimal number has a leading zero.", start, last_pos); err.set_help("If you want an octal number use '0o', otherwise remove the leading zero"); @@ -298,6 +300,19 @@ test "int lexer 3" { } } +test "int lexer 4: should lex a single zero" { + const input = "0"; + var err: errors.ErrorData = undefined; + const result = try integer(input, input.len, 0, &err, std.heap.page_allocator); + + if (result) |tuple| { + const r = tuple[0]; + try std.testing.expectEqualStrings("0", r.value); + } else { + try std.testing.expect(false); + } +} + test "should return null if not an integer" { const input = "prosor prosor"; const result = try integer(input, input.len, 0, undefined, std.heap.page_allocator);