From 01de7d878244b27a3a084b432b32abbe07fccdc9 Mon Sep 17 00:00:00 2001 From: Fernando Araoz Date: Sun, 9 Feb 2025 20:36:04 -0500 Subject: [PATCH] fix: single zero integer on lexer --- src/01_lexic/number.zig | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/01_lexic/number.zig b/src/01_lexic/number.zig index 8d315d9..ac15046 100644 --- a/src/01_lexic/number.zig +++ b/src/01_lexic/number.zig @@ -152,7 +152,10 @@ fn integer( // otherwise return the current integer else => { // leading zero on an integer, throw an error - if (first_char == '0') { + // check if the zero is the only character. + // if there's a single zero, and another token, this may be an + // integer 0, like: `[0,1,2]` + if (first_char == '0' and last_pos > start + 1) { var err = try ctx.create_and_append_error("Leading zero", start, start + 1); try err.add_label(ctx.create_error_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"); @@ -316,6 +319,20 @@ test "int lexer 4: should lex a single zero" { } } +test "int lexer 5: should lex a single zero with trailing characters" { + var ctx = context.CompilerContext.init(std.testing.allocator); + defer ctx.deinit(); + const input = "0,"; + const result = try integer(input, input.len, 0, &ctx); + + 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" { var ctx = context.CompilerContext.init(std.testing.allocator); defer ctx.deinit();